我正在尝试将一个wav文件的stft转换为chromagram。
这是我的代码: -
def stft(x,fs,framesize,hopsize):
frame = int(framesize*fs)
hop = int(hopsize*fs)
w = scipy.hamming(frame)
X = scipy.array([scipy.fft(w*x[i:i+frame])])
for i in range(0,len(x)-frame,hop)
return X
这是色度图的代码: -
def chromagram(x,fs,framesize,hopsize):
X = stft(x,fs,framesize,hopsize)
chroma = np.fmod(np.round(np.log2(X / 440) * 12), 12)
return chroma
当我计算fft时,我得到一个具有复数值的数组,所以我必须在计算色度之前将结果转换为浮点数。我在这里做错了吗?
另外,我如何绘制结果?
答案 0 :(得分:0)
我不认为,这样做是可行的。在X
中,您拥有复值STFT。您可以使用np.abs(X)
获取其幅度值。您想申请this formula吗?这是为了将频率转换为音符,但在X
中没有频率。您可以使用np.fft.fftfreq(framesize, 1.0/fs)
获得相应的频率。
如果您不想将Bregman Audio-Visual Information Toolbox用于色度要素,并希望为自己实现它们,则可以移植Matlab Chroma Toolbox。我认为他们使用滤波器组而不是FFT。在此页面上,您可以找到有关色度特征详细解释的参考文献。
无论如何,如果你有色度特征,你可以像imshow
一样用任何二维数组绘制它们。
from matplotlib import pyplot as plt
import numpy as np
X = np.random.random((30, 30))
plt.imshow(X)
plt.show()