【发布时间】:2016-08-09 17:42:40
【问题描述】:
我正在对音频和图像文件以及快速傅里叶变换 (FFT) 进行一些有趣的实验。
快速傅里叶变换用于信号处理而不是其他傅里叶变换算法,因为对于大量数据,它们是唯一(或唯一)可行的算法变体之一,因为它们的规模为 O(n log(n )),而不是像天真的实现那样 n^2。
缺点是数据必须存储在一个有 2^n 个元素的数组中,对于 n 个整数。
当处理一些没有 2^n 元素的数据时,简单的方法是将数组扩展为长度 2^n 并用零填充“空”元素。 (假设输入信号的平均值为零。)
我编写了一个程序来处理从 WAV 文件中提取的一些音频样本。我尝试实现诸如低切滤波器之类的东西。在这种情况下,我发现我的输出信号(在进行了逆变换之后)在一定的 时间 之后会降低到零幅度。这显然不是人们所期望的低通滤波器。
此时我可以转储我的代码,但这既无用也不合法,因为我的算法的来源是一本封闭源代码的教科书。
我将提出以下问题。
用零填充数组是最好的办法吗?这会导致我的程序产生我看到的意外结果吗?如果我正确理解傅立叶数学,在我的数组末尾有一堆零将引入大量低频和高频内容,因为这基本上看起来像一个阶跃函数(低频方波)。我是否应该做其他事情,例如以不同的方式实现我的带通滤波器,例如,将数据分成较小的组,例如 1024 个样本,并将 FT、滤波器和 IFT(逆 FT)应用于这些小组?
这个问题已被标记为理论,因为它与任何特定的编程语言无关。 (我认为这是要使用的正确标签?)
编辑:它现在运行良好,谢谢大家,我能够使用以下信息查明我犯的 2 个错误。
【问题讨论】:
-
许多 FFT 库支持混合基数大小,而不仅仅是 2^n,但零填充很好。
标签: algorithm signal-processing fft theory