我需要知道一种方法,使FFT(DFT)仅使用n个点,其中n不是2的幂。
我想分析修改声谱,特别是Wave-Files,它们共有44100个采样点。但我的FFT不起作用,它只适用于形状像2 ^ n的点。
那我该怎么办?除了用零填充向量到下一个2的幂? 有什么方法可以修改FFT算法吗?
谢谢!
答案 0 :(得分:3)
除了按照您的建议填充数组或使用其他库函数之外,您还可以在频域中构建具有任意长度和间距的傅里叶变换(也适用于非整数样本间距)。
这是众所周知的结果,基于Chirp-z变换(or Bluestein's FFT)。 Rabiner给出了另一个很好的参考,可以在上面的链接中找到。
总之,使用这种方法,您不必自己编写FFT,只需使用现有的高性能FFT,然后将convolution theorem应用于信号的适当缩放和调节版本。
性能仍为O(n * log n)乘以某些依赖于实现的比例因子。
答案 1 :(得分:2)
您可以使用FFTW库或Spiral项目的代码生成器。它们对具有小素因子的数字实施FFT,通过将其减小到大小为(p-1)甚至等的FFT来分解大的素因子p。
然而,仅仅为了进行信号分析,为什么要分析一秒钟的声音而不是更小的单位是值得怀疑的。此外,您可能希望使用窗口过程来避免段末端的跳转。
答案 2 :(得分:0)
FFT只是计算某些长度矢量的DFT的更快方法;并且可以针对任何长度的输入矢量计算DFT。您也可以将输入向量填充到FFT库支持的长度,这可能更快。
如果要修改声音文件,可能需要在确定频域修改的脉冲响应长度后使用重叠加法或重叠保存快速卷积滤波。