Librosa中fft_frequencies()函数输出含义及是否包含泛音的疑问
librosa.fft_frequencies() 输出含义说明 函数输出的本质
librosa.fft_frequencies(sr=sr, n_fft=Nfft) 返回的是FFT运算对应的频率轴刻度数组,仅由传入的采样率sr和FFT点数n_fft两个参数决定,和你输入的音频内容完全无关。
计算逻辑非常简单:
- 音频的奈奎斯特频率为
sr / 2,也是可分析的最高频率 - n_fft点FFT的正频率区间共
n_fft // 2 + 1个均匀分布的频点,相邻频点的间隔为sr / n_fft
你示例中sr默认是22050Hz,n_fft=256,所以频点间隔为22050 / 256 ≈ 86.13Hz,和你输出的数值步长完全匹配。
关于泛音的疑问解答
这个频率刻度数组本身不包含任何音频的泛音信息,它的作用只是给你后续STFT的结果做频率标注:
- 你代码中得到的
stft复数矩阵,每一行对应freqs里的一个频率值,每一列对应一个时间帧 - 音频里的基频、各次泛音的能量信息,都存储在
stft矩阵的数值大小里。比如你音频里存在基频440Hz的音符,那么它的基频、880Hz二次泛音、1320Hz三次泛音等成分,都会在stft对应频率行的位置呈现较高的能量值,你可以通过freqs定位到这些能量峰值对应的实际频率。
简单来说:freqs是尺子上的刻度,而你音频的泛音是要测量的对象的属性,刻度本身不包含测量对象的信息,只是帮你读数用的。
参考代码与输出
import librosa from scipy import signal y, sr = librosa.load('./data/dreamy.wav') Nfft = 256 stft = librosa.stft(y, n_fft=Nfft, window=signal.windows.hamming) freqs = librosa.fft_frequencies(sr=sr, n_fft=Nfft) print(freqs)
输出示例:
[ 0. 86.1328125 172.265625 258.3984375 344.53125 430.6640625 516.796875 602.9296875 689.0625 775.1953125 861.328125 947.4609375 1033.59375 1119.7265625 1205.859375 ... ]
内容的提问来源于stack exchange,提问作者Ahyun Lee
相关产品推荐
相关产品推荐

