滑動(dòng)濾波
滑動(dòng)平均值濾波:先在建立一個(gè)數(shù)據(jù)緩沖區(qū),依順序存放N個(gè)采樣數(shù)據(jù),每采進(jìn)一個(gè)新數(shù)據(jù),就將最早采集的那個(gè)數(shù)據(jù)丟掉,而后求包括新數(shù)據(jù)在內(nèi)的N個(gè)數(shù)據(jù)的算術(shù)平均值或加權(quán)平均值。這樣每進(jìn)行一次采樣,就可計(jì)算出一個(gè)新的平均值,從而加快了數(shù)據(jù)處理的速度。
例如:有數(shù)據(jù)集合A:
150 175 187 183 170 159 163 182 208 227
230 219 204 198 208 231 253 262 255 238
223 223 238 259 274 272 255 235 223 228
245 262 265 252 229 209 203 213 229 238
230 209 183 168 168 181 193 194 177 151
128 120 127 141 149 141 118 93 77 78
91 105 106 92 68 47 42 52 70 81
77 58 37 26 32 50 69 76 66 48
33 33 49 73 89 91 78 62 57 68
91 115 127 122 108 97 101 121 148 167
172 161 148 144 156 181 205 217 213 198
187 190 208 233 251 253 240 223 216 224
245 265 273 264 245 228 226 239 258 271
267 248 226 213 216 231 246 248 233 209
187 180 188 203 211 203 180 154 138 138
150 162 162 146 120 97 89 97 112 120
113 91 67 52 54 69 84 87 74 52
33 29 42 61 74 72 55 36 27 35
55 76 84 77 60 47 49 67 92 110
113 102 87 83 95 119 144 156 152 139
128 133 152 179 199 203 192 178 173 185
209 232 243 238 222 209 211 227 251 267
267 252 234 224 231 250 268 274 263 242
223 219 230 248 258 253 232 208 194 195
209 222 223 207 182 159 151 159 173 180
172 149 123 106 107 119 132 132 117 91
70 62 71 87 97 91 71 48 35 38
55 72 77 65 45 28 26 41 62 77
77 62 45 38 47 69 92 102 96 81
70 73 92 118 137 141 130 117 113 125 150

設(shè)滑動(dòng)濾波的長度為8,即數(shù)據(jù)緩沖長度為8, ?編寫滑動(dòng)濾波函數(shù)如下:
#define AVG_FILTER_PTS ?(8)
void filter(short *src, short*outData, int len)
{
????static short s_avg_filter[AVG_FILTER_PTS] = { 0 };
????static int s_avg_count = 0;
????int avg_sum = 0;
????for (int i = 0; i < len; i++)
????{
????????avg_sum = 0;
????????for (size_t k = AVG_FILTER_PTS - 1; k > 0; k--)
????????{
????????????s_avg_filter[k] = s_avg_filter[k - 1];
????????????avg_sum += s_avg_filter[k];
????????}
????????s_avg_filter[0] = src[i];
????????avg_sum += s_avg_filter[0];
????????if (s_avg_count < AVG_FILTER_PTS)
????????{
????????????s_avg_count++;
????????????outData[i] = s_avg_filter[0];
????????}
????????else
????????{
????????????short ret = (short)(1.0*avg_sum / AVG_FILTER_PTS);
????????????outData[i] = ret;
????????}
????}
}
數(shù)據(jù)集合A經(jīng)過filter 濾波之后:

在windows端測(cè)試代碼如下:
https://gitee.com/zcxqf/slidingfiltering
其數(shù)據(jù)波形如下:

修改滑動(dòng)濾波的長度可以得到更加平滑的曲線,但在實(shí)際應(yīng)用中,如音頻處理,滑動(dòng)濾波會(huì)濾除音頻中的部分頻率(大部分是高頻成分,具體頻率范圍會(huì)隨著滑動(dòng)濾波的長度改變),總聲壓級(jí)會(huì)降低(降低的聲壓級(jí)隨著滑動(dòng)濾波的長度增大)。
例如:


如上圖所示,濾波后,聲音的高頻音色成分被濾除,總音量有所降低。