在线 DFT 算法

信息处理 傅里叶变换 自由度 dct 在线处理
2022-01-28 19:50:17

我有一个离散的音频流x需要实时处理。具体来说,当收到每个新样本时,我想计算最后一个的傅里叶变换n信号的样本。因此,例如,在收到ith示例,我想计算序列的傅里叶变换(xin+1,xin+2,,xi1,xi). 然而,这意味着当我收到(i+1)th样本,我将计算傅里叶变换(xin+2,xin+3,,xi,xi+1),这与第一个序列几乎相同。所以我的问题是,已经计算了第一个序列的傅里叶变换,有没有办法从中计算新的傅里叶变换,而不是每次都从头开始重新计算?

2个回答

(注意:hotpaw2 的链接指向的论文实际上是更详细地描述了我在这里介绍的算法)

考虑数据窗口长度N样品来自n=0n=N1. 让您的原始数据窗口成为x1[n],其第一个样本是xold=x1[0]. 现在您的新数据集表示为x2[n]其样本实际上是一个样本左移版本x1[n], IEx2[n]=x1[n+1]为了n=0,1,...,N2加上一个新到的数据来定位n=N1这表示为xnew=x2[N1].

然后以下算法将计算 N 点 DFT,X2[k]新数据集的x2[n]从已经计算和存储的 N 点 DFTX1[k]旧数据集的x1[n]作为:

X2[k]=ej2πNk(X1[k]+(xnewxold))

对于每个k=0,1,...,N1. 这个更新的计算X2[k]从预先计算X1[k]需要 N 个复数乘法和 N 个实数加法。与需要的直接 N 点 FFT 相比Nlog2(N)复杂的 MAC,因此这将是一个改进的因素log2(N)例如,当N=1024使用低级语言,例如 C。

您可能正在寻找的算法称为“滑动 DFT”。对于少数结果箱,也可以使用该数量的“滑动 Goertzel”过滤器。这是一个在线描述:https ://www.dsprelated.com/showarticle/776.php 如何实现滑动 DFT。

基本上,对于每个新样本,您将一个新的旋转相乘向量添加到求和向量并减去一个历史(保存和/或重新计算的)向量以删除求和的最旧切片,从而保持 DFT 中向量切片的数量总结一样。数值噪声(量化和舍入等)可能会导致该过程在足够多的步数上不稳定,因此可能需要偶尔使用新的完整 DFT 来检查漂移。