主要内容

分数延迟FIR滤波器的设计

分数延迟滤波器的目的是通过插值和重采样组合成一个单一的卷积滤波器来移动一个非整数值的数字序列。本示例演示了使用DSP System Toolbox™中的工具设计和实现分数延迟FIR滤波器。

延迟作为一个卷积系统

整数时延时延

考虑数字信号的延迟, y n x n - D 在哪里D整数形式。这个操作可以表示为卷积滤波器 y h x ,脉冲响应是有限的 h n δ n - D .对应的传递函数为 H z z - D ,频率响应为 H ω e - ω 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插值的非整数延迟

延迟序列 x n - D 当D不是整数时,没有定义。为了使这种分数延迟有意义,需要添加一个中间D/A插值阶段,以便对连续统上的输出进行采样。也就是说, y n x n ˆ n - D 在哪里 x n ˆ 表示输入序列的一些D/A插值 x .D/A插值函数 x n ˆ 可以依赖于N,可以认为作为底层模拟信号模型的一种表示,从该模拟信号模型中得到序列 x 是采样。该策略也用于其他重采样问题,如速率转换。

本例将使用两种插值模型来实现分数延迟滤波器,这两种模型都是DSP系统工具箱的一部分。

  1. 基于正弦的插值模型,它使用带宽有限的重建 x n ˆ

  2. 基于拉格朗日的插值模型,它使用多项式重建 x n ˆ

带宽限制的分数延迟滤波器

Shannon-WhittakeR插值公式 x ˆ t k x k sinc t - k 建模带宽有限的信号。也就是中间D/A转换 x ˆ 是输入序列的带限重构。对于延迟值D,分数延迟 y n x ˆ n - D ,使用相同的方法 x ˆ 对于每一个n,都可以用卷积滤波器表示。这个过滤器被称为理想的限带分数延迟滤波器,及其脉冲响应是

h D k sinc k - D

相应的频率响应(即DTFT)由 H D ω e - ω D

理想限带移位滤波器的因果FIR近似

理想的sinc上一节中描述的Shift滤波器是一个全通滤波器(即。 | H d ω | 1 ),但它有一个无限的非因果的脉冲响应 h D .在MATLAB中,它不能表示为一个向量,而是表示为一个索引的函数k

%理想滤波器序列D = 0.4;hIdeal = @(k) sinc(k- d);

为了实际和计算的目的,理想滤波器可以在有限的索引窗口上截断,代价是一些带宽损失。的目标延迟值 D 一个期望的长度N,指数窗口 k 令人满意的 | D - k | N 2 是对称的 D ,并捕获理想滤波器的主瓣。为 D 0 + FD 在哪里 0 FD 1 和一个整数 0 ,显式窗口索引为 0 - N - 1 2 ... 0 + N 2 .整数 0 被称为整数的延迟,可以任意选择。要使FIR具有因果关系,请设置 0 N - 1 2 ,则索引窗口为 0 ... N - 1 .下面的代码描述了因果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);

图中包含2个轴对象。轴对象1,标题为基于分数延迟非因果FIR,截断于[-2:3],包含茎型、斑块型、散点型、直线型、恒直线型6个对象。这些对象表示截断FIR,反因果指数,因果指数,理想滤波器。轴对象2,标题为因果移位的基于分数延迟FIR,截断在[0:5]包含3个对象类型为stem, patch, constantline。这些对象表示截断因果FIR,所有因果指数。

sinc滤波器的截断会导致频率响应中的纹波,这可以通过施加权重来解决 w k (如Kaiser或Hamming)的FIR系数。

最后,所得的理想限带分数延迟滤波器的FIR近似模型如下所示。

h k w k h d k w k 年代 n c k - F D - 0 0 k N - 1 0 否则

属性可以设计这样的筛选器designFracDelayFIR功能和dsp。VariableFractionalDelay系统对象™“杉”模式,两者都使用Kaiser窗口权重。

基于拉格朗日的分数延迟滤波器

基于拉格朗日的分数延迟滤波器在输入样本的移动窗口上使用多项式拟合。也就是说, x n ˆ t 多项式的次数是固定的吗K.与基于正弦的延迟滤波器一样,基于拉格朗日的延迟滤波器可以表述为因果FIR卷积(即因果FIR卷积)。 y h x )的长度N=K+1,支持on万博1manbetx索引窗口 - N - 1 2 ... N 2 .与基于since的模型类似,应用因果延迟 0 N - 1 2 .给定一个分数延迟 FD , FIR系数 h 0 ... h K 的(因果移位)拉格朗日延迟滤波器可以通过求解线性方程组得到,如下所示。这些方程描述了一个标准的拉格朗日多项式拟合问题。

k 0 K t n k h k F D n n 0 ... K

在这里, t 0 ... t K 是样本窗口的枚举索引。实现很简单。

过滤参数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);

图中包含2个轴对象。axis对象1,标题为Lagrange-based分数延迟非因果FIR,支持于[-3:4],包含stem, patch, constantline万博1manbetx类型的4个对象。这些对象表示FIR,反因果指数,因果指数。axis对象2,标题为拉格朗日基于分数延迟FIR的因果移位,支持于[0:7],包含3个类型为stem, patch, constantline的对象。万博1manbetx这些对象表示因果FIR,即所有因果指数。

该模型可以实现为一个直接形式的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 .输入序列'

图中包含一个轴对象。标题为Raw Filter Output vs .s. Input Sequence的axes对象包含2个散点类型的对象。这些对象表示过滤器输出,原始序列。

注意,实际的过滤器延迟不是 FD ,而是 FD + 0 因为因果整数延迟 0 方法返回该延迟designFracDelayFIR函数作为第二个输出参数。

[h,i0] = designFracDelayFIR(FD,N);

总体延迟仅仅是期望的小数延迟和产生的整数延迟的总和。

Dtotal = i0+FD
Dtotal = 4.3238

这个总延迟也是FIR滤波器在低频时的群延迟。方法进行验证outputDelay函数。

[Doutput,~,~] = fdfir.outputDelay(Fc=0)
Doutput = 4.3238

将输入序列的图按总延迟移位 FD + 0 将筛选器输出与预期结果对齐。

plot_sequences (n n + Dtotal, x,, y);传奇(滤波器输出的输入序列(FD+i0移位))标题(“过滤输出vs .时间调整输入序列”

图中包含一个轴对象。标题为Filter Output vs . Time Adjusted Input Sequence的axes对象包含2个散点类型的对象。这些对象表示Filter Output, Input Sequence(按FD+i0移位)。

注意,移位的输入标记位于 n + FD + 0 x n 一般不与输出样品相符的标记 n y n ,因为 n + FD + 0 落在x轴上的非整数值上,而n是整数。相反,移位的输入样本大致落在连接每两个连续输出样本的直线上。

plot_sequences (n + i0 + FD, x,, y,“线”);传奇(滤波器输出的输入序列(FD+i0移位))标题(“输出样本vs .移位的输入样本”) xlim((20、30))

图中包含一个轴对象。标题为Output Samples vs .s. moved Input Samples的axis对象包含3个类型为scatter、line的对象。这些对象表示Filter Output, Input Sequence(按FD+i0移位)。

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'

图中包含一个轴对象。axis对象的标题为dsp。VariableFractionalDelay在FIR Mode contains 2 objects of type scatter. These objects represent Filter Output, Input Sequence (shifted by FD+i0).

的比较designFracDelayFIR而且dsp。VariableFractionalDelay在“FIR”模式

这两个designFracDelayFIR而且dsp。VariableFractionalDelay“杉”Mode提供基于sin的分数延迟滤波器,但它们的实现不同。

  • dsp。VariableFractionalDelay用有理数近似延迟值 FD k l 直到一些公差,然后采样的分数延迟作为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])

图中包含2个轴对象。带有标题增益响应的坐标轴对象1包含2个类型为line的对象。这些对象分别表示Gain ResponsedesignFracDelayFIR, Gain Response dsp。VariableFractionalDelay FIR模式。axis对象2,标题为Group Delay (i0已调整),包含3个类型为line, constantline的对象。这些节点分别代表组延迟designFracDelayFIR,组延迟dsp。VariableFractionalDelay FIR模式,目标分数延迟。

基于拉格朗日的延迟滤波器的设计与实现

基于拉格朗日的分数阶延迟滤波器计算成本低,使用法罗结构可以有效地实现。法罗滤波器是一种特殊类型的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 '

图中包含一个轴对象。axis对象的标题为dsp。VariableFractionalDelay在Farrow Mode contains 2 objects of type scatter. These objects represent Farrow Fractional Delay Output, Input Sequence (shifted by FD+i0).

您还可以改变延迟分数值。下面的代码对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,可变延迟

图中包含一个轴对象。axis对象的标题为dsp。VariableFractionalDelay在Farrow Mode, Varying Delay contains 2 objects of type scatter. These objects represent Variable Fractional Delay Output, Original Sequence (shifted by i0).

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])

图中包含2个轴对象。带有标题Gain响应的坐标轴对象1包含4个类型为line、constantline的对象。这些对象表示增益响应值=16,增益响应值N=256,合并带宽值N=16,合并带宽值N=256。axis对象2,标题为Group Delay (i0已调整),包含4个类型为line, constantline的对象。这些节点分别表示组时延N=16、组时延N=256、组合带宽N=16、组合带宽N=256。

这个函数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])

图中包含2个轴对象。带有标题增益响应的坐标轴对象1包含2个类型为line的对象。这些对象表示基于Gain responsesinc的Gain Response Farrow。标题为Group Delay (i0已调整)的Axes对象2包含2个类型为line的对象。这些对象表示基于分组延迟的分组延迟法罗。

在高带宽信号上应用这两个滤波器,如下图所示。左栏是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);

图中包含4个轴对象。标题为designFracDelayFIR的axis对象1包含4个类型为line, scatter的对象。这些对象表示真实输入信号(延迟),滤波信号。坐标轴对象2包含2个line类型的对象。这些对象表示信号,FIR增益。轴对象3与标题dsp。VariableFractionalDelayc在tains 4 objects of type line, scatter. These objects represent True Input Signal (delayed), Filtered signal. Axes object 4 contains 2 objects of type line. These objects represent Signal, FIR Gain.

应该使用哪些:dsp。VariableFractionalDelaydesignFracDelayFIR?

这一决定主要基于过滤器需求和目标平台。

  • 对于高带宽和精确的组延迟响应,请使用designFracDelayFIR函数。请记住,这个设计过程的计算量更大。因此,它是否更适合部署在高端硬件上,特别是在需要实时调优延迟值的情况下。它也适用于低端硬件部署,如果延迟值是固定的,并且可以离线进行设计。

  • 对于针对低性能计算设备的时变延迟滤波器,请使用dsp。VariableFractionalDelay“法罗”模式。