分数延迟FIR滤波器的设计
分数延迟滤波器的目的是通过插值和重采样组合成一个单一的卷积滤波器来移动一个非整数值的数字序列。本示例演示了使用DSP System Toolbox™中的工具设计和实现分数延迟FIR滤波器。
延迟作为一个卷积系统
整数时延时延
考虑数字信号的延迟, 在哪里D整数形式。这个操作可以表示为卷积滤波器 ,脉冲响应是有限的 .对应的传递函数为 ,频率响应为 .通过编程,您可以使用以下MATLAB®代码实现这样的整数延迟滤波器。
创建FIRD = 3;%延迟值h = [0 (1,D) 1]
h =1×40 0 0 1
通过FIR对序列进行过滤来移位序列h
.请注意输出开头的前导零,它们表示这种过滤器固有的初始条件。
X = (1:10)';dfir = dsp.FIRFilter(h);Y = dfir(x)'
y =1×100 0 0 1 2 3 4 5 6 7
通过D/A插值的非整数延迟
延迟序列 当D不是整数时,没有定义。为了使这种分数延迟有意义,需要添加一个中间D/A插值阶段,以便对连续统上的输出进行采样。也就是说, 在哪里 表示输入序列的一些D/A插值 .D/A插值函数 可以依赖于N,可以认为作为底层模拟信号模型的一种表示,从该模拟信号模型中得到序列 是采样。该策略也用于其他重采样问题,如速率转换。
本例将使用两种插值模型来实现分数延迟滤波器,这两种模型都是DSP系统工具箱的一部分。
基于正弦的插值模型,它使用带宽有限的重建 .
基于拉格朗日的插值模型,它使用多项式重建 .
带宽限制的分数延迟滤波器
的Shannon-WhittakeR插值公式 建模带宽有限的信号。也就是中间D/A转换 是输入序列的带限重构。对于延迟值D,分数延迟 ,使用相同的方法 对于每一个n,都可以用卷积滤波器表示。这个过滤器被称为理想的限带分数延迟滤波器,及其脉冲响应是
.
相应的频率响应(即DTFT)由 .
理想限带移位滤波器的因果FIR近似
理想的sinc上一节中描述的Shift滤波器是一个全通滤波器(即。 ),但它有一个无限的非因果的脉冲响应 .在MATLAB中,它不能表示为一个向量,而是表示为一个索引的函数k.
%理想滤波器序列D = 0.4;hIdeal = @(k) sinc(k- d);
为了实际和计算的目的,理想滤波器可以在有限的索引窗口上截断,代价是一些带宽损失。的目标延迟值 一个期望的长度N,指数窗口 令人满意的 是对称的 ,并捕获理想滤波器的主瓣。为 在哪里 和一个整数 ,显式窗口索引为 .整数 被称为整数的延迟,可以任意选择。要使FIR具有因果关系,请设置 ,则索引窗口为 .下面的代码描述了因果FIR近似背后的基本原理。
带因果移位的% FIR近似N = 6;idxWindow = (-floor((N-1)/2):floor(N/2))';i0 = -idxWindow(1);%因果延迟hApprox = hIdeal(idxWindow);plot_causal_fir (“sinc”D N,钱数,hApprox hIdeal);
sinc滤波器的截断会导致频率响应中的纹波,这可以通过施加权重来解决 (如Kaiser或Hamming)的FIR系数。
最后,所得的理想限带分数延迟滤波器的FIR近似模型如下所示。
属性可以设计这样的筛选器designFracDelayFIR
功能和dsp。VariableFractionalDelay
系统对象™“杉”
模式,两者都使用Kaiser窗口权重。
基于拉格朗日的分数延迟滤波器
基于拉格朗日的分数延迟滤波器在输入样本的移动窗口上使用多项式拟合。也就是说, 多项式的次数是固定的吗K.与基于正弦的延迟滤波器一样,基于拉格朗日的延迟滤波器可以表述为因果FIR卷积(即因果FIR卷积)。 )的长度N=K+1,支持on万博1manbetx索引窗口 .与基于since的模型类似,应用因果延迟 .给定一个分数延迟 , FIR系数 的(因果移位)拉格朗日延迟滤波器可以通过求解线性方程组得到,如下所示。这些方程描述了一个标准的拉格朗日多项式拟合问题。
在这里, 是样本窗口的枚举索引。实现很简单。
过滤参数Fd = 0.4;K = 7;%多项式度N = k +1;% FIR长度idxWindow = (-floor((N-1)/2):floor(N/2))';定义并求解拉格朗日插值方程V = idxWindow.^(0:K);范德蒙结构C = fd .^(0: k);hLagrange = C/V;求出系数i0 = -idxWindow(1);%因果延迟plot_causal_fir (“拉格朗日”FD, N,钱数,hLagrange);
该模型可以实现为一个直接形式的FIR滤波器,如果延迟值FD是固定的,如果延迟值是变化的,则使用法罗结构。下面有一节专门介绍拉格朗日插值的实现dsp。VariableFractionalDelay
在“法罗”
模式。
基于sinc的分数延迟FIR滤波器的设计与实现
下一节将重点介绍基于since的分数延迟滤波器的设计和实现。
这个函数designFracDelayFIR
在基于长度的设计模式
这个函数designFracDelayFIR
提供了一个简单的界面来设计延迟值的分数延迟FIR滤波器FD
以及长度N
.
Fd = 0.32381;N = 10;h = designFracDelayFIR(FD,N)
h =1×100.0046 -0.0221 0.0635 -0.1664 0.8198 0.3926 -0.1314 0.0552 -0.0200 0.0042
滤波器实现可以使用任何标准的FIR滤波器来完成,例如dsp。FIRFilter
系统对象。
创建一个FIR过滤器对象fdfir = dsp.FIRFilter(h);
通过设计的滤波器对信号进行滤波来延迟信号。
%生成一些输入N = (1:100)';X = gen_input_signal(n);对输入信号进行滤波Y = fdfir(x);plot_sequences (x, n, y);传奇(滤波器输出的,原始序列的)标题('原始过滤器输出vs .输入序列')
注意,实际的过滤器延迟不是
,而是
因为因果整数延迟
.
方法返回该延迟designFracDelayFIR
函数作为第二个输出参数。
[h,i0] = designFracDelayFIR(FD,N);
总体延迟仅仅是期望的小数延迟和产生的整数延迟的总和。
Dtotal = i0+FD
Dtotal = 4.3238
这个总延迟也是FIR滤波器在低频时的群延迟。方法进行验证outputDelay
函数。
[Doutput,~,~] = fdfir.outputDelay(Fc=0)
Doutput = 4.3238
将输入序列的图按总延迟移位 将筛选器输出与预期结果对齐。
plot_sequences (n n + Dtotal, x,, y);传奇(滤波器输出的,输入序列(FD+i0移位))标题(“过滤输出vs .时间调整输入序列”)
注意,移位的输入标记位于 一般不与输出样品相符的标记 ,因为 落在x轴上的非整数值上,而n是整数。相反,移位的输入样本大致落在连接每两个连续输出样本的直线上。
plot_sequences (n + i0 + FD, x,, y,“线”);传奇(滤波器输出的,输入序列(FD+i0移位))标题(“输出样本vs .移位的输入样本”) xlim((20、30))
的dsp。VariableFractionalDelay
系统对象“杉”
模式
类似于designFracDelayFIR
,dsp。VariableFractionalDelay
对象还可以设计基于sinc的延迟过滤器。冷杉的
inteprolation模式。首先创建System对象的实例。FIR长度总是偶数,并且被指定为半长参数。
Vfd_fir = dsp。VariableFractionalDelay (“InterpolationMethod”,“杉”,“FilterHalfLength”、N / 2);i0_vfd_fir = vfd_fir.FilterHalfLength;%整数延迟
将所需的小数延迟作为第二个输入参数传递给对象调用。确保您指定的延迟值包括整型延迟。
y = vfd_fir(x,i0+FD);release(vfd_fir) plot_sequences(n+i0+FD,x, n,y);传奇(滤波器输出的,输入序列(FD+i0移位))标题(dsp。VariableFractionalDelay in FIR Mode')
的比较designFracDelayFIR
而且dsp。VariableFractionalDelay
在“FIR”模式
这两个designFracDelayFIR
而且dsp。VariableFractionalDelay
在“杉”
Mode提供基于sin的分数延迟滤波器,但它们的实现不同。
的
dsp。VariableFractionalDelay
用有理数近似延迟值 直到一些公差,然后采样的分数延迟作为k长度的(长)插值滤波器的-th相位l.这需要更多的内存使用,并产生更少的精确延迟。相比之下,
designFracDelayFIR
直接生成FIR系数,而不是从较长的FIR中采样。这给出了精确的延迟分数值,并且占用更少的内存。的
designFracDelayFIR
有一个简单的函数界面返回FIR系数,将过滤器的实现留给用户。的dsp。VariableFractionalDelay
是系统对象,旨在完全封装过滤器的设计和实现。
使用designFractionalDelayFIR
优先于dsp。VariableFractionalDelay
在“杉”
模式以其简单、性能好、效率高而著称。在下图中,设计的滤波器dsp。VariableFractionalDelay
具有更短的带宽,并且其组延迟从标称值关闭~0.02。
从dsp中获取FIR系数。VariableFractionalDelay对象h_vfd_fir = vfd_fir ([1, 0 (31,1)], i0_vfd_fir + FD);释放(vfd_fir);plot_freq_and_gd (h,钱数,[],“designFracDelayFIR”h_vfd_fir i0_vfd_fir, [],“dsp。可变分数延迟FIR模式);持有在;yline (FD,“DisplayName的”,“目标分数延迟”);ylim ([-0.1, 0.4])
基于拉格朗日的延迟滤波器的设计与实现
基于拉格朗日的分数阶延迟滤波器计算成本低,使用法罗结构可以有效地实现。法罗滤波器是一种特殊类型的FIR,它只使用基本的代数运算来实现,比如标量加法和乘法。与基于sin的设计不同,Farrow滤波器不需要专门的功能(例如sinc或贝塞尔),计算延迟FIR系数。这使得Farrow分数延迟滤波器特别容易在基本硬件上实现。
缺点是,基于拉格朗日的延迟滤波器被限制在低阶,这是由于高阶多项式逼近的高度不稳定性质。与基于sinc的滤波器相比,这通常会导致较低的带宽。
系统对象dsp。VariableFractionalDelay
在“法罗”
模式
使用system对象dsp。VariableFractionalDelay
在“法罗”
模式来创建和实现Farrow延迟过滤器。首先创建一个system对象的实例:
VFD = dsp。VariableFractionalDelay (“InterpolationMethod”,“法罗”,“FilterLength”8);i0var = floor(vfd.FilterLength/2)%过滤器整数延迟时间
I0var = 4
将创建的对象应用于输入信号,并绘制结果。
y = vfd(x,i0var+FD);plot_sequences (n n + i0var + FD, x, y);传奇('Farrow分数延迟输出',输入序列(FD+i0移位))标题(dsp。Farrow模式中的VariableFractionalDelay ')
您还可以改变延迟分数值。下面的代码对20个样本帧进行操作,同时增加每一帧的延迟值。注意输出图中延迟的增加,对应于延迟值的变化。
release(vfd) FDs = i0var+5*(0:0.2:0.8);%分数延迟向量xsource = dsp.SignalSource(x,20);ysink = dsp.AsyncBuffer;为FD=FDs xk = xsource();yk = vfd(xk, FD);写(ysink yk);结束Y = read(sink);plot_sequences (n n + i0var, x,, y);传奇(“可变分数延迟输出”,原始序列(移位i0))标题(dsp。Farrow模式中的VariableFractionalDelay,可变延迟)
FIR分数延迟滤波器的带宽分析与设计
较长的滤波器可以更好地近似于理想的延迟滤波器。事实上,在原始二次范数方面是这样的。然而,我们需要一个更有实际意义的指标,比如带宽。这个函数designFracDelayFIR
测量组合带宽,其定义为增益和群时延都在其标称值的1%以内的频率范围。的返回值可以得到测量的组合带宽designFracDelayFIR
函数。比较下图中长度为16的过滤器(蓝色)和长度为256的过滤器(红色)。正如预期的那样,较长的滤波器具有较高的组合带宽。
Fd = 0.3;N1 = 16;N2 = 256;[h1,i1,bw1] = designFracDelayFIR(FD, N1);[h2,i2,bw2] = designFracDelayFIR(FD, N2);plot_freq_and_gd (h1, i1, bw1“N = "+ num2str (N1), h2、i2 bw2,“N = "+ num2str (N2));ylim ([-0.2, 0.6])
这个函数designFracDelayFIR
带宽设计模式
的带宽设计模式designFracDelayFIR
可以确定给定带宽所需的长度。指定延迟值和所需的目标带宽作为函数的输入,函数将找到适当的长度。
Fd = 0.3;bwLower = 0.9;目标带宽下限[h,i0fixed,bw] = designFracDelayFIR(FD,bwLower);fdfir = dsp.FIRFilter(h);信息(fdfir)
ans =6x35字符数组离散时间FIR滤波器(实)' '------------------------------- ' ' 滤波器结构:直接形式冷杉的滤波器长度:52“稳定:是的“线性相位:不”
请注意,bwLower
仅仅是组合带宽的下界。函数返回一个过滤器,其组合带宽至少为中指定的值bwLow
.
高带宽信号中的失真
在本节中,我们将比较两个设计点(长sinc和短Lagrange)在高带宽输入下的性能。的dsp。VariableFractionalDelay
在前一节中是一个8度法罗结构,有效的FIR长度为9。得到的滤波器designFracDelayFIR (FD, 0.9)
长度为52个样本。将两个FIR频率响应放在同一个图上可以显示两者之间的带宽差异。
释放(vfd);hvar = vfd([1; 0 (31,1)],i0var+FD);plot_freq_and_gd (h, i0fixed bw,“Sinc-based”赫瓦尔i0var, [],“法罗”);ylim ([-0.2, 0.6])
在高带宽信号上应用这两个滤波器,如下图所示。左栏是Sinc,右栏是Farrow。时域在上面,频率在下面。结果如预期的那样:
sinc滤波器越长,带宽越高。较短的Farrow滤波器带宽较低。
使用较长的sinc滤波器几乎不存在信号失真,但在较短的Farrow滤波器中很容易注意到。
更高的精度是以更长的延迟为代价的:大约25个样本,而在更短的过滤器中只有4个样本。
n =(接触);X = high_bw_signal(n);Y1 = fdfir(x);y2 = vfd(x,i0var+FD);plot_signal_comparison (n, x, y1, y2, h,赫瓦尔,i0fixed, i0var, FD);
应该使用哪些:dsp。VariableFractionalDelay
或designFracDelayFIR
?
这一决定主要基于过滤器需求和目标平台。
对于高带宽和精确的组延迟响应,请使用
designFracDelayFIR
函数。请记住,这个设计过程的计算量更大。因此,它是否更适合部署在高端硬件上,特别是在需要实时调优延迟值的情况下。它也适用于低端硬件部署,如果延迟值是固定的,并且可以离线进行设计。对于针对低性能计算设备的时变延迟滤波器,请使用
dsp。VariableFractionalDelay
与“法罗”
模式。