You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:55:24