这个例子展示了如何为离散序列的抽取和插值设计滤波器。
速率转换是改变离散信号速率以获得基本连续信号的新离散表示的过程。该过程包括均匀下采样和上采样。均匀下采样速率为N指的是N-序列的第个样本,并丢弃其余样本。均匀上采样系数为N指的是填充N-每两个连续样本之间有1个零。
x = 1:3 L = 1;% upsampling率M=2;%将采样率%上采样和下采样xUp = upsample(x,L)
x=123xup=100020xdown=13
这两种基本操作都会引入信号伪影:下采样引入混叠,上采样引入成像。要减轻这些影响,请使用低通滤波器。
按以下速率进行下采样时:,应用低通滤波器之前下采样限制了输入带宽,从而消除了频谱混叠。这类似于用于A/D转换器的模拟LPF。理想情况下,这种抗混叠滤波器的单位增益和截止频率为,在这里为信号的奈奎斯特频率。注意:基本采样频率不重要,我们假设标准化频率(即。)在整个讨论中。
当以速率进行上采样时,上采样后应用的低通滤波器称为反成像滤波器。该滤波器去除低速率信号的光谱图像。理想情况下,此反成像滤波器的截止频率为(就像它的反锯齿),而它的增益是。
速率的上采样和下采样操作需要一个归一化截止频率为的低通滤波器。唯一的区别是所需的增益和滤波器的位置(在速率转换之前或之后)。
将信号上采样到某一倍数的组合,然后进行过滤,然后进行因子的降采样转换序列抽样率的一个合理因素。这是通过速率上采样得到的然后过滤,然后按速率降采样. 无法转换速率转换操作的顺序。在上采样和下采样级之间放置一个结合了抗混叠和抗成像的滤波器。该滤波器为低通滤波器,标准化截止频率为并获得。
而任何低通FIR设计函数(例如。fir1
,firpm
,或F设计
)可以设计一个合适的抗锯齿和抗成像滤波器的功能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=滤波器(h,1,上采样(x,L));
最后,有理速率转换由一个插值器和一个抽取器(按照特定顺序)组成。
xRC = downsample(filter(h,1,upsample(x,L)), M);
使用系统对象过滤速率转换
对于流数据,系统对象数字信号处理器
,dsp。FIRDecimator
和dsp。铁氧体转换器
将速率变化和筛选封装在单个对象中。例如,插值器的构造如下所示。
firInterp = dsp.FIRInterpolator (L、h);
然后,通过步骤调用将序列提供给新创建的对象。
xInterp=firInterp(x);
以类似的方式设计和使用抽取器和速率转换器。
firDecim = dsp.FIRDecimator (M h);%构造xDecim = firDecim (x);%抽取(步进呼叫)firRC=dsp.FIRRateConverter(L,M,h);%构造xRC=firRC(x);%转换率(步进调用)
通常首选使用系统对象,因为它们:
允许更清晰的语法。
保留一个状态,作为后续步骤调用的筛选器初始Conditon。
最重要的是,他们利用了一个非常有效的多相算法。
要构造这些对象,需要速率转换因子和FIR系数。以下部分描述如何为速率转换滤波器生成适当的FIR系数。
designMultirateFIR
这个函数designMultirateFIR (L, M)
自动找到适当的缩放和截止频率为一个给定的比率转换比率。使用返回的FIR系数designMultirateFIR
具有dsp。FIRDecimator
(如果),数字信号处理器
(如果),或dsp。铁氧体转换器
(一般情况)。
让我们设计一个插值滤波器:
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
和输出许浦
在美国,有几个关键的区别。在插值信号中
时域被拉伸(如预期的那样)。
该信号的延迟为FIR长度的一半长度(h)/2
(表示从今以后)。
开始时有一个瞬态响应。
比较、对齐和缩放两个序列的时间域。一个插值样本xUp[k]
对应于输入时间。
nu =(0:长度(xUp) 1);i0 =长度(bInterp) / 2;plot_scaled_sequences (n x (1 / L) * (nUp-i0) xUp, (“原始序列”,...插值器输出序列(时间调整)60]、[0]);
同样的想法也适用于下采样,其中时间转换是:
M = 3;bDecim = designMultirateFIR(1米);%纯下采样滤波器firDecim = dsp.FIRDecimator (M, bDecim);xDown = firDecim (x);
将它们绘制在相同的比例上,并调整延迟时间。注意它们完全重叠。
i0 =长度(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,设计多速率FIR(1,M));firInterp=dsp.FIRInterpolator(L,设计多速率FIR(1,1));hfv=fvtool(firInterp,firDecim,firRC);%注意通带的增益传奇(hfv“插值滤波器L = "+ num2str (L),...“大量毁灭过滤器M =”+ num2str (M),..."率转换滤波器L/M="+ num2str (L) +"/"+ num2str (M));
一旦铁氧体转换器
时,通过步骤调用执行速率转换。
xRC=firRC(x);
用以下公式给出的时间调整绘制输入和滤波器输出。
nRC=(0:长度(xRC)-1)';i0=长度(b)/2;按比例绘制序列(n,x,(1/L)*(M*nRC-i0),xRC[“原始序列”,...“速率转换器输出序列(时间调整)”, 80年],[0]);
使用designMultirateFIR
您还可以调整FIR长度、过渡宽度和阻带衰减。
调整FIR长度
FIR长度可以通过控制l,米,以及第三个参数P称为半多相长度,其默认值为12(参考输出参数更多的细节)。让我们检查两个设计要点。
%未指定的半长默认为12b24 = designMultirateFIR (3,1);halfPhaseLength = 20;3 = designMultirateFIR (3 1 halfPhaseLength);
一般来说,半多相长度越大,相变越陡。
hfv = fvtool (b24, 1, 3, 1);传奇(hfv'多相长度= 24(默认)',“多相长度=40”);
调整过渡宽度
通过指定所需的过渡宽度来设计过滤器。适当的长度将自动得到。根据默认设计绘制结果过滤器,注意过渡宽度的差异。
TW = 0.02;顺便说一句= designMultirateFIR(3、1、TW);hfv = fvtool (b24, 1,顺便说一句,1);传奇(hfv'默认设计(FIR长度=72)',“设计与TW = "...+ num2str (TW) +”(冷杉长度= "+num2str(长度(bTW))+“)”);
使用半带滤波器(即。),您可以执行倍数为2的采样率转换。的dsp。FIRHalfbandInterpolator
和dsp。FIRHalfbandDecimator
对象执行插值和抽取的因子2使用半带滤波器。这些系统对象是使用特定于速率转换的高效多相结构来实现的。信息检索的同行dsp。IIRHalfbandInterpolator
和dsp。IIRHalfbandDecimator
可以更有效率。这些系统对象也可以使用自定义样本率。
使用fvtool
。在插值的情况下,滤波器在衰减光谱图像的同时保留了0到Fs/2的大部分光谱。对于抽取,滤波器通过大约一半的频带,即0到Fs/4,并衰减另一半,以减少混叠。衰减量可以设置为任何所需的值为插值和抽取。如果未指定,默认为80 dB。
Fs=1e6;hbInterp=dsp.FirhAlfBand内插器(“过渡宽度”,Fs/10,...“SampleRate”Fs);fvtool (hbInterp)%注意通带中的增益为2(6 dB)hbDecim=dsp.firhalfBand抽取器(“过渡宽度”,Fs/10,...“SampleRate”,Fs);fvtool(hbDecim)
这个函数designMultirateFIR
利用基于窗口的FIR低通设计。也可以应用其他低通设计方法,如equiripple。要对设计过程进行更多控制,请使用F设计
滤波器设计的功能。下面的示例使用fdesign.decimator
函数。
M = 4;%大量毁灭的因素Fp=80;% Passband-edge频率置= 100;% Stopband-edge频率Ap=0.1;%通带峰间纹波Ast = 80;最小阻带衰减Fs = 800;%采样频率fdDecim = fdesign.decimator (M,低通滤波器的Fp,置,美联社,Ast, Fs)% #好吧
fdDecim = decimator属性:MultirateType: ' decimator ' Response: 'Lowpass' DecimationFactor: 4 Specification: 'Fp,Fst,Ap,Ast' Description: {4x1 cell} NormalizedFrequency: 0 Fs: 800 Fs_in: 800 Fs_out: 200 Fpass: 80 Fstop: 100 pass: 0.1000 stop: 80
滤波器的规格确定了在80和100赫兹之间20 Hz的过渡带是可接受的,并且带外分量的最小衰减是80 dB。同时,感兴趣的元件的最大失真为0.05 dB(峰-峰通带纹波的一半)。满足这些规格的等纹波滤波器可以很容易地通过F设计
接口。
eqrDecim =设计(fdDecim,“equiripple”,“SystemObject”,对);测量值(eqrDecim)
ans =采样率:800hz通频带边缘:80hz 3-dB点:85.621 Hz 6-dB点:87.8492 Hz阻频带边缘:100hz通频带纹波:0.092414 dB阻频带Atten过渡宽度:20 Hz
将幅度响应形象化,确认该滤波器是等纹波滤波器。
fvtool (eqrDecim)
数字卷积滤波器被称为l-th奈奎斯特滤波器,如果它是周期性地消失每样本,除了中心索引。换句话说,样本以…的倍数收益率的冲动:
的-th波段理想低通,,例如th尼奎斯特过滤器。另一个例子是三角窗。
L = 3;L t = linspace (3 * 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(π* 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”);
这不是其他低通滤波器的情况,如equiripple设计,如下图所示。请注意,插值序列与低速率输入值不一致。另一方面,作为插值一致性的折衷,非奈奎斯特滤波器的失真可能更低。
hNotNyq = firpm(length(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,“等波纹,不是奈奎斯特”);