主要内容

MATLAB 中的低通滤波器设计

此示例说明如何设计低通滤波器。该示例重点介绍 DSP System Toolbox™ 中最常用的一些命令行工具。有关更多设计选项,请参阅Design Lowpass FIR Filters

简介

设计低通滤波器时,您首先要选择是设计 FIR 滤波器还是 IIR 滤波器。当线性相位响应很重要时,您通常需要选择 FIR 滤波器。FIR 滤波器也往往是定点实现的首选,因为它们通常对量化效应更稳健。FIR 滤波器也用于许多高速实现(如 FPGA 或 ASIC),因为它们适合流水线。IIR 滤波器(特别是双二阶滤波器)用于无需考虑相位线性的应用(如音频信号处理)中。IIR 滤波器通常在计算上更高效,因为与 FIR 滤波器相比,它们可以用更少的系数满足设计设定。IIR 滤波器也往往具有更短的瞬态响应和更小的群延迟。不过,使用最小相位和多速率设计可以得到在群延迟和计算效率方面与 IIR 滤波器相当的 FIR 滤波器。

FIR 低通设计 - 指定滤波器阶数

在许多实际情况下,您必须指定滤波器阶数。其中一种情况是您的目标硬件已将滤波器阶数限制为特定数值。另一种常见情况是,当您为实现计算出可用的计算预算 (MIPS) 时,该预售只允许使用有限的滤波器阶数。Signal Processing Toolbox 中的 FIR 设计函数(包括 fir1firpmfirls)都能够设计具有指定阶数的低通滤波器。在 DSP System Toolbox 中,用于具有指定阶数的低通 FIR 滤波器设计的首选函数是 firceqrip。此函数设计具有指定通带/阻带波纹值和指定通带边缘频率的最优等波纹低通/高通 FIR 滤波器。阻带边缘频率是在设计过程中确定的。

为以 48 kHz 采样的数据设计一个低通 FIR 滤波器。通带边缘频率为 8 kHz。通带波纹为 0.01 dB,阻带衰减为 80 dB。将滤波器阶数约束为 120。

N = 120;        
Fs = 48e3;      
Fp = 8e3;       
Ap = 0.01;      
Ast = 80;

获得通带和阻带波纹在线性单位下的最大偏差。

Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1); 
Rst = 10^(-Ast/20);

使用 firceqrip 设计滤波器并查看幅值频率响应。

NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],"passedge");
hFiltAnalyzer = filterAnalyzer(NUM,SampleRates=Fs,FilterNames="Num_120")

hFiltAnalyzer = 
  filterAnalyzer with no properties.

得到的阻带边缘频率约为 9.64 kHz。

最小阶设计

另一个用于最优等波纹滤波器的设计函数是 firgrfirgr 可以设计满足通带/阻带波纹约束以及指定过渡带宽度的、具有最小可能滤波器阶数的滤波器。例如,如果将阻带边缘频率指定为 10 kHz,则得到阶数为 100 的滤波器,而不是使用 firceqrip 设计的 120 阶滤波器。过渡带越宽,得到的滤波器阶数越小。

将阻带边缘频率指定为 10 kHz。获得通带波纹为 0.01 dB、阻带衰减为 80 dB 的最小阶 FIR 滤波器。

Fst = 10e3; 
NumMin = firgr("minorder",[0 Fp/(Fs/2) Fst/(Fs/2) 1],...
    [1 1 0 0],[Rp,Rst]);

绘制使用 firgr 获得的最小阶 FIR 滤波器与使用 firceqrip 设计的 120 阶滤波器的幅值频率响应。最小阶设计会生成阶数为 100 的滤波器。120 阶滤波器的过渡区域比 100 阶滤波器的过渡区域更窄,这与预期相符。

hFiltAnalyzer.addFilters(NumMin,FilterNames="Num_minorder");
hFiltAnalyzer.setLegendStrings(["N = 120" "N = 100"]);

对数据进行滤波

要对数据应用滤波器,您可以使用 filter 命令,也可以使用 dsp.FIRFilterdsp.FIRFilter 的优点是在循环中执行时可以管理状态。dsp.FIRFilter 还具有定点功能,并支持 C 代码生成、HDL 代码生成以及针对 ARM® Cortex® M 和 ARM Cortex A 的优化代码生成。

使用 120 阶 FIR 低通滤波器,以包含 256 个采样的帧为单位,对持续 10 秒的具有零均值、单位标准差的白噪声进行滤波。在频谱分析仪上查看结果。

LP_FIR = dsp.FIRFilter(Numerator=NUM);
SA_FIR = spectrumAnalyzer(SampleRate=Fs,PlotAsTwoSidedSpectrum=false);
tic
while toc < 10
    x = randn(256,1);   
    y = LP_FIR(x); 
    step(SA_FIR,y);         
end
release(SA_FIR)

使用 dsp.LowpassFilter

dsp.LowpassFilter 是一种替代方案,它可替代将 firceqripfirgrdsp.FIRFilter 结合使用。基本上,dsp.LowpassFilter 将两步过程合并为一步。dsp.LowpassFilter 在定点支持、C 代码生成支持、HDL 代码生成支持和 ARM Cortex 代码生成支持方面提供与 dsp.FIRFilter 相同的优势。

为以 48 kHz 采样的数据设计一个低通 FIR 滤波器。通带边缘频率为 8 kHz。通带波纹为 0.01 dB,阻带衰减为 80 dB。将滤波器阶数约束为 120。根据您的设定创建一个 dsp.FIRFilter

LP_FIR = dsp.LowpassFilter(SampleRate=Fs,...
    DesignForMinimumOrder=false,FilterOrder=N,...
    PassbandFrequency=Fp,...
    PassbandRipple=Ap,StopbandAttenuation=Ast);

LP_FIR 中的系数与 NUM 中的系数相同。

NUM_LP = tf(LP_FIR);

您可以直接使用 LP_FIR 对数据进行滤波,如前面的示例所示。您也可以使用 filterAnalyzer 分析滤波器,或使用 measure 测量响应。

hFiltAnalyzer.addDisplays(1);
hFiltAnalyzer.addFilters(LP_FIR);

measure(LP_FIR)
ans = 
Sample Rate      : 48 kHz    
Passband Edge    : 8 kHz     
3-dB Point       : 8.5843 kHz
6-dB Point       : 8.7553 kHz
Stopband Edge    : 9.64 kHz  
Passband Ripple  : 0.01 dB   
Stopband Atten.  : 79.9981 dB
Transition Width : 1.64 kHz  
 

使用 dsp.LowpassFilter 的最小阶设计

您可以使用 dsp.LowpassFilter 设计最小阶滤波器,并使用 measure 验证设计是否符合预设的设定。滤波器的阶数同样为 100。

LP_FIR_minOrd = dsp.LowpassFilter(SampleRate=Fs,...
    DesignForMinimumOrder=true,...
    PassbandFrequency=Fp,...
    StopbandFrequency=Fst,...
    PassbandRipple=Ap,...
    StopbandAttenuation=Ast);
measure(LP_FIR_minOrd)
ans = 
Sample Rate      : 48 kHz      
Passband Edge    : 8 kHz       
3-dB Point       : 8.7117 kHz  
6-dB Point       : 8.9199 kHz  
Stopband Edge    : 10 kHz      
Passband Ripple  : 0.0099997 dB
Stopband Atten.  : 80 dB       
Transition Width : 2 kHz       
 
Nlp = order(LP_FIR_minOrd)
Nlp = 
100

设计 IIR 滤波器

椭圆滤波器是与最优等波纹 FIR 滤波器对应的 IIR 滤波器。因此,您可以使用相同的设定来设计椭圆滤波器。您为 IIR 滤波器获得的滤波器阶数远小于对应 FIR 滤波器的阶数。

设计一个椭圆滤波器,其采样频率、截止频率、通带波纹约束和阻带衰减与 120 阶 FIR 滤波器相同。将椭圆滤波器的滤波器阶数降低到 10。

N = 10;
LP_IIR = dsp.LowpassFilter(SampleRate=Fs,...
    FilterType="IIR",...
    DesignForMinimumOrder=false,...
    FilterOrder=N,...
    PassbandFrequency=Fp,...
    PassbandRipple=Ap,...
    StopbandAttenuation=Ast);

比较 FIR 和 IIR 设计。计算两种实现的成本。

hFiltAnalyzer.addFilters(LP_IIR);
hFiltAnalyzer.setLegendStrings(["FIR Equiripple, N = 120" "IIR Elliptic, N = 10"])

cost_FIR = cost(LP_FIR)
cost_FIR = struct with fields:
                  NumCoefficients: 121
                        NumStates: 120
    MultiplicationsPerInputSample: 121
          AdditionsPerInputSample: 120

cost_IIR = cost(LP_IIR)
cost_IIR = struct with fields:
                  NumCoefficients: 25
                        NumStates: 20
    MultiplicationsPerInputSample: 25
          AdditionsPerInputSample: 20

FIR 和 IIR 滤波器具有相似的幅值响应。IIR 滤波器的成本约为 FIR 滤波器成本的 1/6。

运行 IIR 滤波器

IIR 滤波器设计为双二阶滤波器。要对数据应用滤波器,请使用与 FIR 情形下相同的命令。

使用 10 阶 IIR 低通滤波器,以包含 256 个采样的帧为单位,对持续 10 秒的具有零均值、单位标准差的高斯白噪声进行滤波。在频谱分析仪上查看结果。

SA_IIR = spectrumAnalyzer(SampleRate=Fs,PlotAsTwoSidedSpectrum=false);
tic
while toc < 10
    x = randn(256,1);   
    y = LP_IIR(x); 
    SA_IIR(y);         
end
release(SA_IIR)

可变带宽 FIR 和 IIR 滤波器

您也可以设计允许在运行时更改截止频率的滤波器。dsp.VariableBandwidthFIRFilterdsp.VariableBandwidthIIRFilter 可用于此类情况。

另请参阅

主题