我有一个离散的音频流需要实时处理。具体来说,当收到每个新样本时,我想计算最后一个的傅里叶变换信号的样本。因此,例如,在收到示例,我想计算序列的傅里叶变换. 然而,这意味着当我收到样本,我将计算傅里叶变换,这与第一个序列几乎相同。所以我的问题是,已经计算了第一个序列的傅里叶变换,有没有办法从中计算新的傅里叶变换,而不是每次都从头开始重新计算?
在线 DFT 算法
信息处理
傅里叶变换
自由度
dct
在线处理
2022-01-28 19:50:17
2个回答
(注意:hotpaw2 的链接指向的论文实际上是更详细地描述了我在这里介绍的算法)
考虑数据窗口长度样品来自到. 让您的原始数据窗口成为,其第一个样本是. 现在您的新数据集表示为其样本实际上是一个样本左移版本, IE为了加上一个新到的数据来定位这表示为.
然后以下算法将计算 N 点 DFT,新数据集的从已经计算和存储的 N 点 DFT旧数据集的作为:
对于每个. 这个更新的计算从预先计算需要 N 个复数乘法和 N 个实数加法。与需要的直接 N 点 FFT 相比复杂的 MAC,因此这将是一个改进的因素例如,当使用低级语言,例如 C。
您可能正在寻找的算法称为“滑动 DFT”。对于少数结果箱,也可以使用该数量的“滑动 Goertzel”过滤器。这是一个在线描述:https ://www.dsprelated.com/showarticle/776.php 如何实现滑动 DFT。
基本上,对于每个新样本,您将一个新的旋转相乘向量添加到求和向量并减去一个历史(保存和/或重新计算的)向量以删除求和的最旧切片,从而保持 DFT 中向量切片的数量总结一样。数值噪声(量化和舍入等)可能会导致该过程在足够多的步数上不稳定,因此可能需要偶尔使用新的完整 DFT 来检查漂移。
其它你可能感兴趣的问题