主要内容

FIR HAMBBAND滤波器设计

此示例显示了如何设计FIR半带滤波器。在内插/抽取两个因子时,半带滤波器广泛用于多速率信号处理应用。半带滤波器以多相形式有效地实现,因为其系数的大约一半等于零。

半带滤波器有两个重要的特性,通带和阻带波纹必须相同,通带边缘和阻带边缘频率与半带频率Fs/4(或pi/2 rad/样本归一化频率)的距离相等。

获取半带系数

Firhalfband.函数返回FIR半带等纹波滤波器的系数。作为一个简单的例子,考虑一个半带滤波器,它处理的数据采样在96 kHz和22 kHz的通频带频率。

FS = 96E3;fp = 22e3;n = 100;num = firhalfband(n,fp /(fs / 2));fvt = fvtool(num,'FS',fs,“颜色”“白色”);fvt。MagnitudeDisplay =“零”

通过缩放到响应,您可以验证通带和停车峰值峰值波纹是相同的。关于FS / 4(24 kHz)点也存在对称性。如规定的通带扩展了最多22 kHz,并且停机带以26 kHz开始。我们还可以通过查看脉冲响应来验证每个其他系数等于零。这使得过滤器非常有效地实现用于插值/抽取的因子2。

fvt。分析='冲动'

dsp.firhalfbandinterpolator.dsp。FIRHalfbandDecimator

Firhalfband.Function提供了几个其他的设计选项。然而,在大多数情况下,直接使用是更好的选择dsp.firhalfbandinterpolator.dsp。FIRHalfbandDecimator.这两个系统对象不仅设计了系数,而且还提供了多相插补/抽取器的有效实现。它们支持过金宝app滤双/单精度浮点数据以及定点数据。他们还支持C和HDL金宝app代码生成,以及优化的ARM®Cortex®M和Cortex A代码生成。

halfbandInterpolator = dsp。FIRHalfbandInterpolator (“SampleRate”,fs,...“规范”“滤镜顺序和过渡宽度”...“FilterOrder”N“TransitionWidth”, 4000);fvtool (halfbandInterpolator'FS',2 * fs,“颜色”“白色”);

为了执行插值,dsp.firhalfbandinterpolator.使用系统对象。因为这是一个多速率过滤器,所以要定义采样率的含义很重要。对于此和所有其他系统对象,采样率是指输入信号的采样率。但是,FVTool将采样率定义为过滤器运行的速率。在插值的情况下,您可以upsample然后过滤(概念上),因此由于2的上采样,因此需要指定FVTool的采样率为2 * FS。

FrameSize = 256;范围= dsp.spectrumanalyzer(“SampleRate”,2 * fs,'spectralaverages'5);sine1 = dsp.sinewave(“频率”10 e3,“SampleRate”,fs,...'samplesperframe', FrameSize);sine2 = dsp。SineWave (“频率”20 e3,“SampleRate”,fs,...'samplesperframe', FrameSize);抽搐toc <10 x = sine1()+ sine2()+ 0.01。* randn(框架,1);%96 kHz.y = halfbandinterpolator(x);% 192千赫范围(y);结尾释放(范围);

请注意,光谱副本衰减约40dB,这大致是由半带滤波器提供的衰减。补偿滤波器中的组延迟,可以绘制覆盖的输入和内插样本。请注意,输入样本在滤波器的输出时保持不变。这是因为半频段的多相分支之一是不改变输入样本的纯延迟分支。

grpDel = 50;n = 0:2:511;茎(n (1: end-grpDel / 2), x (1: end-grpDel / 2),“k”“填充”)举行ν= 0:511;茎(ν(1:end-grpDel), y (grpDel + 1:结束)传说(输入样本的“插值样本”

在抽取的情况下,在dsp。FIRHalfbandDecimator对应于过滤器的采样率,因为你过滤然后下采样(概念上)。因此,对于小数,FVTool中指定的Fs不需要乘以任何因子。

FrameSize = 256;傅氏国际= 2 * Fs;halfbanddecimator = dsp.firhalfBanddecimator(“SampleRate”傅氏国际,...“规范”“滤镜顺序和过渡宽度”...“FilterOrder”N“TransitionWidth”, 4000);fvtool(halfbandredimator,'FS'傅氏国际,“颜色”“白色”);范围= dsp.spectrumanalyzer(“SampleRate”,fs,'spectralaverages'5);sine1 = dsp.sinewave(“频率”10 e3,“SampleRate”,fs,...'samplesperframe', FrameSize);sine2 = dsp。SineWave (“频率”20 e3,“SampleRate”,fs,...'samplesperframe', FrameSize);抽搐toc <10 x = sine1()+ sine2()+ 0.01。* randn(框架,1);%96 kHz.y = halfbandinterpolator(x);% 192千赫xd = halfbandDecimator (y);%96 kHz.范围(XD);结尾释放(范围);

获取滤波器系数

可以使用该滤波器系数从内插器/放火发管中提取特遣部队函数。

num =特遣部队(halfbandInterpolator);% Or num = tf(halfbandDecimator);

使用不同的设计规范

不需要指定滤波器的顺序和过渡宽度,您可以设计一个最小阶滤波器,提供给定的过渡宽度和给定的阻带衰减。

AST = 80;% 80分贝halfbandInterpolator = dsp。FIRHalfbandInterpolator (“SampleRate”,fs,...“规范”'过渡宽度和阻带衰减'...“StopbandAttenuation”Ast,“TransitionWidth”, 4000);fvtool (halfbandInterpolator'FS',2 * fs,“颜色”“白色”);

注意,与所有插值器一样,通带增益的绝对单位等于插值因子(在半带情况下为2)。这对应的通带增益为6.02 dB。

也可以指定滤波器的顺序和阻带衰减。

halfbanddecimator = dsp.firhalfBanddecimator(“SampleRate”,fs,...“规范”'滤波器顺序和阻带衰减'...“StopbandAttenuation”Ast,“FilterOrder”,n);fvtool(halfbandredimator,'FS',fs,“颜色”“白色”);

与插值器不同,小数在通带中有1 (0 dB)的增益。

滤波器组使用半带滤波器

半频带内插器和抽取器可用于有效地实现合成/分析滤波器库。到目前为止所示的半带滤波器都有低通滤波器。使用单个额外的加法器,除了低通响应之外,还可以获得高通响应,并使用两个响应过滤器组实现。

下面的代码模拟了一个正交镜滤波器(QMF)组。由1 kHz和3 kHz正弦波组成的8 kHz信号使用低通/高通半带抽取器分成两个4 kHz信号。低通信号保留1khz的正弦波,而高通信号保留3khz的正弦波(下采样后混叠为1khz)。然后利用半带插值器将信号与合成滤波器组合并在一起。高通分支上转换混叠的1 kHz正弦波回3 kHz。插值信号的采样率为8 kHz。

Fs1 = 8000;%单位= Hz规范=“滤镜顺序和过渡宽度”;订单= 52;tw = 4.1e2;%单位= Hz%构造FIR半带插值器halfbandInterpolator = dsp。FIRHalfbandInterpolator (...“规范”,规格,...“FilterOrder”,命令,...“TransitionWidth”TW,...“SampleRate”,fs1 / 2,...'filterbankinputport',真正的);%构造FIR半带小数halfbanddecimator = dsp.firhalfBanddecimator(...“规范”,规格,...“FilterOrder”,命令,...“TransitionWidth”TW,...“SampleRate”,fs1);%的输入f1 = 1000;f2 = 3000;InputWave = dsp。SineWave (“频率”(f1、f2),“SampleRate”,fs1,...'samplesperframe',1024,“振幅”,[1 0.25]);%构造频谱分析仪对象来查看输入和输出范围= dsp.spectrumanalyzer(“SampleRate”,fs1,...“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,'ylimits'...30 [-120],...“标题”...“正交镜滤波器的输入信号和输出信号”);范围。ChannelNames = {'输入'“输出”};抽搐TOC <10输入= SUM(INPUTWAVE(),2);NoisyInput =输入+(10 ^ -5)* Randn(1024,1);[低通,高通] = HalfBandDecimator(NoisyInput);输出=半吹杆接地器(低通,高通);范围([NoisyInput,输出]);结尾释放(范围);

高级设计选项:指定不同的设计算法

到目前为止,所有的设计都是最优的等波纹设计。使用fdesign.interpolatorfdesign.decimator,其他设计算法可用。

Fs = 44.1 e3;N = 90;TW = 1000 / Fs;%过渡宽度filtSpecs = fdesign.interpolator (2“halfband”'n,tw'N、TW);equirippleHBFilter =设计(filtSpecs,“equiripple”'systemobject',真正的);最终QuareshBfilter = Design(filtspecs,'firls''systemobject',真正的);kaiserHBFilter =设计(filtSpecs,'kaiserwin''systemobject',真正的);

您可以将设计与FVTool进行比较。不同的设计允许在最小停机带衰减和更全面的衰减之间进行贸易。

fvt = fvtool (equirippleHBFilter leastSquaresHBFilter kaiserHBFilter,...'FS',2 * fs,“颜色”“白色”);传奇(FVT,“Equiripple设计”'最小二乘设计'...“Kaiser-window设计”

控制停止衰减

或者,可以指定顺序和阻带衰减。这允许在总的阻带衰减和过渡宽度之间进行权衡。

Ast = 60;最小阻带衰减filtSpecs = fdesign.interpolator (2“halfband”'n,ist', N, Ast);equirippleHBFilter =设计(filtSpecs,“equiripple”'systemobject',真正的);kaiserHBFilter =设计(filtSpecs,'kaiserwin''systemobject',真正的);fvt = fvtool(Equiripplehbfilter,Kaiserhbfilter,'FS',2 * fs,“颜色”“白色”);传奇(FVT,“Equiripple设计”“Kaiser-window设计”

最小订单的设计

Kaiser窗口设计除了等效纹波设计外,还可以用于设计满足设计规范所需的最小阶滤波器。Kaiser窗设计的实际阶数比等纹波设计的阶数要大,但阻带衰减的总体效果更好。

Fs = 44.1 e3;tw = 1000 /(fs / 2);%过渡宽度Ast = 60;% 60 dB在阻带中的最小衰减filtSpecs = fdesign.decimator (2“halfband”“TW, Ast”TW, Ast);equirippleHBFilter =设计(filtSpecs,“equiripple”'systemobject',真正的);kaiserHBFilter =设计(filtSpecs,'kaiserwin''systemobject',真正的);fvt = fvtool(Equiripplehbfilter,Kaiserhbfilter,'FS',fs,“颜色”“白色”);传奇(FVT,“Equiripple设计”“Kaiser-window设计”

随着阻带衰减的越来越多的设计

而不是设计Kaiser窗口过滤器,也可以通过修改的“平方”设计来获得越来越长的阻带衰减。

equirippleHBFilter1 =设计(filtSpecs,“equiripple”...“StopbandShape”“1 / f”“StopbandDecay”4'systemobject',真正的);Equiripplehbfilter2 = Design(filtspecs,“equiripple”...“StopbandShape”“线性”“StopbandDecay”, 53.333,'systemobject',真正的);fvt = fvtool (equirippleHBFilter1 equirippleHBFilter2,...'FS',fs,“颜色”“白色”);传奇(FVT,'阻带衰减为(1/f)^4'“线性停止衰减”

高通滤波Halfband过滤器

通过改变每一秒系数的符号,可以从低通半带滤波器得到高通半带滤波器。或者,可以直接设计高通半带通过设置“类型”属性为“highpass”。

filtSpecs = fdesign.decimator (2“halfband”...'类型'“高通”“TW, Ast”TW, Ast);halfbandHPFilter =设计(filtSpecs,“equiripple”...“StopbandShape”“线性”“StopbandDecay”, 53.333,'systemobject',真正的);fvt = fvtool (halfbandHPFilter equirippleHBFilter2,'FS',fs,“颜色”“白色”);传奇(FVT,“高反差保留halfband过滤器的'低通半带滤波器'