一 概念
最近需要用到这个数据。笔者需要,使用 Python 的numpy
库结合scipy
和matplotlib
库来计算并显示音频数据频谱信息的示例代码。我们将使用scipy.io.wavfile
来读取音频文件,numpy
进行快速傅里叶变换(FFT)计算频谱,最后用matplotlib
来绘制频谱图。
二 源码解析:
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
def plot_audio_spectrum(file_path):
# 读取音频文件
sample_rate, audio_data = wavfile.read(file_path)
# 如果音频是立体声,取单声道数据
if len(audio_data.shape) > 1:
audio_data = audio_data[:, 0]
# 计算音频数据的长度
audio_length = len(audio_data)
# 进行快速傅里叶变换
fft_data = np.fft.fft(audio_data)
# 计算频率轴
frequencies = np.fft.fftfreq(audio_length, 1 / sample_rate)
# 取单边频谱
frequencies = frequencies[:audio_length // 2]
fft_data = 2.0 / audio_length * np.abs(fft_data[:audio_length // 2])
# 绘制频谱图
plt.figure(figsize=(12, 6))
plt.plot(frequencies, fft_data)
plt.title('音频频谱')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.grid()
plt.show()
if __name__ == "__main__":
# 替换为你的音频文件路径
audio_file_path = 'your_audio_file.wav'
plot_audio_spectrum(audio_file_path)
三 代码解析:
- 读取音频文件:使用
scipy.io.wavfile.read
函数读取指定路径的音频文件,返回采样率和音频数据。 - 处理立体声音频:如果音频是立体声(即有多个声道),代码会选取第一个声道的数据进行处理。
- 执行快速傅里叶变换:使用
numpy.fft.fft
函数对音频数据进行快速傅里叶变换,得到频域表示。 - 计算频率轴:使用
numpy.fft.fftfreq
函数计算频率轴,该函数根据采样率和数据长度生成对应的频率值。 - 获取单边频谱:为了方便显示,代码只保留了单边频谱(正频率部分),并对频谱幅值进行归一化处理。
- 绘制频谱图:使用
matplotlib
库绘制频谱图,展示音频数据的频谱信息。
四 效果展示:
笔者使用了一个192khz的原始音频数据,输入了一个20khz左右的tone信号,结果如下所示:
可以看出,能采集到信号的数据。