使用 linux 命令行从 WAV/RIFF 获取频谱

zse*_*edc 11 linux audio spectrum sox spectrogram

如何生成包含 wav/riff 声音文件频率频谱的文件?我想使用 linux 命令行。

我知道很酷的 sox 函数来生成 png 频谱图

sox sound.wav -n spectrogram
Run Code Online (Sandbox Code Playgroud)

但我不需要频率频谱的视觉表示。我只想在数据文件中获取频谱,以便我可以处理它们。我相信必须有使用 sox 的选项。Sox 需要在绘制数据之前生成该数据。如何得到这个?

不确定,也许第二个解决方案是将 wav 文件导出到 dat 文件中。来自 dat 文件的每个样本都是膜在某一时刻的位置的度量。所以这不是频谱。

sox sound.wav file.dat
Run Code Online (Sandbox Code Playgroud)

如何将这些膜位置转换为我需要的光谱?

谢谢。

小智 6

您可以尝试 sox 中的 stat 选项。

play track.wav stat -freq
Run Code Online (Sandbox Code Playgroud)


Wil*_*ert 6

怎么样:

sox sound.wav -n stat -freq &> file.dat
Run Code Online (Sandbox Code Playgroud)

这将产生file.dat如下内容:

// snip
23941.406250  175.471481
23953.125000  180.637909
23964.843750  188.179977
23976.562500  515.783813
23988.281250  1035.087280
Samples read:            618496
Length (seconds):      6.442667
Scaled by:         2147483647.0
Maximum amplitude:     0.999969
Minimum amplitude:    -1.000000
Midline amplitude:    -0.000015
Mean    norm:          0.232281
Mean    amplitude:     0.018063
RMS     amplitude:     0.382168
Maximum delta:         1.999969
Minimum delta:         0.000000
Mean    delta:         0.285226
RMS     delta:         0.483500
Rough   frequency:         9665
Volume adjustment:        1.000
Run Code Online (Sandbox Code Playgroud)


mti*_*935 4

您正在寻找的称为傅里叶变换,或快速傅里叶变换(FFT)。FFT 是一种数学算法,可将 .wav 文件中包含的时域样本(即膜在时间点上的位置)转换为频率分量。如果您 Google FFT,您会找到更多信息,包括可以在 Linux 中编译和重用的源代码。请参阅如何使用 FFT 绘制 wav 文件的频谱?一个好的开始。