将stft转换为色度并绘制结果

时间:2013-12-27 13:59:43

标签: python audio numpy matplotlib

我正在尝试将一个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时,我得到一个具有复数值的数组,所以我必须在计算色度之前将结果转换为浮点数。我在这里做错了吗?

另外,我如何绘制结果?

1 个答案:

答案 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()

random imshow example