使用matplotlib创建wav文件的频谱图

4
import scipy.io.wavfile as wav
import matplotlib.pyplot as plt
import scipy
sample_rate, X = wav.read("/Users/sinaastani/Downloads/partynextdoor.wav")
X = scipy.mean(X, axis=1)
plt.specgram(X, Fs=sample_rate, xextent=(0,30))

我执行上述代码时遇到了错误:
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/matplotlib/axes/_axes.py:7017: RuntimeWarning: divide by zero encountered in log10
  Z = 10. * np.log10(spec)

这发生在我尝试过的多个wav文件中。我只是试图复制《使用Python构建机器学习系统-第二版》中的一个示例。
wavfile.read函数返回一个numpy数组。看起来在这个数组的开头和结尾有很多0值,所以当它尝试计算log(0)时,它是未定义的。应该如何处理?我应该简单地从数组中去掉0值吗?

1
为什么不试试会发生什么?由于缺失值可能会成为后续分析的问题,您也可以将它们设置为 nan 或您喜欢的最小正数,X[X == 0] = scipy.nanX[X == 0] = 1.e-18。但是,我不确定这是否真的是问题所在。我故意将一些值设置为 0,但我尝试过的文件代码仍然可以正常运行。你的代码中哪一行产生了上述错误? - ImportanceOfBeingErnest
这是numpy数组的角落值,它是我的示例中的变量“X”。对specgram的调用使用数组值执行对数计算,因此这就是导致错误的原因。 - ohbrobig
2
我的观点是,您可以调用 plt.specgram(np.zeros(1000)) 而不会出现错误。因此,数组中的零不能是错误的原因。naninf 也不可能是错误的原因。 - ImportanceOfBeingErnest
1个回答

0
使用plt.specgram()的参数NFFT。因为该参数默认为256,导致出现错误。您可以通过将其乘以2增加此数字,直到错误消失为止。尝试512 - 1024 - 2048等数字,问题就解决了! :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接