OpenCV使用傅里叶变换得到频谱图

OpenCV using Fourier Transform to get frequency spectrogram

我用我的麦克风捕获了一个输入声音信号,并在 OpenCV Mat 中将其可视化:

我读取每 20 个样本(="sound-mat" 的 x 方向上的每 20 个像素)并将其与 hann-window 函数相乘。 然后,我在这个 windowed 序列的 OpenCV (docs here) 中执行 dft(离散傅里叶变换)。 以下是此类 20 样本信号的 dft 的幅度输出示例:

但是我怎样才能得到频谱图呢?所描述的尝试是否正确?我必须如何处理这些 dft 输出才能获得频谱图?

抱歉没有 post 图片;只有链接。由于我是Whosebug的新手,我无法直接post图片。

20 个样本通常太短,无法获得合理的频率范围和分辨率(这取决于样本频率,如 44100 Hz)。

当您进行 FT 并计算从 t 开始的某个时间范围内的震级时,在 X 坐标 t 处构建垂直线段。此段上的 Y 坐标是频率 - 通常使用对数刻度。像素强度是频率 f 附近某个范围内的幅度值的总和(您也可以使用强度的颜色编码)。

幅度数组的第 l 个条目对应于频率

f=2*Pi*F/N

其中 F - 离散化(样本)频率(如 44100 Hz),N - 傅立叶变换的大小(如 1024)

伪代码
PixelValue[x = a * t, y = b * log2(i)] = c * Sum(l=i/2..i) FTAmplitude[l]

a,b,c 为比例系数。

这不适用于此类图像。 您必须使用一维矢量(OpenCV 中的一维垫不存在),其大小与音频信号的长度相同。

你必须在 windowed(例如 hann-window)声音部分上执行 dft/fft。对每个部分执行此操作,以便获得每个此类部分的频率。输出可以放在一起形成频谱图。