为什么线性调频频率的微小变化会导致快速傅里叶变换输出发生重大变化?

Why is a tiny change in chirp frequency causing a major change in the Fast-Fourier-Tranform output?

我使用 Audacity 生成并导出了两个非常相似的 chirp,每个 1 秒。一个频率为440.00Hz,一个频率为440.01Hz

我使用 Julia 制作了一个简短的脚本来生成 FFT 图:

using WAV
using FFTW
using PyPlot

data, bps = wavread("440.01hz.wav")
plot(fft(data))

440.01 的情节与我的预期相符,在该频率下有一个大峰值: 然而,在确切的整数 440 文件上重复相同的过程产生了这个结果: 一条非常锯齿状的线,没有尖峰。缩小它看起来像这样(x 轴变为 44100,因为那是文件的每秒节拍数): 我用更多的频率重复了这个过程,当频率为非整数时,它似乎总是产生一个好的(合理的?)结果,否则就会产生一个令人困惑的结果。我 运行 遇到了什么问题?

编辑:

文件如下:

440.00Hz http://www.mediafire.com/file/n6erdh3tkzslpro/440.00hz.wav/file

440.01Hz http://www.mediafire.com/file/2au05df2aelmn9o/440.01hz.wav/file

这是两个波的图(几乎无法区分),两个 fft 都放大了:

并缩小:

用于生成这些的代码与上面的代码相同,但有 4 个图(440 WAV、440 FFT、440.01 WAV、440.01 FFT)。

编辑2:

我至少解决了部分问题。如果我在绘制它之前先将 440.00hz wav 的傅里叶变换传递给绝对值函数 plot(fft(data) .|> abs),我会得到正确的结果:

所以我现在知道问题的解决方案,但不知道解决方案为何有效。问题仍然存在:生成没有尖峰的图形的整数频率是什么?或者,同样有效,为什么分数频率用它们生成图表?

(实际)FFT 将您的信号分解为正弦分量之和。

对于每个频率,您都会得到一个复数。 (暂时忽略负频率)实部给出余弦分量,虚部给出正弦分量。

您正在制作一个包含正弦波的 .wav 文件,因此您只能得到正弦分量,但您绘制的是实数分量,因此它们都是 0。

除了... FFT 认为您的信号是周期性的。当您使用任意频率时,您不会以文件中的整数周期结束,因此当它从结尾到开头环绕时会出现不连续性。

由于在这种情况下您的信号不是完美的正弦波,因此您会在余弦分量中获得一些能量。

--

你用这个 FFT 所做的可能与你想做的相去甚远。如果您询问有关如何做您真正想做的事情的问题,我们也许可以提供帮助。