dan*_*dle 13 python audio matplotlib spectrogram
在Pylab中,该specgram()函数为给定的幅度列表创建频谱图,并自动为频谱图创建窗口.
我想生成频谱图(瞬时功率由下式给出Pxx),通过在其上运行边缘检测器对其进行修改,然后绘制结果.
(Pxx, freqs, bins, im) = pylab.specgram( self.data, Fs=self.rate, ...... )
Run Code Online (Sandbox Code Playgroud)
问题是每当我尝试Pxx使用imshow或甚至修改修改时NonUniformImage,我都会遇到下面的错误消息.
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/image.py:336:UserWarning:非线性轴不支持图像.warnings.warn("非线性轴不支持图像.")
例如,我正在使用的代码的一部分在下面.
# how many instantaneous spectra did we calculate
(numBins, numSpectra) = Pxx.shape
# how many seconds in entire audio recording
numSeconds = float(self.data.size) / self.rate
ax = fig.add_subplot(212)
im = NonUniformImage(ax, interpolation='bilinear')
x = np.arange(0, numSpectra)
y = np.arange(0, numBins)
z = Pxx
im.set_data(x, y, z)
ax.images.append(im)
ax.set_xlim(0, numSpectra)
ax.set_ylim(0, numBins)
ax.set_yscale('symlog') # see http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_yscale
ax.set_title('Spectrogram 2')
Run Code Online (Sandbox Code Playgroud)
如何使用matplotlib/pylab绘制具有对数y轴的图像数据?
Joe*_*ton 19
使用pcolor或pcolormesh.pcolormesh更快,但仅限于直线网格,其中pcolor可以处理任意形状的单元格. (它使用specgram使用pcolormesh,如果我没记错的话.imshow.)
作为一个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
z = np.random.random((11,11))
x, y = np.mgrid[:11, :11]
fig, ax = plt.subplots()
ax.set_yscale('symlog')
ax.pcolormesh(x, y, z)
plt.show()
Run Code Online (Sandbox Code Playgroud)

您所看到的差异是由于绘制了specgram返回的"原始"值.什么specgram实际绘制一个缩放版本.
import matplotlib.pyplot as plt
import numpy as np
x = np.cumsum(np.random.random(1000) - 0.5)
fig, (ax1, ax2) = plt.subplots(nrows=2)
data, freqs, bins, im = ax1.specgram(x)
ax1.axis('tight')
# "specgram" actually plots 10 * log10(data)...
ax2.pcolormesh(bins, freqs, 10 * np.log10(data))
ax2.axis('tight')
plt.show()
Run Code Online (Sandbox Code Playgroud)

请注意,当我们使用绘制内容时pcolormesh,没有插值.(这是pcolormesh- 它只是矢量矩形而不是图像的一部分.)
如果你想要日志规模的东西,你可以使用pcolormesh它:
import matplotlib.pyplot as plt
import numpy as np
x = np.cumsum(np.random.random(1000) - 0.5)
fig, (ax1, ax2) = plt.subplots(nrows=2)
data, freqs, bins, im = ax1.specgram(x)
ax1.axis('tight')
# We need to explictly set the linear threshold in this case...
# Ideally you should calculate this from your bin size...
ax2.set_yscale('symlog', linthreshy=0.01)
ax2.pcolormesh(bins, freqs, 10 * np.log10(data))
ax2.axis('tight')
plt.show()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
19917 次 |
| 最近记录: |