如何使用Python复现Adobe Audition的频率分析频谱图
复现Adobe Audition频谱图的修改方案
你当前的结果和Audition不一致核心是三个参数没对齐:音频未做满量程归一化、Welch默认输出功率谱密度而非功率谱、轴范围未匹配。按照以下步骤修改即可:
- 第一步:读取WAV后先把音频数据归一化到[-1, 1]区间。如果是16位WAV除以32768,24位除以8388608,通用做法是除以对应位深的最大正值,这样得到的满量程信号0dBFS对应振幅1,和Audition的计算基准一致。
- 第二步:修改
scipy.signal.welch的scaling参数为spectrum,默认的density输出的是每Hz的功率密度,和Audition展示的单FFT bin总功率数值逻辑不同。 - 第三步:显式设置窗口重叠率为50%,和Audition默认的重叠参数对齐,保证平均逻辑一致。
- 第四步:绘图时匹配Audition的默认轴范围:X轴设为20Hz采样率/2,Y轴设为-120dB0dB,用dBFS作为单位。
修改后的代码如下:
import scipy.io.wavfile as wavfile from scipy import signal import numpy as np from matplotlib import pyplot as plt file2 = r'G:/200460-6-5-0_Mono.wav' file3 = r'G:/205013-6-0-0_Mono.wav' def get_audition_style_spectrum(file_path, fft_size=512): fs, sig = wavfile.read(file_path) # 归一化到[-1,1],适配16位WAV,其他位深修改对应除数即可 sig = sig.astype(np.float32) / 32768.0 # 对齐Audition参数:blackmanharris窗,50%重叠,输出功率谱而非密度 f, Pxx = signal.welch( sig, fs, nperseg=fft_size, window='blackmanharris', noverlap=fft_size//2, scaling='spectrum' ) # 转dBFS,加极小值避免log10(0)报错 pxx_db = 10 * np.log10(Pxx + 1e-12) return f, pxx_db # 计算两个文件的频谱 f1, pxx1 = get_audition_style_spectrum(file2) f2, pxx2 = get_audition_style_spectrum(file3) # 绘图对齐Audition样式 plt.semilogx(f1, pxx1) plt.semilogx(f2, pxx2) plt.xlabel('频率 [Hz]') plt.ylabel('振幅 [dBFS]') # 匹配Audition默认轴范围,可根据需求调整 plt.xlim([20, 20000]) plt.ylim([-120, 0]) plt.grid(which='both', linestyle='-', alpha=0.3) plt.show()
如果需要复现Audition默认的「中心点频率数据」而非全选平均,只需要把Welch方法替换为取信号中间长度为fft_size的片段,加窗后做单次FFT再取模平方转dBFS即可,无需分帧平均。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

