c++ - 为什么减少窗口长度会导致频谱图中出现空行?

标签 c++ fft speech-recognition fftw spectrogram

我正在尝试在 Qt 中为声音数据绘制适当的频谱图。现在我可以用 fft 窗口长度 1024 和重叠数据长度 976 绘制一个漂亮的频谱图。但是通常使用小窗口长度来绘制频谱图,例如 256,这会给我一个更好的时间分辨率。但是当我将窗口长度减少到 256 时,我在频谱图中得到了空行。我知道减少窗口长度会导致 FFT 的频率分辨率降低,但为什么其他程序的频谱图中没有任何空行。我做错了什么或者这个结果正常吗?

以下是我用来获取频谱图的主要步骤: - 从声音文件中获取数据。 -FFT 在第一个窗口(汉宁)。 -将复杂的 fft 输出转换为幅度数组(幅度 = sqrt(re^2 + im^2)) -将幅度转换为对数刻度(dB) magnitude_dB = 20*log10(magnitude) - 通过缩放频谱数据以将其固定到列中来绘制频谱图的第一列 -将窗口移动48个样本,为下一步操作..

您可以在这些屏幕截图中看到问题: window length 1024 window length 256

(顺便说一句,我的目标是制作一个可以从语​​音数据中识别音素的程序。使用 FFTW 库)

非常感谢您提供的任何帮助。

最佳答案

较短的 FFT 长度的较低分辨率也意味着每个 FFT 结果 bin 的带宽较宽。因此,光谱图需要更粗的行线来覆盖每行的更宽带宽,以填充图中线之间的间隙。

关于c++ - 为什么减少窗口长度会导致频谱图中出现空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16649464/

相关文章:

python - 如何使用 FFT 进行一维反卷积?

matlab - 频率:在MATLAB中使用FFT的分贝图

ffmpeg - 如何使用 Google 的 Cloud Speech-to-Text REST API 转录视频

c++ - Qt如何连接rubberBandChanged信号

c++ - 使用 C++ 在 char 数组最后一个索引中添加值

c++ - g++ 链接到外部库创建 undefined reference

machine-learning - 语音识别方面有现有的研究可以区分不同人的声音吗?

java - UDP 数据报 Socket 编程与服务器在 JAVA 和客户端在 C++

python - 为方波函数的值创建数组

python - Try子句中的语音识别和Shutil问题