欢迎光临散文网 会员登陆 & 注册

滑动滤波

2023-02-16 13:45 作者:惟江上之青枫  | 我要投稿

滑动平均值滤波先在立一个数据缓冲区,依顺序存放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

其数据波形如下:

滤波前后

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

例如:

64点滑动滤波前频谱
64点滑动滤波后频谱

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


滑动滤波的评论 (共 条)

分享到微博请遵守国家法律