这个例子展示了如何设计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“高通半带滤波器”,“低通半带滤波器”)