【发布时间】:2017-06-08 18:39:53
【问题描述】:
我正在尝试理解 FFT,这是我目前所掌握的:
为了找到波形中频率的幅度,必须通过将波乘以它们正在搜索的频率来探测它们,在两个不同的相位(sin 和 cos)中并取平均值。阶段是通过它与两者的关系来找到的,其代码是这样的:
//simple pseudocode
var wave = [...]; //an array of floats representing amplitude of wave
var numSamples = wave.length;
var spectrum = [1,2,3,4,5,6...] //all frequencies being tested for.
function getMagnitudesOfSpectrum() {
var magnitudesOut = [];
var phasesOut = [];
for(freq in spectrum) {
var magnitudeSin = 0;
var magnitudeCos = 0;
for(sample in numSamples) {
magnitudeSin += amplitudeSinAt(sample, freq) * wave[sample];
magnitudeCos += amplitudeCosAt(sample, freq) * wave[sample];
}
magnitudesOut[freq] = (magnitudeSin + magnitudeCos)/numSamples;
phasesOut[freq] = //based off magnitudeSin and magnitudeCos
}
return magnitudesOut and phasesOut;
}
为了非常快速地对很多频率执行此操作,FFT 使用了许多技巧。
使 FFT 比 DFT 快得多的捷径是什么?
附:我曾尝试在网上查看完整的 FFT 算法,但所有技巧都倾向于浓缩成一段漂亮的代码,没有太多解释。在我理解整个事情之前,我首先需要的是对这些有效变化中的每一个作为概念进行介绍。
谢谢。
【问题讨论】:
-
三角函数的对称性和周期性浮现在脑海中。我认为 MIT 的 Gil Strang 给出了一个了不起的解释:ocw.mit.edu/courses/mathematics/…
-
这是我最容易理解的两个。还有其他一些我觉得更奇怪的,只是简单地提到,比如位反转。谢谢你的视频。光是它的长度就让我犹豫不决,不确定它是否包含我正在寻找的答案,但它确实让我离知道我在寻找什么更近了一步。
-
FFT 比 DFT 更快,主要是因为它涉及的计算量更少。如果样本数为 2^n,则数学中有可用的快捷方式。有一些微妙之处;一些高度优化(最少计算)的 FFT 算法不能很好地与 CPU 缓存配合使用,因此它们比其他算法慢。不用担心 - 如果您使用像 FFTW 这样的预先优化的库,您将获得一个针对速度优化的 FFT 算法,而不是针对最少的计算次数。很多速度来自预先计算 FFT 的指数(它们是常数)。
-
我也在 DSP 上问过这个问题,尽管答案对于转换成代码并不简单。 dsp.stackexchange.com/questions/41558/…
-
本质上就是DFT = O(n^2), FFT = O(n log n)。
标签: algorithm audio fft waveform spectrum