我已经开始研究 DSP 并实现了短时傅里叶变换,使用 KissFFT 来执行 FFT。然后我渲染一个频谱图。
我生成的示例图像如下所示。上面是我的实现中的音乐文件的频谱图,下面是从 audacity 生成的同一部分的频谱图。
我担心的是我的实现中出现的垂直线,它们在较高频率中最明显。他们可能会干扰我稍后会尝试做的其他事情。有没有人遇到过同样的问题或知道原因?我怎样才能摆脱它们?
附加信息:我使用 50% 重叠的汉明窗(使用不同的窗没有帮助)
我已经开始研究 DSP 并实现了短时傅里叶变换,使用 KissFFT 来执行 FFT。然后我渲染一个频谱图。
我生成的示例图像如下所示。上面是我的实现中的音乐文件的频谱图,下面是从 audacity 生成的同一部分的频谱图。
我担心的是我的实现中出现的垂直线,它们在较高频率中最明显。他们可能会干扰我稍后会尝试做的其他事情。有没有人遇到过同样的问题或知道原因?我怎样才能摆脱它们?
附加信息:我使用 50% 重叠的汉明窗(使用不同的窗没有帮助)
在这个问题上浪费了永远之后,我发现这只是一个窗口函数的问题。嗬!
非零端的窗函数会产生这些垂直线。例如,矩形窗、汉明窗、高斯窗(具有低 sigma)产生这些线,而巴利特窗、汉宁窗、布莱克曼窗、韦尔奇窗则不会。
我曾尝试过其他窗口功能,但也许在我的测试过程中,我犯了一个编码错误,所以我没有找到解决办法。故事的寓意:仔细做测试!
您看到的垂直线可能正在剪裁。我假设您拍摄了一个响亮的 MP3 文件,将其解码为线性 PCM-Wave 之类的东西,然后进行剪辑并用它来输入您的程序。据我所知,Audacity 在内部将 MP3 解码为 32 位浮点数,不会出现剪辑问题。这可以解释为什么 Audacity 频谱图看起来很干净。
因此,如果这是真的,那么您的软件可能还可以,但您的 MP3 声音太大了。压缩伪影将使样本值超出有效范围,并且输出整数样本的解码器将不得不进行裁剪。
一系列重叠的 FFT 结果中的垂直线可能是脉冲噪声的结果,它是宽频谱的。这可能是由馈送到光谱仪 FFT 的某个子集的某些音频数据中的错放样本、跳过样本、归零样本或严重失真样本引起的。如果它以近乎无声的方式出现,它可能是样本或算术量化噪声,如果您正在寻找远高于本底噪声的某个阈值的起始点,您可以丢弃这些东西。
正如您所见,您所看到的是频谱泄漏,它确实会根据窗口函数而有所不同。在窗函数选择中,需要权衡频率分辨率、频谱泄漏和幅度精度。fft 的某些应用可能会发现 boxcar/无窗函数的主要频谱泄漏是可以接受的,因为频率分辨率更好。
对于随机音频数据的视觉读出,比如你的频谱图,像 hanning 这样的窗口函数会做得更好。