文档

高效窄过渡带FIR滤波器设计

这个例子展示了如何使用多级技术设计具有非常窄过渡带的高效FIR滤波器。该技术可推广到多速率滤波器的设计中。看到分插器的多级设计举个例子。

窄过渡带宽低通滤波器的设计

使用FIR滤波器的缺点之一是,滤波器的顺序往往与滤波器的过渡带宽成反比增长。考虑以下设计规范(其中波纹以线性单位给出):

成就= 2866.5;%通带边缘Fstop = 3087;%阻带边缘apas = 0.0174;%通带纹波,峰间0.0174 dBAstop = 66.0206;%阻带纹波,最小衰减66.0206 dBFs = 44.1 e3;lowpassSpec = fdesign.lowpass (apas,成就,Fstop Astop, Fs);

满足规格的正则线性相位等纹波设计可以设计为:

eqripFilter =设计(lowpassSpec,“equiripple”“SystemObject”,真正的);成本(eqripFilter)
ans = struct与字段:NumCoefficients: 695 NumStates: 694 MultiplicationsPerInputSample: 695 AdditionsPerInputSample: 694

需要的过滤器长度是694个水龙头。

插值FIR (IFIR)设计

IFIR设计算法实现了上述规范的高效设计,因为它减少了所需乘法器的总数。为了做到这一点,设计问题被分成两个阶段,一个过滤器被上采样以达到严格的规格,而不使用许多乘数,一个过滤器删除在上采样之前的过滤器创建的图像。

interpFilter =设计(lowpassSpec,“ifir”“SystemObject”,真正的);

显然我们把事情弄得更糟了。我们现在有两个滤波器,共有804个乘法器,而不是一个有694个乘法器的滤波器。然而,对第二阶段的仔细研究表明,大约每5个乘数中只有一个是非零的。乘数的实际总数已从694减少到208。

成本(interpFilter)
ans = struct与字段:NumCoefficients: 208 NumStates: 802 MultiplicationsPerInputSample: 208 AdditionsPerInputSample: 206

让我们来比较一下两种设计的反应:

fvt = fvtool (eqripFilter interpFilter,“颜色”“白色”);传奇(fvt“Equiripple设计”“IFIR设计”“位置”“最佳”

手动控制上采样因子

在前面的例子中,我们自动确定所使用的上采样因子,使乘数总数最小化。结果表明,对于给定的规格,最佳上采样因子是5。然而,如果我们检查设计选项:

选择= designopts (lowpassSpec,“ifir”% #好吧
struct with fields: FilterStructure: 'dffir' UpsamplingFactor: 'auto' JointOptimization: 0 SystemObject: 0

我们可以看到我们可以控制上采样因子。例如,如果我们想提高4而不是5的样本:

选择。UpsamplingFactor = 4;选择。SystemObject = true;upfilter =设计(lowpassSpec,“ifir”、选择);成本(upfilter)
ans = struct与字段:NumCoefficients: 217 NumStates: 767 MultiplicationsPerInputSample: 217 AdditionsPerInputSample: 215

我们将得到一个总共有217个非零乘数的设计。

使用联合优化

可以同时设计IFIR中使用的两个滤波器。通过这样做,我们可以以更长的设计时间为代价节省大量的乘数(由于算法的性质,设计在某些情况下也可能不会完全收敛):

选择。UpsamplingFactor =“汽车”自动确定最佳因子。选择。JointOptimization = true;ifirFilter =设计(lowpassSpec,“ifir”、选择);成本(ifirFilter)
ans = struct与字段:NumCoefficients: 172 NumStates: 726 MultiplicationsPerInputSample: 172 AdditionsPerInputSample: 170

本设计的最佳上采样因子为6。非零乘数的数量现在只有152个

利用多速率/多级技术实现高效设计

到目前为止讨论的设计都采用了单速率技术。这意味着每个输入样本(MPIS)所需的乘法数等于非零乘法器的数量。例如,我们展示的最后一个设计需要152个MPIS。单级等纹波设计开始时我们需要694 MPIS。

通过使用多速率/多阶段技术结合抽取和插值,我们也可以获得高效的设计与少量的MPIS。对于decimator,每个输入样本所需的乘法次数(平均)由乘法数除以抽取因子给出。

multistageFilter =设计(lowpassSpec,“多级”“SystemObject”,真正的);成本(multistageFilter)
ans = struct with fields: NumCoefficients: 396 NumStates: 352 MultiplicationsPerInputSample: 73 AdditionsPerInputSample: 70.8333

第一级有21个乘数,抽取因子为3。因此,MPIS的个数为7。第二阶段的长度为45,累积抽取因子为6(即这一阶段的抽取因子乘以第一阶段的抽取因子;这是因为这一阶段的输入样本已经以第一阶段输入样本的1/3的速率传入)。因此,每个输入样本(参考整体多速率/多级滤波器的输入)的平均乘法次数是45/6=7.5。最后,假设第三阶段的抽取因子为1,这一阶段每个输入的平均乘法次数为130/6=21.667。三个decimator的平均MPIS总数为36.5。

对于插值器,滤波器和decimator是一样的。此外,它们的计算代价是相同的。因此,整个多速率/多级设计的MPIS总数为73。

现在我们比较一下等纹纹设计和这个设计的响应:

fvt = fvtool (eqripFilter multistageFilter,“颜色”“白色”...“NormalizeMagnitudeto1”“上”);传奇(fvt“Equiripple设计”“多重速率的/多级设计”...“位置”“东北”

注意,多级设计的阻带衰减大约是其他设计的两倍。这是因为为了避免会违反所需规格的混叠,decimator有必要将带外分量衰减到所需的66 dB。同样,插值器需要衰减图像66 dB,以满足这个问题的规格。

手动控制级数

得到的多速率/多阶段设计包括6个阶段。默认情况下,阶段数是自动确定的。然而,也可以手动控制结果的阶段数量。例如:

lp4stage =设计(lowpassSpec,“多级”“NStages”,4,“SystemObject”,真正的);成本(lp4stage)
ans = struct with fields: NumCoefficients: 516 NumStates: 402 MultiplicationsPerInputSample: 86 AdditionsPerInputSample: 84.5000

在这个案例中,MPIS的平均数量是86

群时延

我们可以计算每个设计的群延迟。注意,多速率/多级设计引入了最大的延迟(这是为计算成本较低的设计所付出的代价)。IFIR设计引入了比单级等纹波设计更多的延迟,但比多速率/多级设计更少。

fvt = fvtool (eqripFilter interpFilter multistageFilter,...“分析”“grpdelay”“颜色”“白色”);传奇(fvt“Equiripple设计”“IFIR设计”...“多重速率的/多级设计”);

滤波信号

我们现在通过实例表明,IFIR和多级/多速率设计的性能与单级等纹波设计相当,但所需的计算量要少得多。为了对级联进行过滤,有必要调用generateFilteringCode(ifirFilter)和generateFilteringCode(multistageFilter)。为了创建HelperIFIRFilter和HelperMultiFIRFilter,这里已经完成了这个操作。

= dsp范围。简介(“SpectralAverages”, 50岁,“SampleRate”Fs,...“PlotAsTwoSidedSpectrum”假的,“YLimits”-90年[10],...“ShowLegend”,真正的”,“ChannelNames”, {“Equiripple设计”...“IFIR设计”“多重速率的/多级设计”});抽搐,toc < 20运行20秒x = randn (6000 1);%滤波器使用单级FIR滤波器日元= eqripFilter (x);使用IFIR过滤器进行过滤y2 = HelperIFIRFilter (x);过滤多级/多速率FIR滤波器y3 = HelperMultiFIRFilter (x);比较两种方法的输出范围((y1, y2, y3))结束

这个话题有帮助吗?