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 设计函数(包括 fir1、firpm 和 firls)都能够设计具有指定阶数的低通滤波器。在 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。
最小阶设计
另一个用于最优等波纹滤波器的设计函数是 firgr。firgr 可以设计满足通带/阻带波纹约束以及指定过渡带宽度的、具有最小可能滤波器阶数的滤波器。例如,如果将阻带边缘频率指定为 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.FIRFilter。dsp.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 是一种替代方案,它可替代将 firceqrip 和 firgr 与 dsp.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.VariableBandwidthFIRFilter 和 dsp.VariableBandwidthIIRFilter 可用于此类情况。