主要内容

FIR HAMBBAND滤波器设计

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

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

获取半频带系数

Firhalfband.函数返回FIR HAMBABREE平方滤波器的系数。作为一个简单的例子,考虑一个半带滤波器,其处理以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然后过滤(概念上),因此需要指定FVTool的采样率,因为ups采样将被指定为2 * fs。

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

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

grpDel = 50;n = 0:2:511;茎(n (1: end-grpDel / 2), x (1: end-grpDel / 2),'K'“填充”) 抓住nu = 0:511;茎(NU(1:终端GRPDEL),Y(GRPDEL + 1:END))传奇(输入样本的'内插样本'

在抽取的情况下,在dsp。FIRHalfbandDecimator对应于滤波器的采样率,因为您过滤然后下射门(概念上)。因此,对于Deetimator,FVTool中指定的FS不需要乘以任何因素。

框架= 256;fsin = 2 * fs;halfbabrdecimator = dsp.firhalfbanddecimator(“SampleRate”,fsin,...'规格'“滤镜顺序和过渡宽度”...“FilterOrder”N'transitionwidth', 4000);fvtool(halfbandredimator,'fs',fsin,'颜色'“白色”);范围= dsp.spectrumanalyzer(“SampleRate”,fs,'spectralaverages'5);sine1 = dsp.sinewave('频率',10e3',“SampleRate”,fs,...'samplesperframe', FrameSize);sine2 = dsp.sinewave('频率',20e3',“SampleRate”,fs,...'samplesperframe', FrameSize);抽搐尽管toc <10 x = sine1()+ sine2()+ 0.01。* randn(框架化,1);%96 kHz.y = halfbandinterpolator(x);%192 kHz.xd = halfbandDecimator (y);%96 kHz.范围(XD);结尾释放(范围);

获取滤波器系数

滤波器系数可以通过使用滤波器系数从插值器/放火枪中提取特遣部队函数。

num =特遣部队(halfbandInterpolator);%或num = tf(halfbanddecimator);

使用不同的设计规范

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

AST = 80;%80 dB.halfbandInterpolator = dsp。FIRHalfbandInterpolator (“SampleRate”,fs,...'规格''过渡宽度和阻带衰减'...'stopbandattenuation'Ast,'transitionwidth', 4000);fvtool (halfbandInterpolator'fs',2 * fs,'颜色'“白色”);

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

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

halfbabrdecimator = 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半带抽取器halfbabrdecimator = 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'...[-120 30],...'标题'...“正交镜滤波器的输入信号和输出信号”);scope.channelnames = {'输入''输出'};抽搐尽管TOC <10输入= SUM(INPUTWAVE(),2);NoisyInput =输入+(10 ^ -5)* Randn(1024,1);[低通,高通] = HalfBandDecimator(NoisyInput);输出= HalfBandinterpolator(低通,高通);范围([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 Design'

控制停滞衰减

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

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

最小订单的设计

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 Design'

随着阻带衰减的越来越平等的设计

而不是设计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过滤器

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

filtSpecs = fdesign.decimator (2'halfband'...'类型'“高通”“TW, Ast”,tw,ast);halfbandhpfilter = design(filtspecs,“equiripple”...'stopbandshape'“线性”“StopbandDecay”, 53.333,'systemobject',真正的);fvt = fvtool(halfbablhpfilter,sealiripplehbfilter2,'fs',fs,'颜色'“白色”);传奇(FVT,“高反差保留halfband过滤器的'低通半带滤波器'