此示例显示了如何设计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.interpolator
和fdesign.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',“线性停止衰减”)
通过改变每秒系数的符号,可以从低通半带滤波器获得高通半带滤波器。或者,可以通过将“型”属性设置为“高通”来直接设计高通半带。
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过滤器的,'低通半带滤波器')