3D模式下的Python频谱图(如Matlab的频谱图函数) [英] Python spectrogram in 3D (like matlab's spectrogram function)

查看:156
本文介绍了3D模式下的Python频谱图(如Matlab的频谱图函数)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题如下:

我拥有一张光谱图所需的所有值( scipy.fftpack.fft ).我想在python中创建3D频谱图.

在MATLAB中,这是一个非常简单的任务,而在python中,这似乎要复杂得多.我尝试了mayavi,3D绘制matplotlib绘制,但我没有做到这一点.

谢谢


我的代码:

 将numpy导入为np将熊猫作为pd导入将numpy导入为np从scipy导入信号导入matplotlib.pyplot作为plt从mpl_toolkits.mplot3d导入Axes3D从matplotlib导入cm从matplotlib.collections导入PolyCollectionfs = 11240.t = 10时间= np.arange(fs * t)/fs频率= 1000.mysignal = np.sin(2.0 * np.pi *频率*时间)nperseg = 2 ** 14noverlap = 2 ** 13f,t,Sxx = signal.spectrogram(mysignal,fs,nperseg = nperseg,noverlap = noverlap)myfilter =(f> 800)&(f <1200)fig,ax = plt.subplots()plt.pcolormesh(t,f [myfilter],10 * np.log10(Sxx [myfilter,:]),cmap ='jet')plt.show()无花果= plt.figure()ax = fig.gca(投影='3d')x = []y = []对于计数器,我在枚举(f)中:x.append(np.array([i对于t中的k]))y.append(t)ax.plot_surface(np.array(x),np.array(y),10.0 * np.log10(Sxx),cmap = cm.coolwarm)plt.show() 


类似的未解决问题:

解决方案

您只需要将数组设置为正确的形状即可:

  fs = 11240.t = 10时间= np.arange(fs * t)/fs频率= 1000.mysignal = np.sin(2.0 * np.pi *频率*时间)nperseg = 2 ** 14noverlap = 2 ** 13f,t,Sxx = signal.spectrogram(mysignal,fs,nperseg = nperseg,noverlap = noverlap)myfilter =(f> 800)&(f <1200)f = f [myfilter]Sxx = Sxx [myfilter,...]无花果= plt.figure()ax = fig.gca(投影='3d')ax.plot_surface(f [:, None],t [None,:],10.0 * np.log10(Sxx),cmap = cm.coolwarm)plt.show() 

My question is the following:

I have all the values that I need for a spectrogram (scipy.fftpack.fft). I would like to create a 3D spectrogram in python.

In MATLAB this is a very simple task, while in python it seems much more complicated. I tried mayavi, 3D plotting matplotlib but I have not managed to do this.

Thanks


My code:

import numpy as np
import pandas as pd
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.collections import PolyCollection

fs = 11240.
t = 10
time = np.arange(fs*t) / fs
frequency = 1000.
mysignal = np.sin(2.0 * np.pi * frequency * time)

nperseg = 2**14
noverlap = 2**13
f, t, Sxx = signal.spectrogram(mysignal, fs, nperseg=nperseg,noverlap=noverlap)

myfilter = (f>800) & (f<1200)

fig,ax = plt.subplots()

plt.pcolormesh(t, f[myfilter], 10*np.log10(Sxx[myfilter, :]), cmap='jet')
plt.show()

fig = plt.figure()
ax = fig.gca(projection='3d')
x = []
y = []

for counter,i in enumerate(f):
    x.append(np.array([i for k in t]))
    y.append(t)

ax.plot_surface(np.array(x), np.array(y), 10.0*np.log10(Sxx), cmap=cm.coolwarm)
plt.show()


Similar unanswered question: How to convert a spectrogram to 3d plot. Python

Desired plot in python like Matlab's figure (last plot here: https://www.mathworks.com/help/signal/ref/spectrogram.html)

解决方案

You just need to get your arrays in the right shape:

fs = 11240.
t = 10
time = np.arange(fs*t) / fs
frequency = 1000.
mysignal = np.sin(2.0 * np.pi * frequency * time)

nperseg = 2**14
noverlap = 2**13
f, t, Sxx = signal.spectrogram(mysignal, fs, nperseg=nperseg,noverlap=noverlap)

myfilter = (f>800) & (f<1200)

f = f[myfilter]
Sxx = Sxx[myfilter, ...]

fig = plt.figure()
ax = fig.gca(projection='3d')

ax.plot_surface(f[:, None], t[None, :], 10.0*np.log10(Sxx), cmap=cm.coolwarm)
plt.show()

这篇关于3D模式下的Python频谱图(如Matlab的频谱图函数)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆