使用 Farrow 结构实现具有拉格朗日插值的可变分数延迟

信息处理 插值 延迟
2022-02-17 03:16:57

我正在编写一个在时域工作的 C++ 仿真软件。我生成定期采样的数据,并需要通过可变分数延迟“实时”延迟它们。

这是一个非常常见的问题,并且非常接近所有“重采样”问题。经过简短的书目搜索,似乎最常用的方法是具有 Farrow 结构的拉格朗日插值法。基于JO Smith,“插值延迟线、理想带限插值和分数延迟滤波器设计”,我使用了以下实现:

法罗结构

其中包括具有固定系数的级联滤波器,由取决于可变延迟的级联因子调制。这可以在等式中看出1+z1

H^Δ(q1)=n=0Nh^Δ[n](q1)n.

我在 C++ 中的实现适用于高达 51 的插值阶数。不幸的是,对于较大的插值阶数,数值误差会迅速增加并占主导地位。经过快速检查,似乎缓冲样本在个索引递增的单元格中具有递增的数量级。当我使用 时它会有所帮助左右的浮点值与 1 的值组合时,我们会失去很多数值1+z1long double10101

您是否知道 Farrow 结构的变体或拉格朗日插值的另一种实现,它适用于大订单,即在仅需要内存缓冲区中合理的数值精度的同时保持计算效率?

提前感谢您的时间:)

1个回答

手头的任务很常见。大多数符号时序同步器需要完全按照您的描述进行。

许多类型的重采样器也是如此——它们需要从输入样本流中重建不同的部分样本间“快照”,以构建非理性相关的速率输出。

所以这就是我开始寻找的地方。

事实上,farrow 结构的想法让你走得很远!

想象一下,您可以拥有大量线性相位滤波器。线性相位滤波器具有恒定的群延迟。

通过调制所述滤波器,您可以改变相位斜率,从而改变群延迟。现在,您只需选择适合您需求的过滤器。

在多相滤波器组中,例如由 GNU Radio “PFB Arbitrary Resampler” 块实现的,正是这样做的:你构建了一大堆滤波器,对于每个样本,选择最接近你需要的一个(或两个最接近,并在这些之间线性插值)。
因为它被用作重采样器,所以对于每个非 1.0 的重采样率,下一个样本将从不同的过滤器分支中选择,并具有适当的延迟。

现在,由于您大多数时候只想延迟,因此您很少需要该重采样器的“重采样”功能。(重采样正是线性改变延迟时发生的事情)

因此,相反,您将拥有一个过滤器(如果可能,请使用您需要的过滤器),并且您可以对其进行调制。

在频域中考虑这一点:假设您有一个线性的、连续的傅立叶变换应用于您的信号,并将其与滤波器脉冲响应的 FT 和相乘,然后再转换回时域。要调整延迟,请调整太棒了!可变分数延迟。ej2πτfτ

问题当然是你在 DSP 中,所以你没有得到线性傅里叶变换来实现线性卷积;你得到了 DFT,但离散频域中的乘法相当于时域中的循环卷积。

但这已经解决了——快速卷积允许您轻松应用长滤波器(以及低数值问题——FFT 异常稳定,通常比直接卷积更稳定!)。现在,如果您继续并通过重叠保存方法来实现它,您需要做的就是确保复指数的相位不会在 FFT 段之间“跳跃”。然后,您可以(甚至优雅地!)更改各个卷积之间τ