主要内容

移动平均滤波器与 FIR 滤波器有何不同?

移动平均滤波器是常规 FIR 滤波器的特例。两种滤波器都具有有限冲激响应。移动平均滤波器使用一系列经过缩放的 1 作为系数,而 FIR 滤波器系数是基于滤波器设定设计的。它们通常不是由 1 组成的序列。

流数据的移动平均值是使用有限滑动窗计算的:

movAvg=x[n]+x[n1]+...+x[nN]N+1

N +1 是滤波器的长度。该算法是常规 FIR 滤波器的特例,其系数向量为 [b0, b1, ..., bN]。

FIROutput=b0x[n]+b1x[n1]+...+bNx[nN]

为了计算输出,常规 FIR 滤波器将每个数据采样与来自 [b0, b1, ..., bN] 向量的系数相乘并累加结果。移动平均滤波器不使用任何乘数。该算法累加所有数据采样,并将结果乘以 1 / filterLength

移动平均滤波器和 FIR 滤波器的频率响应

比较移动平均滤波器与常规 FIR 滤波器的频率响应。将常规 FIR 滤波器的系数设置为一系列经过缩放的 1。缩放因子为 1/|filterLength|。

创建一个 dsp.FIRFilter System object™ 并将其系数设置为 1/40。为了计算移动平均值,创建一个滑动窗长度为 40 的 dsp.MovingAverage System object。两个滤波器具有相同的系数。输入是均值为 0、标准差为 1 的高斯白噪声。

filter = dsp.FIRFilter(Numerator=ones(1,40)/40);
mvgAvg = dsp.MovingAverage(40);
input = randn(1024,1);
filterOutput = filter(input);
mvgAvgOutput = mvgAvg(input);

可视化两个滤波器的频率响应。频率响应精确匹配,这证明移动平均滤波器是 FIR 滤波器的特例。

filterAnalyzer(filterOutput,1,mvgAvgOutput,1,...
    FilterNames=["FIRFilter","MovingAverageFilter"]);

为了进行比较,查看不含噪的滤波器的频率响应。

filterAnalyzer(filter);

将该滤波器的频率响应与理想滤波器的频率响应进行比较。您可以看到通带中的主瓣不平坦,阻带中的波纹无约束。移动平均滤波器的频率响应与理想滤波器的频率响应不匹配。

为了实现理想 FIR 滤波器,将滤波器系数更改为并非由一系列经过缩放的 1 组成的向量。滤波器的频率响应发生变化,并且趋于更接近理想滤波器的响应。

基于预定义的滤波器设定设计滤波器系数。例如,设计一个等波纹 FIR 滤波器,其归一化截止频率为 0.1、通带波纹为 0.5、阻带衰减为 40 dB。使用 fdesign.lowpass 定义滤波器设定,使用 design 方法设计滤波器。

FIReq = fdesign.lowpass('N,Fc,Ap,Ast',40,0.1,0.5,40);
filterCoeff = design(FIReq,'equiripple',SystemObject=true);
filterAnalyzer(filterCoeff)

滤波器在通带中的响应几乎是平坦的(类似于理想响应),并且阻带具有约束等波纹。

另请参阅

主题