使用scipy.signal.spectrogram进行玩耍。对于它的用途来说效果很好。
这是结果: 但频率轴是线性的。对于音频来说,这通常不是理想的 - 至少不是我想要的。
有没有办法让scipy.signal.spectrogram输出对数频率刻度?
如果scipy无法实现这一点,您能否推荐一个同样简单的方法来获得这个结果?
编辑:问题不在于图像的显示方式。问题在于
我已经将代码更改为:
现在图像看起来是这样的: f向量(由
这是线性分布。我需要更多的点在底部,而在顶部则需要更少的点。
from scipy.io import wavfile
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
sf, audio = wavfile.read('serious.wav')
sig = np.mean(audio, axis=1)
f, t, Sxx = signal.spectrogram(sig, sf, scaling='spectrum')
plt.pcolormesh(t, f, np.log10(Sxx))
plt.ylabel('f [Hz]')
plt.xlabel('t [sec]')
plt.show()
这是结果: 但频率轴是线性的。对于音频来说,这通常不是理想的 - 至少不是我想要的。
有没有办法让scipy.signal.spectrogram输出对数频率刻度?
如果scipy无法实现这一点,您能否推荐一个同样简单的方法来获得这个结果?
编辑:问题不在于图像的显示方式。问题在于
signal.spectrogram()
生成数据的方式。我已经将代码更改为:
plt.pcolormesh(t, f, np.log10(Sxx))
plt.ylabel('f [Hz]')
plt.xlabel('t [sec]')
plt.yscale('log')
plt.savefig('spec.png')
plt.show()
现在图像看起来是这样的: f向量(由
signal.spectrogram()
生成)长成这个样子:array([ 0. , 172.265625, 344.53125 , 516.796875,
689.0625 , 861.328125, 1033.59375 , 1205.859375,
1378.125 , 1550.390625, 1722.65625 , 1894.921875,
2067.1875 , 2239.453125, 2411.71875 , 2583.984375,
...
19982.8125 , 20155.078125, 20327.34375 , 20499.609375,
20671.875 , 20844.140625, 21016.40625 , 21188.671875,
21360.9375 , 21533.203125, 21705.46875 , 21877.734375,
22050. ])
这是线性分布。我需要更多的点在底部,而在顶部则需要更少的点。
pcolormesh
之后设置plt.xscale('log')
应该可以解决你的问题。 - alkasmplt.ylim(100, 22050)
来调整图形的频率限制。 - SleuthEye