设计低通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等纹波设计(两级))
多速率低通滤波器设计
低通滤波器广泛应用于抽取器和插补器的设计中。有关更多信息,请参见抽取器和插值器的设计.有关导致非常有效的实现的多阶段技术的更多信息,请参见多级汇率转换.