使用Python生成FFT波形匹配Adobe Audition频率分析结果求助
频谱匹配调整方案
你当前代码与Adobe Audition频谱结果不一致的核心原因是四个配置差异,按以下步骤调整即可:
核心调整点
- 增加窗函数:Audition默认使用汉宁窗抑制频谱泄露,直接对原始信号做FFT会出现能量分布偏差
- 幅度单位转换为dB:Audition频谱纵坐标为对数分贝单位(通常为dBFS),你当前使用的是线性幅度刻度
- 归一化逻辑对齐:需要结合音频位深做满量程归一化,匹配Audition的0dBFS满量程参考标准
- 可选:频率轴改为对数刻度:如果Audition频谱使用对数频率轴,可新增x轴刻度配置
完整可运行调整后代码
import scipy.io.wavfile as wavfile import scipy.fftpack import numpy as np from matplotlib import pyplot as plt file1 = r'G:/file1.wav' fs_rate, signal = wavfile.read(file1) print("采样频率", fs_rate) l_audio = len(signal.shape) print("声道数", l_audio) if l_audio == 2: signal = signal.sum(axis=1) / 2 N = signal.shape[0] print("总采样点数 N", N) secs = N / float(fs_rate) print("音频时长", secs) Ts = 1.0/fs_rate print("采样间隔 Ts", Ts) t = np.arange(0, secs, Ts) # 1. 新增汉宁窗,匹配Audition默认窗函数配置 window = np.hanning(N) signal_windowed = signal * window # 2. FFT计算 FFT = scipy.fftpack.fft(signal_windowed) FFT_side = FFT[:N//2] freqs = scipy.fftpack.fftfreq(signal.size, Ts) freqs_side = freqs[:N//2] # 3. 幅度转dBFS,对齐Audition刻度 # 16位音频最大幅值为32767,若为24位可替换为8388607 max_amp = 32767 amplitude = 2.0/N * np.abs(FFT_side) amplitude_dB = 20 * np.log10(amplitude / max_amp) plt.plot(freqs_side/1000, amplitude_dB) plt.xlabel('频率 (kHz)') plt.ylabel('幅度 (dBFS)') # 可选:如果Audition用对数频率轴,取消下面一行注释 # plt.xscale('log') # 匹配Audition常用纵坐标范围 plt.ylim(-120, 0) plt.grid(True, alpha=0.3) plt.show()
额外参数校准说明
如果仍有细微差异,可调整两个参数匹配Audition的设置:
- FFT长度:Audition频率分析窗口可设置FFT大小(1024/2048/4096等),如果不是对全量音频做FFT,可截取对应长度的音频片段再计算
- 窗函数类型:如果Audition设置了汉明窗、矩形窗等其他窗函数,把
np.hanning替换为对应窗函数即可
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

