主要内容

设计低通FIR滤波器

这个例子展示了如何设计低通FIR滤波器。这里提出的许多概念可以扩展到其他响应,如高通,带通等。

FIR滤波器由于其强大的设计算法而被广泛使用,它们以非递归形式实现时的固有稳定性,可以轻松获得线性相位,其简单的可扩展性到多速率情况,以及为它们提供的充足的硬件支持等原因。金宝app这个例子展示了DSP系统工具箱™中用于设计具有各种特性的低通FIR滤波器的功能。

获得低通FIR滤波器系数

MATLAB低通滤波器设计提供了DSP系统工具箱设计低通滤波器的概述。综上所述,给出了两个函数,它们返回FIR滤波器系数的向量:firceqrip而且firgr.的firceqrip当过滤器顺序(相当于过滤器长度)已知且固定时使用。

N = 100;% FIR滤波器顺序Fp = 20e3;% 20 kHz通带边缘频率Fs = 96e3;% 96千赫采样频率Rp = 0.00057565;%对应0.01 dB的峰间纹波Rst = 1e-4;%对应80db阻带衰减eqnum = firceqrip(N,Fp/(Fs/2),[Rp Rst],“passedge”);% eqnum = vec of coeffsfvtool (eqnum“Fs”Fs)%可视化过滤器

{

选择100的过滤器顺序是任意的。一般来说,更大的阶数会导致更接近理想的结果,但代价是更昂贵的实现。加倍的顺序大致减少一半的滤波器的过渡宽度(假设所有其他参数保持不变)。

N2 = 200;将滤镜顺序从100改为200eqNum200 = firceqrip(N2,Fp/(Fs/2),[Rp Rst],“passedge”);fvt = fvtool(eqnum,1,eqNum200,1,“Fs”Fs);传奇(fvt"FIR滤波器,order = "+ (N N2))

{

最小阶低通滤波器设计

我们没有指定过滤顺序,firgr可用于确定满足设计规格所需的最小订货量。为了做到这一点,必须指定过渡区域的宽度。这是通过设置阻带边缘频率来实现的。

Fst = 23e3;%过渡宽度= Fst - FpnumMinOrder = firgr(“minorder”,[0,Fp/(Fs/2),Fst/(Fs/2),1],[1 1 0 0],,...(Rp Rst));fvt = fvtool(eqnum,1,eqNum200,1,numMinOrder,1,“Fs”Fs);传奇(fvt"FIR滤波器,order = "+[N N2 numMinOrder])

{

也可以通过函数设计最小偶阶('mineven')或最小奇阶('minodd')的过滤器firgr函数。

实现低通FIR滤波器

一旦得到了滤波器系数,就可以用dsp。FIRFilter.它支持双精金宝app度/单精度浮点数据以及定点数据。它还支持C和HD金宝appL代码生成以及ARM®Cortex®M和ARM Cortex A的优化代码生成。

lowpassFIR = dsp。FIRFilter (“分子”, eqnum);%或eqNum200或numMinOrderfvtool (lowpassFIR“Fs”Fs)

{

为了执行实际的过滤,可以像函数一样直接调用FIR。下面的代码过滤了高斯白噪声,并在频谱分析仪中显示了10秒的过滤后的信号。

范围=光谱分析仪(“SampleRate”Fs,“AveragingMethod”“指数”“ForgettingFactor”, 0.5);显示(范围);抽搐Toc < 10 x = randn(256,1);y = lowpassFIR(x);范围(y);结束

滤波器的一步设计与实现

为方便起见,该滤波器的设计和实现可以在一个步骤中完成dsp。LowpassFilter.它还支持浮点、定点、金宝appC代码生成以及ARM Cortex M和ARM Cortex A优化。

lowpassFilt = dsp。LowpassFilter (“DesignForMinimumOrder”假的,...“FilterOrder”N“PassbandFrequency”《外交政策》,“SampleRate”Fs,...“PassbandRipple”, 0.01,“StopbandAttenuation”, 80);抽搐Toc < 10 x = randn(256,1);y = lowpassFilt(x);范围(y);结束

注意,为了方便起见,规格直接使用dB值输入。通过选择FVTool中的“View”菜单,然后选择“passband”,可以检查通带纹波。dsp。LowpassFilter也可用于IIR(双quad)设计。

fvtool (lowpassFilt“Fs”Fs)

{

获取滤波器系数

滤波器系数可以从dsp。LowpassFilter通过使用特遣部队函数。

eqnum = tf(lowpassFilt);

可调低通FIR滤波器

在低通FIR滤波器中,截止频率可以在运行时调整,可以使用'dsp。VariableBandwidthFIRFilter的对象。这些滤波器不提供对滤波器响应特性相同粒度的控制,但它们允许动态频率响应。

vbwFilter = dsp。VariableBandwidthFIRFilter (“CutoffFrequency”1 e3);Tic told = 0;Toc < 10 t = Toc;如果楼层(t) >告诉每秒钟增加1 kHzvbwFilter。CutoffFrequency = vbwFilter。CutoffFrequency + 1e3;结束X = randn(256,1);y = vbwFilter(x);范围(y);Told = floor(t);结束

高级设计选项:最佳非等纹波低通滤波器

到目前为止,所有的设计都是最优等纹波设计。均匀纹波设计通过均匀分布与理想响应的偏差来实现最优。这样做的好处是使最大偏差(纹波)最小化。然而,以能量衡量的总体偏差往往很大。这可能并不总是可取的。当低通滤波信号时,这意味着信号在阻带中的剩余能量可能比较大。当考虑到这一点时,最小二乘方法提供了使阻带能量最小化的优化设计。fdesign.lowpass可用于设计最小二乘和其他类型的低通滤波器。下面的代码比较了具有相同滤波器阶数和过渡宽度的最小二乘FIR设计和FIR等纹波设计:

lowpassSpec = fdesign.lowpass(“N, Fp,置”《外交政策》,133年,置,Fs);lsFIR =设计(lowpassSpec,“firls”“SystemObject”,真正的);LP_MIN = dsp。FIRFilter (“分子”, numMinOrder);fvt = fvtool(LP_MIN,lsFIR,“Fs”Fs);传奇(fvt“Equiripple设计”“最小二乘设计”

{

请注意,在最小二乘设计中,阻带中的衰减是如何随着频率的增加而增加的,而在等纹波设计中,它保持不变。在最小二乘情况下增加的衰减使要滤波的信号频带中的能量最小化。

增加阻带衰减的等纹波设计

最小二乘设计的一个通常不受欢迎的影响是,在通带边缘附近的通带区域的纹波往往很大。一般来说,对于低通滤波器,希望被滤波信号的通带频率受到尽可能小的影响。在这种情况下,等纹波通带通常是可取的。如果仍然需要在阻带中增加衰减,则等纹波设计选项提供了实现这一目标的方法。

FIR_eqrip_slope = design(lowpassSpec,“equiripple”“StopbandShape”“1 / f”...“StopbandDecay”4“SystemObject”,真正的);fvt = fvtool(lsFIR,FIR_eqrip_slope,“Fs”Fs);传奇(fvt“最小二乘设计”...阻带衰减为(1/f)^4的等纹波设计

{

注意,止水带非常相似。然而,等纹波设计在通带边缘频率20 kHz附近的通带纹波明显较小:

mls =测量(lsFIR);meq = measure(FIR_eqrip_slope);美国职业足球大联盟。apas
Ans = 0.0121
微地震。apas
Ans = 0.0046

还有一种可能是使用任意的幅度规格并选择两个频带(一个为通带,一个为阻带)。然后,通过对第二个波段使用权重,可以增加整个波段的衰减。有关此和其他任意震级设计的更多信息,请参阅任意幅度滤波器设计

B = 2;%条带数F = [0 Fp linspace(Fst,Fs/2,40)];A =[1 1 0(1,长度(F)-2)];W = linspace(1100,长度(F)-2);lowpassArbSpec = fdesign.arbmag(”N, B, F,“, N, B, F (1:2), (1:2), F(3:结束),...(3:结束),Fs);lpfilter =设计(lowpassArbSpec,“equiripple”“B2Weights”W,...“SystemObject”,真正的);fvtool (lpfilter“Fs”Fs);

{

最小相位低通滤波器设计

到目前为止,我们只考虑了线性相位设计。线性相位在许多应用中是可取的。然而,如果线性相位不是必需的,最小相位设计可以比线性相位设计提供显著的改进。然而,最小相位设计并不总是具有数值鲁棒性。总是用FVTool检查设计。

作为最小相位设计优点的一个例子,考虑线性相位设计与满足相同设计规范的最小相位设计的比较:

Fp = 20e3;Fst = 22e3;Fs = 96e3;Ap = 0.06;Ast = 80;lowpassSpec = fdesign.lowpass(“Fp,置,美联社,Ast”Fp,置,美联社,Ast, Fs);linphaseSpec =设计(lowpassSpec,“equiripple”“SystemObject”,真正的);eqripSpec =设计(lowpassSpec,“equiripple”“minphase”,真的,...“SystemObject”,真正的);fvt = fvtool(linphaseSpec,eqripSpec,“Fs”Fs);传奇(fvt...“线性相位等纹波设计”...“最小相位等纹波设计”

{

请注意,系数的数量已从173减少到141。群延迟图也揭示了最小相位设计的优点。注意群延迟是如何小得多的(特别是在通带区域)。

fvt = fvtool(linphaseSpec,eqripSpec,“Fs”Fs,...“分析”“grpdelay”);传奇(fvt...“线性相位等纹波设计”...“最小相位等纹波设计”

{

基于多级技术的最小阶低通滤波器设计

另一种不涉及最小相位设计的最小化系数的方法是使用多级技术。这里我们展示了一种插值FIR (IFIR)方法。这种方法将设计问题分解为级联设计两个滤波器。对于这个例子,设计需要151个系数而不是173个。有关这方面的更多信息,请参见高效窄过渡带FIR滤波器设计

Fp = 20e3;Fst = 22e3;Fs = 96e3;Ap = 0.06;Ast = 80;lowpassSpec = fdesign.lowpass(“Fp,置,美联社,Ast”Fp,置,美联社,Ast, Fs);interpFilter =设计(lowpassSpec,“ifir”“SystemObject”,真正的);成本(interpFilter)
ans =带字段的结构:NumCoefficients: 151 NumStates: 238 MultiplicationsPerInputSample: 151 AdditionsPerInputSample: 149
fvt = fvtool(linphaseSpec,interpFilter,“Fs”Fs);传奇(fvt...“线性相位等纹波设计”...内插FIR等纹波设计(两级)

{

在这种情况下,群延迟图揭示了IFIR设计的缺点。虽然IFIR设计确实提供线性相位,但群延迟通常比可比的单级设计更大。

fvt = fvtool(linphaseSpec,interpFilter,“Fs”Fs,“分析”“grpdelay”);传奇(fvt...“线性相位等纹波设计”...内插FIR等纹波设计(两级)

{

多速率低通滤波器设计

低通滤波器广泛应用于抽取器和插补器的设计中。有关更多信息,请参见抽取器和插值器的设计.有关导致非常有效的实现的多阶段技术的更多信息,请参见多级汇率转换