我想知道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实现。你可以在这里和这里找到文档。