通过Librosa中的fft_frequencies()函数获取频率



我想知道fft_frequencies((函数的输出数组是什么意思。

我听说每个音符都有泛音,
但输出数组似乎每秒每个音符只包含一个频率。

我想知道,如果阵列已经包括泛音。

我写的代码如下:

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
... ]

FFT或STFT不会像在乐谱中那样产生音符。相反,它提供特定频率仓的幅度和相位。fft_frequencies()以赫兹(Hz(为单位提供这些频率仓。请注意,这与泛音无关。

您可能正在寻找的是Constant-Q-Transform(又名CQT(,它可以被配置为提供类似于";注释";。然而,它将包含泛音。如果你真的在追求单个音符,你可能想试试Mauch和Dixon的pYIN算法。

librosa恰好提供了CQT和pYIN实现。你可以在这里和这里找到文档。

最新更新