为啥啁啾频率的微小变化会导致快速傅里叶变换输出发生重大变化?

Posted

技术标签:

【中文标题】为啥啁啾频率的微小变化会导致快速傅里叶变换输出发生重大变化?【英文标题】:Why is a tiny change in chirp frequency causing a major change in the Fast-Fourier-Tranform output?为什么啁啾频率的微小变化会导致快速傅里叶变换输出发生重大变化? 【发布时间】:2019-12-06 03:48:10 【问题描述】:

使用 Audacity,我生成并导出了两个非常相似的啁啾声,每个 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),我会得到正确的结果:

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

【问题讨论】:

我无法使用 Julia 1.0.5、FFTW 0.3.0 和 UnicodePlots 使用大胆(1 秒,啁啾 440->440 和 440.01->440.01,否则为默认值)重新创建问题。在 440 左右的 real 值在两个信号之间几乎相同。你能检查一下findmax(real.(y[1:1000,1]))y=fft(x) 的位置吗? 因为这相当令人惊讶,我们都怀疑用户错误或文件损坏。这就是为什么我询问绘制信号的原因。我建议您编写一个脚本来加载两个信号并将它们以及它们的 FFT 绘制到同一图形的子图中。不要放大或以其他方式修改数字。显示脚本和运行脚本的结果。 我建议您将您的 .wav 文件上传到某个地方,其中包含有关准确采样率的信息。 我现在编辑了帖子以包含音频文件。 findmax(real.(y[1:1000,1])) 对于 440 是 (0.001139456477261394, 655) 对于 440.01 是 (553.9923751934822, 441) FFT 产生复数结果,而不是实数结果。 Plot 仅绘制实部,对于整数 Hz,实部为零,因为 .wav 文件的长度以及它从 0 开始。 【参考方案1】:

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

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

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

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

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

--

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

【讨论】:

好吧,我认为我正在使用 FFT 做的正是我想要做的,但您可以自己判断:我用于计算音频文件中的频谱通量。顺便谢谢你的回答。 这通常是通过比较频谱图的连续片段来计算的。你可以使用这个,例如:juliadsp.github.io/DSP.jl/stable/periodograms/…

以上是关于为啥啁啾频率的微小变化会导致快速傅里叶变换输出发生重大变化?的主要内容,如果未能解决你的问题,请参考以下文章

离散傅里叶变换:2D 周期信号的逆会导致频率加倍

为啥在执行快速傅里叶变换时需要遮罩?

Python_opencv_傅里叶变换

傅里叶变换2

实验数据的傅里叶变换

图片处理-opencv-12.图像傅里叶变换