MATLAB滑动平均滤波器设计
滑动平均滤波就是把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样得到一个新数据放到队尾,并丢掉原来队首的一次数据,把队列中的N个数据进行平均运算,就可以获得新的滤波结果。
java代码实现:
// N点滑动平均滤波器 public static float[] MovingAverageFilter_NP(float[] InputSig){ int length = InputSig.length; float[] dbRt = new float[length]; /** N点平滑 */ dbRt[0] = InputSig[0]; for (int x = 1; x < length - 1; x++) { dbRt[x] = (InputSig[x - 1] + InputSig[x] + InputSig[x + 1]) / N; } dbRt[length - 1] = InputSig[length - 1]; return dbRt; }
MATLAB代码实现:
%N是窗口的大小 for i = 1:L m = m+1; if i+N-1 > L break else for j = i:N+i-1 k = k+1; W(k) = T(j) ; end T1(m) = mean(W); k = 0; end end
MATLAB中完整的实现加载音频,使用滑动平均滤波器来处理音频:
info = audioinfo('1.mp3'); [y,Fs] = audioread('1.mp3'); T = y; % sound(y,Fs); figure; plot(y); L = length(T); N=10; % 窗口大下 k = 0; m =0 ; for i = 1:L m = m+1; if i+N-1 > L break else for j = i:N+i-1 k = k+1; W(k) = T(j) ; end T1(m) = mean(W); k = 0; end end figure; sound(T1,Fs); plot(T1)
来看一下两个音频图像的差异,一些噪声通过滑动平均滤波被消除。听起来效果不一样。
第一张是处理之前的音频。第二张是通过滤波器处理之后的音频。窗口大小可以自定义设计。但是也要适当的调整,如果太大,则会出现过拟合的效果。可以自行尝试将N窗口大小取两个极端值,一个取比较大的值,一个取比较小的值,则会发现这里的区别。
当然还可以使用MATLAB自带的smooth函数解决。补全代码:
out_y = smooth(T1,6,'moving'); sound(out_y,Fs); figure; plot(out_y);