如何用Python从WAV文件生成Audacity风格(Hann窗、对数刻度)频谱图?
生成类似Audacity的频谱数据的Python工具
要生成和Audacity(Hann窗、对数刻度)一致的频谱数据,推荐用以下几个Python库组合:
核心库选择
- scipy.io.wavfile:快速读取WAV文件的采样率和原始音频数据
- numpy:实现Hann窗生成、FFT(快速傅里叶变换)计算,以及对数刻度转换
- matplotlib(可选):如果需要把频谱数据可视化成类似Audacity的图,用它来绘图
- librosa(进阶选择):封装了更便捷的音频处理API,能更高效地完成分帧、加窗、频谱计算等操作
示例代码(基础实现)
用scipy+numpy+matplotlib的组合,实现从WAV文件生成频谱数据并绘图:
import numpy as np from scipy.io import wavfile import matplotlib.pyplot as plt # 读取WAV文件 sample_rate, audio_data = wavfile.read("your_audio.wav") # 处理立体声:如果是双声道,转单声道(取其中一个通道或者平均) if len(audio_data.shape) > 1: audio_data = audio_data.mean(axis=1) # 参数设置(匹配Audacity常用默认值) frame_size = 1024 # 帧长 hop_length = frame_size // 4 # 帧移,通常设为帧长的1/4 n_fft = frame_size # 生成Hann窗 hann_window = np.hanning(frame_size) # 分帧并加窗 frames = np.array([ audio_data[i:i+frame_size] * hann_window for i in range(0, len(audio_data) - frame_size, hop_length) ]) # 计算FFT并取幅度谱 fft_frames = np.fft.rfft(frames, n=n_fft) magnitude_spectrum = np.abs(fft_frames) # 转换为对数刻度(dB),加小偏移避免log(0)报错 log_spectrum = 20 * np.log10(magnitude_spectrum + 1e-10) # 获取频率轴 freq_axis = np.fft.rfftfreq(n_fft, 1/sample_rate) # 可视化(类似Audacity的频谱图) plt.figure(figsize=(12, 6)) plt.imshow( log_spectrum.T, origin="lower", aspect="auto", extent=[0, len(audio_data)/sample_rate, freq_axis[0], freq_axis[-1]] ) plt.yscale("log") # 设置对数频率轴 plt.colorbar(label="幅度 (dB)") plt.xlabel("时间 (秒)") plt.ylabel("频率 (Hz)") plt.title("Hann窗对数频谱图") plt.show()
进阶:用librosa简化操作
librosa封装了更成熟的音频处理流程,代码更简洁:
import librosa import librosa.display import matplotlib.pyplot as plt # 读取WAV文件 audio_data, sample_rate = librosa.load("your_audio.wav", sr=None) # 计算对数幅度谱(使用Hann窗) stft = librosa.stft(audio_data, n_fft=1024, hop_length=256, window="hann") log_spectrum = librosa.amplitude_to_db(np.abs(stft), ref=np.max) # 可视化 plt.figure(figsize=(12, 6)) librosa.display.specshow( log_spectrum, sr=sample_rate, hop_length=256, x_axis="time", y_axis="log" ) plt.colorbar(label="幅度 (dB)") plt.title("Hann窗对数频谱图") plt.show()
以上代码生成的log_spectrum变量,就是和Audacity用Hann窗、对数刻度生成的一致的频谱数据,可直接提取用于后续分析。
内容的提问来源于stack exchange,提问作者pablo99
相关产品推荐
相关产品推荐

