zoukankan      html  css  js  c++  java
  • 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;
        }
    View Code

    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
    View Code

    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)
    View Code

    来看一下两个音频图像的差异,一些噪声通过滑动平均滤波被消除。听起来效果不一样。

    第一张是处理之前的音频。第二张是通过滤波器处理之后的音频。窗口大小可以自定义设计。但是也要适当的调整,如果太大,则会出现过拟合的效果。可以自行尝试将N窗口大小取两个极端值,一个取比较大的值,一个取比较小的值,则会发现这里的区别。

    当然还可以使用MATLAB自带的smooth函数解决。补全代码:

    out_y = smooth(T1,6,'moving');  
    sound(out_y,Fs);
    figure; 
    plot(out_y);  
    View Code
  • 相关阅读:
    hdu1003 最大连续子序和
    ACM 线性规划
    ACM 概率&&动态规划
    ACM 数论 质因数分解
    ACM 计数
    ACM 概率
    ACM矩形嵌套问题LIS
    ACM 编辑距离
    ACM线性方程
    ACM 错排
  • 原文地址:https://www.cnblogs.com/hequnwang/p/13700368.html
Copyright © 2011-2022 走看看