抽取器和插值器的设计
这个例子展示了如何为离散序列的抽取和插值设计滤波器。
低通滤波在速率转换中的作用
速率转换是改变离散信号的速率以获得底层连续信号的新的离散表示的过程。该过程包括均匀的下采样和上采样。的均匀下采样率N指的是N-序列的第th个样本,并丢弃其余的样本。的均匀上采样N指的填充N每两个连续样本之间有-1个0。
L = 3;上采样率M = 2;降采样率%上取样和下取样xDown = downsample(x,M)
x = 1 2 3 xUp = 1 0 0 2 0 0 0 3 0 0 xDown = 1 3
这两种基本操作都会引入信号伪影:下采样引入混叠,上采样引入成像。为了减轻这些影响,可以使用低通滤波器。
当以,应用低通滤波器之前下采样限制了输入带宽,从而消除了频谱混叠。这类似于A/D转换器中使用的模拟LPF。理想情况下,这样的抗混叠滤波器具有单位增益和截止频率,在这里为信号的奈奎斯特频率。注意:底层采样频率是不重要的,我们假设归一化频率(即。)在整个讨论中。
当上抽样率为,上采样后应用的低通滤波器称为抗成像滤波器。该滤波器去除低速率信号的光谱图像。理想情况下,该防成像滤波器的截止频率为(就像它的抗锯齿对应物),而它的增益是.
速率的上采样和下采样操作要求具有归一化截止频率的低通滤波器.唯一的区别是所需的增益和滤波器的位置(在速率转换之前或之后)。
将信号上采样的倍数相加,然后进行滤波,再向下采样一个因子将序列采样率转换为的有理因子.这是通过按速率上采样得到的接着是滤波,然后按速率下采样.无法交换汇率转换操作的顺序。在上采样和下采样阶段之间放置了一个结合了抗混叠和抗成像的单一滤波器。该滤波器是一个低通,其归一化截止频率为并且获得了.
而任何低通FIR设计功能(例如:fir1
,firpm
,或fdesign
)可以设计出合适的抗混叠和抗成像滤波器,实现该功能designMultirateFIR
提供了一个方便和简化的界面。接下来的几节将展示如何使用这些函数来设计过滤器,并说明原因designMultirateFIR
是首选的方式。
过滤速率转换:抽取器,插值器和有理速率转换器
过滤速率转换包括抽取器、插值器和有理速率转换器,所有这些都是具有各种配置的过滤器的速率变化块的级联。
的过滤速率转换过滤器
,upsample
,downsample
功能
大量毁灭为LTI滤波后均匀下采样。FIR抽取器可以如下方式实现。
设计了一个抗混叠低通滤波器h
过滤输入h
对过滤后的序列进行次采样米
定义一个输入序列X =兰特(60,1);实现一个FIR抽取器h = fir1(L*12*2,1/M);%任意过滤器xDecim = downsample(filter(h,1,x), M);
插值指的是上采样,然后滤波。其实现非常类似于抽取。
xInterp = filter(h,1,upsample(x,L));
最后,有理数比率转换由一个插值器和一个十进制数(按特定顺序)组成。
xRC = downsample(filter(h,1,upsample(x,L)), M);
使用系统对象进行过滤速率转换
对于流数据,系统对象dsp。FIRInterpolator
,dsp。FIRDecimator
,dsp。FIRRateConverter
将速率变化和过滤封装在单个对象中。例如,插值器的构造如下所示。
firInterp = dsp.FIRInterpolator(L,h);
然后,通过步骤调用向新创建的对象提供一个序列。
xInterp = firInterp(x);
以类似的方式设计和使用decimators和rate converter。
firDecim = dsp.FIRDecimator(M,h);%构造xDecim = firDecim(x);% Decimate(步骤调用)firRC = dsp.FIRRateConverter(L,M,h);%构造xRC = firRC(x);%转化率(步骤调用)
通常首选使用系统对象,因为它们:
允许使用更清晰的语法。
保持一个状态,作为后续步骤调用的过滤器初始条件。
最重要的是,它们利用了一种非常有效的多相算法。
要构造这些对象,您需要速率转换因子和FIR系数。以下部分描述如何为速率转换滤波器生成适当的FIR系数。
设计一个速率转换滤波器designMultirateFIR
这个函数designMultirateFIR (L, M)
自动找到适当的缩放和截止频率为给定的比率转换比.使用返回的FIR系数designMultirateFIR
与dsp。FIRDecimator
(如果),dsp。FIRInterpolator
(如果),或dsp。FIRRateConverter
(一般情况下)。
让我们设计一个插值滤波器:
L = 3;bInterp = designMultirateFIR(L,1);%纯上采样滤波器firInterp = dsp.FIRInterpolator(L,bInterp);
然后,将插值器应用于一个序列。
%创建一个序列N = (0:89)';f = @ (t)因为(0.1 * 2 *π* t)。* exp (-0.01 * (t-25) ^ 2) + 0.2;X = f(n);应用插值器xUp = firInterp(x);释放(firInterp);
让我们首先检查插补器的原始输出并与原始序列进行比较。
plot_raw_sequences (x, xUp);
而输入之间有一定的相似性x
以及输出xUp
在美国,有几个关键的区别。在插值信号中
时域被拉伸(正如预期的那样)。
信号的延迟是FIR长度的一半
长度(h) / 2
(表示从今以后)。一开始有一个瞬态响应。
为了比较,对齐和缩放两个序列的时域。插值样本xUp [k]
对应于一个输入时间.
nUp =(0:长度(xUp)-1);i0 = length(bInterp)/2;plot_scaled_sequences (n x (1 / L) * (nUp-i0) xUp, (“原始序列”,...插补器输出序列(时间调整)60]、[0]);
同样的想法也适用于时间转换的下采样:
M = 3;bDecim = designMultirateFIR(1,M);%纯下采样滤波器firDecim = dsp.FIRDecimator(M,bDecim);xDown = firDecim(x);
将它们画在相同的刻度上,并根据延迟进行调整。注意它们完全重叠。
i0 = length(bDecim)/2;nDown =(0:长度(xDown)-1);plot_scaled_sequences (n, x, M * nDown-i0 xDown, (“原始序列”,...十进制输出序列(时间调整)),(-10、80));
可视化使用上采样和下采样滤波器的幅度响应fvtool
.在这种情况下,两个FIR滤波器是相同的,直到不同的增益。
hfv = fvtool(firInterp,firDecim);注意通带中的增益传奇(hfv插值滤波器L="+ num2str (L),...抽取滤波器M="+ num2str (M));
一般的有理变换可以用与上抽样和下抽样相同的方法来处理。界限是收益是.这个函数designMultirateFIR
自动计算出来。
L = 5;M = 2;b = designMultirateFIR(L,M);firRC = dsp.FIRRateConverter(L,M,b);
现在让我们将组合滤波器与单独的插值/抽取组件进行比较。
firDecim = dsp.FIRDecimator(M,designMultirateFIR(1,M));firInterp = dsp.FIRInterpolator(L,designMultirateFIR(L,1));hfv = fvtool(firInterp,firDecim, firRC);注意通带中的增益传奇(hfv插值滤波器L="+ num2str (L),...抽取滤波器M="+ num2str (M),...“速率转换滤波器L/M=”+ num2str (L) +“/”+ num2str (M));
一旦FIRRateConverter
设置后,通过步进调用执行速率转换。
xRC = firRC(x);
绘制输入和滤波器输出的时间调整.
nRC =(0:长度(xRC)-1)';I0 =长度(b)/2;plot_scaled_sequences (n x (1 / L) * (M * nRC-i0), xRC, (“原始序列”,...速率转换器输出序列(时间调整), 80年],[0]);
调整低通FIR设计参数
使用designMultirateFIR
你也可以调整FIR长度,过渡宽度,和阻带衰减。
调整FIR长度
FIR长度可以通过l,米,第三个参数P称为半多相长度,其默认值为12输出参数有关详情)。让我们研究两个设计要点。
%未指定的半长默认为12b24 = designMultirateFIR(3,1);halfPhaseLength = 20;b40 = designMultirateFIR(3,1,halfPhaseLength);
一般来说,半多相长度越大,相变越陡。
HFV = fvtool(b24,1,b40,1);传奇(hfv'多相长度= 24(默认值)',多相长度= 40);
调整过渡宽度
通过指定所需的过渡宽度来设计过滤器。近似长度将自动导出。根据默认设计绘制结果过滤器,并注意过渡宽度的差异。
Tw = 0.02;bTW = designMultirateFIR(3,1,TW);hfv = fvtool(b24,1,bTW,1);传奇(hfv默认设计(FIR长度= 72),“用TW=设计”...+ num2str (TW) +(FIR长度="+ num2str(长度(顺便说一句))+“)”);
速率转换的特殊情况:半带插值器和抽取器
使用半带滤波器(即),你可以执行一个因子2的抽样率转换。的dsp。FIRHalfbandInterpolator
而且dsp。FIRHalfbandDecimator
对象执行插值和抽取因子2使用半带滤波器。这些系统对象是使用一种高效的多相结构来实现的,具体用于该速率转换。IIR对应方dsp。IIRHalfbandInterpolator
而且dsp。IIRHalfbandDecimator
甚至可以更有效率。这些系统对象还可以使用自定义采样率。
可视化的大小响应使用fvtool
.在插值的情况下,滤波器在衰减光谱图像的同时保留了从0到Fs/2的大部分光谱。对于抽取,滤波器通过大约一半的频带,即0到Fs/4,并衰减另一半以尽量减少混叠。衰减量可以设置为插值和抽取所需的任何值。如果未指定,缺省值为80 dB。
Fs = 1e6;hbInterp = dsp。FIRHalfbandInterpolator (“TransitionWidth”Fs / 10...“SampleRate”Fs);fvtool (hbInterp)注意在通带中有2 (6 dB)增益hbDecim = dsp。FIRHalfbandDecimator (“TransitionWidth”Fs / 10...“SampleRate”Fs);fvtool (hbDecim)
Equiripple设计
这个函数designMultirateFIR
利用基于窗口的FIR低通设计。其他低通设计方法也可以应用,如等纹波。若要对设计过程进行更多控制,请使用fdesign
滤波器设计功能。类型设计了一个小数fdesign.decimator
函数。
M = 4;抽取因子Fp = 80;%通带边频率Fst = 100;%止带边频率Ap = 0.1;%通带峰间纹波Ast = 80;最小阻带衰减Fs = 800;采样频率fdDecim = fdesign.decimator(M,低通滤波器的Fp,置,美联社,Ast, Fs)% #好吧
fdDecim = decimator与属性:MultirateType: ' decimator '响应:'低通' DecimationFactor: 4规格:'Fp,Fst,Ap,Ast'描述:{4x1 cell} NormalizedFrequency: 0 Fs: 800 Fs_in: 800 Fs_out: 200 Fpass: 80 Fstop: 100 Apass: 0.1000 stopp: 80
滤波器的规格确定在80到100 Hz之间可以接受20 Hz的过渡带,带外组件的最小衰减为80 dB。此外,感兴趣的组件的最大失真为0.05 dB(峰到峰通带纹波的一半)。满足这些规格的等纹波滤波器可以很容易地获得fdesign
接口。
eqrDecim =设计(fdDecim,“equiripple”,“SystemObject”,真正的);测量(eqrDecim)
ans =采样率:800hz通带边缘:80hz 3-dB点:85.621 Hz 6-dB点:87.8492 Hz止带边缘:100hz通带纹波:0.092414 dB止带注意。: 80.3135 dB过渡宽度:20hz
可视化的幅度响应证实了滤波器是一个等纹波滤波器。
fvtool (eqrDecim)
奈奎斯特滤波器和插值一致性
一个数字卷积滤波器叫做l-th奈奎斯特过滤器,如果它周期性地消失样本,除了中心索引。换句话说,就是抽样乘以产生冲动:
的-th波段理想低通,例如,美国是-th奈奎斯特过滤器。另一个例子是三角形窗口。
L = 3;t = linspace(-3*L,3*L,1024);n = (-3*L:3*L);hLP = @(t) sinc(t/L);hTri = @(t) (1-abs(t/L)).*(abs(t/L)<=1);plot_nyquist_filter (t、n hLP hTri, L);
这个函数designMultirateFIR
产生奈奎斯特滤波器,因为它是基于理想奈奎斯特滤波器的加权和截断版本。
奈奎斯特滤波器是有效的实现,因为一个l这些过滤器系数的-th部分为零,这减少了所需的乘法的数量。这个特性使得这些滤波器对抽取和插值都很有效。
插值的一致性
奈奎斯特滤波器在过滤后仍然保留输入的样本值。这种行为,叫做插值的一致性,一般来说是不正确的,如下所示。
在奈奎斯特滤波器中,插值一致性是成立的,因为每个系数都等于零l样品(中心除外)。证明很简单。假设是上采样版本吗(在样本之间插入零),因此,以及是插值信号。样本均匀,得到如下方程。
让我们检查一下使用奈奎斯特滤波器进行插值的效果。的designMultirateFIR
函数产生奈奎斯特滤波器。正如您在下面的描述中所看到的,输入值与插值值一致。
%生成输入N = (0:20)';xInput = (n<=10).*cos(pi*0.05*n).*(-1).^n;L = 4;hNyq = designMultirateFIR(L,1);firNyq = dsp.FIRInterpolator(L,hNyq);xIntrNyq = firNyq(xInput);释放(firNyq);plot_shape_and_response (hNyq xIntrNyq xInput, L, num2str (L) +“-Nyuist”);
这不是其他低通滤波器的情况,如等纹波设计,如下图所示。注意,插值序列与低速率输入值不一致。另一方面,失真在非奈奎斯特滤波器中可能更低,作为插值一致性的权衡。
hNyq = firpm(长度(hNyq)-1,[0 1/L 1.5/L 1],[1 1 0 0]);hNotNyq = hNotNyq/max(hNotNyq);%调整增益firIntrNotNyq = dsp.FIRInterpolator(L,hNotNyq);xIntrNotNyq = firIntrNotNyq (xInput);释放(firIntrNotNyq);plot_shape_and_response (hNotNyq xIntrNotNyq xInput, L,"equiripple,而不是Nyquist");
另请参阅
功能
对象
dsp。FIRDecimator
|dsp。FIRInterpolator
|dsp。FIRRateConverter
|dsp。FIRHalfbandDecimator
|dsp。FIRHalfbandInterpolator