读取音频 wav 文件并绘制在 python 中平滑的音频频率响应

Posted

技术标签:

【中文标题】读取音频 wav 文件并绘制在 python 中平滑的音频频率响应【英文标题】:Read audio wav file and plot audio freq response smoothed in python 【发布时间】:2016-02-26 22:55:03 【问题描述】:

我正在使用 python 并希望执行以下操作。我有一个想要读取并绘制频率响应的 wav 音频文件。我只对 3-4 秒的时间窗口感兴趣,而不是整个文件。另外,我想将我的输入文件重新采样为 48k,而不是它的 192k。

我希望我的绘图使用 FFT 长度 8192、汉明窗、logx 刻度从 20 到 20k Hz 的线。

【问题讨论】:

你试过什么?你看过 pygame、pyaudio 和 sox(不是 python 库)来进行下采样吗? 我用 numpy 和 matplotlib 尝试了一些东西,但还没有完全奏效。我曾使用 pyaudio 和 sox 工作过,但不是很熟悉。 另外,如果有更简单的 MATLAB 解决方案,我愿意研究。 【参考方案1】:

在 Python 中并不难,你只需要安装一些包:

import numpy as np
from scipy.io import wavfile
from scipy import signal
from matplotlib import pyplot as plt

sr, x = wavfile.read('file.wav')

x = signal.decimate(x, 4)
x = x[48000*3:48000*3+8192]
x *= np.hamming(8192)

X = abs(np.fft.rfft(x))
X_db = 20 * np.log10(X)
freqs = np.fft.rfftfreq(8192, 1/48000)
plt.plot(freqs, X_db)
plt.show()

什么我不明白,你的时间窗口是 3-4 秒。你的意思是从3秒开始的窗口? (这是在上面的代码中完成的。)或者你的意思是一个持续时间为 3 秒的窗口?那么窗口的长度必须是 3*48000 个样本。

【讨论】:

表示我只对 3:00 - 4:00 的文件感兴趣,3 秒前和 5 秒后无关紧要。【参考方案2】:

Matlab 是最简单的:

[x,fs] = audioread('file.wav');

;; downsample 4:1
x = resample(x, 4, 1);

;; snip 8192 samples 3 seconds in
x = x(48000*3:48000*3+8192);

plot(abs(fft(x));

我会让你按照你想要的方式格式化绘图,但只是提示你需要构建一个频率轴并从 fft 中剪下所需的 bin。

【讨论】:

以上是关于读取音频 wav 文件并绘制在 python 中平滑的音频频率响应的主要内容,如果未能解决你的问题,请参考以下文章

Python绘制wav文件音频图(静态)[matplotlib/wave]

Python解析Wav文件并绘制波形的方法

在 Python 中绘制 Wav 文件视听

这是读取音频文件 FFT 的正确方法吗? (python + wav)

使用python过滤wav文件

创建并使用 WAV 文件作为对象 Python