主要内容

FIR半带滤波器设计

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

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

半带系数的获取

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 (24khz)点也有对称性。通带扩展到指定的22 kHz,止带从26 kHz开始。我们也可以通过观察脉冲响应来证明其他的系数都等于0。这使得过滤器非常有效地实现插值/抽取因子2。

fvt。分析=“冲动”

dsp。FIRHalfbandInterpolator而且dsp。FIRHalfbandDecimator

firhalfband函数提供了其他几个设计选项。然而,在大多数情况下,最好直接使用它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将采样率定义为过滤器运行的速率。在插值的情况下,你上采样,然后过滤(概念上),因此FVTool的采样率需要指定为2*Fs,因为上采样2。

FrameSize = 256;Scope = dsp。简介(“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(FrameSize,1);% 96千赫y = halfbandInterpolator(x);% 192千赫范围(y);结束释放(范围);

请注意,光谱副本被衰减了约40 dB,这大约是半带滤波器提供的衰减。补偿滤波器中的群延迟,可以绘制输入和插值样本的叠加图。请注意,输入样本在过滤器的输出中保持不变。这是因为半带的多相分支之一是一个纯延迟分支,它不改变输入样本。

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

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

FrameSize = 256;FsIn = 2*Fs;halfbandDecimator = dsp。FIRHalfbandDecimator (“SampleRate”傅氏国际,...“规范”滤镜顺序和过渡宽度...“FilterOrder”N“TransitionWidth”, 4000);fvtool (halfbandDecimator“Fs”傅氏国际,“颜色”“白色”);Scope = dsp。简介(“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(FrameSize,1);% 96千赫y = halfbandInterpolator(x);% 192千赫xd = halfbandDecimator(y);% 96千赫范围(xd);结束释放(范围);

获取滤波器系数

滤波器系数可以从插值器/抽取器中提取特遣部队函数。

num = tf(halfbandInterpolator);%或num = tf(halfbandDecimator);

使用不同的设计规范

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

Ast = 80;% 80 dBhalfbandInterpolator = 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 (halfbandDecimator“Fs”Fs,“颜色”“白色”);

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

为滤波器组使用半带滤波器

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

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

Fs1 = 8000;%单位= Hz规范=滤镜顺序和过渡宽度;Order = 52;TW = 4.1e2;%单位= Hz构造FIR半带插补器halfbandInterpolator = dsp。FIRHalfbandInterpolator (...“规范”规范,...“FilterOrder”订单,...“TransitionWidth”TW,...“SampleRate”Fs1/2,...“FilterBankInputPort”,真正的);构造FIR半波段DecimatorhalfbandDecimator = dsp。FIRHalfbandDecimator (...“规范”规范,...“FilterOrder”订单,...“TransitionWidth”TW,...“SampleRate”, Fs1);%的输入F1 = 1000;F2 = 3000;InputWave = dsp。SineWave (“频率”(f1、f2),“SampleRate”, Fs1、...“SamplesPerFrame”, 1024,“振幅”0.25 [1]);构造Spectrum Analyzer对象以查看输入和输出Scope = dsp。简介(“SampleRate”, Fs1、...“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”...30 [-120],...“标题”...正交镜滤波器的输入信号和输出信号);范围。ChannelNames = {“输入”“输出”};抽搐toc < 10 Input = sum(InputWave(),2);NoisyInput = Input+(10^-5)*randn(1024,1);[Lowpass,Highpass] = halfbandDecimator(NoisyInput);Output = halfbandInterpolator(Lowpass,Highpass);范围([NoisyInput、输出]);结束释放(范围);

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

目前提出的所有设计都是最优等纹波设计。使用fdesign.interpolator而且fdesign.decimator,其他设计算法是可用的。

Fs = 44.11 e3;N = 90;TW = 1000/Fs;%过渡宽度filtSpecs = fdesign.interpolator(2,“halfband”“N, TW”N、TW);equirippleHBFilter =设计(filtSpecs,“equiripple”“SystemObject”,真正的);leastSquaresHBFilter =设计(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, Ast”, N, Ast);equirippleHBFilter =设计(filtSpecs,“equiripple”“SystemObject”,真正的);kaiserHBFilter =设计(filtSpecs,“kaiserwin”“SystemObject”,真正的);fvt = fvtool(equirippleHBFilter,kaiserHBFilter,“Fs”2 * Fs,“颜色”“白色”);传奇(fvt“Equiripple设计”“Kaiser-window设计”

最小订单的设计

在设计满足设计规范所需的最小阶滤波器时,除了等纹波设计外,还可以使用Kaiser窗设计。凯撒窗设计的实际阶数比等纹波设计的阶数大,但总的阻带衰减更好。

Fs = 44.11 e3;TW = 1000/(Fs/2);%过渡宽度Ast = 60;阻带最小衰减% 60 dBfiltSpecs = 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设计”

增加阻带衰减的等纹波设计

而不是设计凯撒窗口滤波器,也有可能获得增加阻带衰减与改进的“等纹波”设计。

equirippleHBFilter1 =设计(filtSpecs,“equiripple”...“StopbandShape”“1 / f”“StopbandDecay”4“SystemObject”,真正的);equirippleHBFilter2 =设计(filtSpecs,“equiripple”...“StopbandShape”“线性”“StopbandDecay”, 53.333,“SystemObject”,真正的);fvt = fvtool(equirippleHBFilter1,equirippleHBFilter2,...“Fs”Fs,“颜色”“白色”);传奇(fvt止带衰减为(1/f)^4“阻止带线性衰减”

高通半带滤波器

通过改变低通半带滤波器每秒系数的符号,可以得到高通半带滤波器。或者,你可以通过设置'Type'属性为' 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“高通半带滤波器”“低通半带滤波器”