滑动滤波
滑动平均值滤波:先在建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值或加权平均值。这样每进行一次采样,就可计算出一个新的平均值,从而加快了数据处理的速度。
例如:有数据集合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

设滑动滤波的长度为8,即数据缓冲长度为8, 编写滑动滤波函数如下:
#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;
}
}
}
数据集合A经过filter 滤波之后:

在windows端测试代码如下:
https://gitee.com/zcxqf/slidingfiltering
其数据波形如下:

修改滑动滤波的长度可以得到更加平滑的曲线,但在实际应用中,如音频处理,滑动滤波会滤除音频中的部分频率(大部分是高频成分,具体频率范围会随着滑动滤波的长度改变),总声压级会降低(降低的声压级随着滑动滤波的长度增大)。
例如:


如上图所示,滤波后,声音的高频音色成分被滤除,总音量有所降低。