移動(dòng)平均濾波是一種簡(jiǎn)單有效的平滑信號(hào)的方法,它通過(guò)計(jì)算一系列數(shù)據(jù)點(diǎn)的平均值來(lái)減小信號(hào)中的波動(dòng)?;镜囊苿?dòng)平均濾波方法有兩種:簡(jiǎn)單移動(dòng)平均(SMA)和指數(shù)加權(quán)移動(dòng)平均(EWMA)。
簡(jiǎn)單移動(dòng)平均濾波(SMA)的原理:
簡(jiǎn)單移動(dòng)平均濾波通過(guò)計(jì)算一定窗口內(nèi)數(shù)據(jù)點(diǎn)的平均值來(lái)平滑信號(hào)。窗口的大小決定了濾波器對(duì)信號(hào)的平滑程度,窗口越大,平滑效果越明顯。對(duì)于第n個(gè)數(shù)據(jù)點(diǎn)(X_n),其簡(jiǎn)單移動(dòng)平均值(SMA_n)可以計(jì)算為:
其中,K是窗口大小。
簡(jiǎn)單移動(dòng)平均濾波的C代碼示例:以下是一個(gè)簡(jiǎn)單移動(dòng)平均濾波的C代碼示例,假設(shè)輸入數(shù)據(jù)存儲(chǔ)在數(shù)組中:
#include
#define WINDOW_SIZE 5
// 函數(shù)原型float simpleMovingAverage(float data[], int dataSize);
int main() { // 輸入數(shù)據(jù) float inputData[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; int dataSize = sizeof(inputData) / sizeof(inputData[0]);
// 計(jì)算簡(jiǎn)單移動(dòng)平均 float result = simpleMovingAverage(inputData, dataSize);
// 打印結(jié)果 printf("Simple Moving Average: %f\n", result);
return 0;}
// 計(jì)算簡(jiǎn)單移動(dòng)平均float simpleMovingAverage(float data[], int dataSize) { float sum = 0.0;
// 計(jì)算窗口內(nèi)數(shù)據(jù)的和 for (int i = 0; i < WINDOW_SIZE; ++i) { sum += data[i]; }
// 計(jì)算移動(dòng)平均值 float movingAverage = sum / WINDOW_SIZE;
// 返回結(jié)果 return movingAverage;}
在這個(gè)示例中,WINDOW_SIZE 定義了移動(dòng)平均的窗口大小,可以根據(jù)需要調(diào)整。simpleMovingAverage 函數(shù)用于計(jì)算輸入數(shù)據(jù)的簡(jiǎn)單移動(dòng)平均值。這只是一個(gè)基本的示例,實(shí)際應(yīng)用中可能需要根據(jù)具體需求進(jìn)行調(diào)整和優(yōu)化。
-
濾波
+關(guān)注
關(guān)注
10文章
662瀏覽量
56569 -
信號(hào)
+關(guān)注
關(guān)注
11文章
2773瀏覽量
76539 -
C代碼
+關(guān)注
關(guān)注
1文章
89瀏覽量
14268
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論