主要内容

FIR半带滤波器设计

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

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

获取半带系数

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

Fs = 96年e3;Fp = 22 e3;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。FIRHalfbandInterpolatordsp。FIRHalfbandDecimator

firhalfbandFunction提供了几个其他的设计选项。然而,在大多数情况下,直接使用是更好的选择dsp。FIRHalfbandInterpolatordsp。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;= 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”“填充”)举行ν= 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 (halfbandDecimator“Fs”傅氏国际,“颜色”“白色”);= 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 =特遣部队(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 (halfbandDecimator“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.1 e2;%单位= 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,“振幅”0.25 [1]);%构造频谱分析仪对象来查看输入和输出= dsp范围。简介(“SampleRate”, Fs1、...“PlotAsTwoSidedSpectrum”假的,“ShowLegend”,真的,“YLimits”...30 [-120],...“标题”...'正交镜滤波器的输入信号和输出信号');范围。ChannelNames = {“输入”“输出”};抽搐toc < 10 Input = 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”,真正的);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窗口设计除了等效纹波设计外,还可以用于设计满足设计规范所需的最小阶滤波器。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 =设计(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过滤器的“低通halfband过滤”