Python 3D 频谱图(类似于 matlab 的频谱图函数)
Python spectrogram in 3D (like matlab's spectrogram function)
我的问题如下:
我拥有频谱图所需的所有值 (scipy.fftpack.fft
)。我想在 python 中创建一个 3D 频谱图。
在 MATLAB 中,这是一个非常简单的任务,而在 python 中,它似乎要复杂得多。我尝试了 mayavi,3D 绘图 matplotlib,但我没有设法做到这一点。
谢谢
我的代码:
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()
类似的未回答问题:How to convert a spectrogram to 3d plot. Python
python 中的所需绘图,如 Matlab 的图形(此处最后一个绘图:https://www.mathworks.com/help/signal/ref/spectrogram.html)
你只需要让你的阵列形状正确:
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()
这是@Nils Werner 的回答的改编版本,其中包含不同的变量名和一组完整的导入。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal # spectrogram function
from matplotlib import cm # colour map
# basic config
sample_rate = 11240. #
sig_len_secs = 10
frequency = 2000.
# generate the signal
timestamps_secs = np.arange(samplerate*sig_len_secs) / sample_rate
mysignal = np.sin(2.0 * np.pi * frequency * timestamps_secs)
# extract the spectrum
freq_bins, timestamps, spec = signal.spectrogram(mysignal, sample_rate)
# 3d plot
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(freq_bins[:, None], timestamps[None, :], 10.0*np.log10(spec), cmap=cm.coolwarm)
plt.show()
我的问题如下:
我拥有频谱图所需的所有值 (scipy.fftpack.fft
)。我想在 python 中创建一个 3D 频谱图。
在 MATLAB 中,这是一个非常简单的任务,而在 python 中,它似乎要复杂得多。我尝试了 mayavi,3D 绘图 matplotlib,但我没有设法做到这一点。
谢谢
我的代码:
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()
类似的未回答问题:How to convert a spectrogram to 3d plot. Python
python 中的所需绘图,如 Matlab 的图形(此处最后一个绘图:https://www.mathworks.com/help/signal/ref/spectrogram.html)
你只需要让你的阵列形状正确:
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()
这是@Nils Werner 的回答的改编版本,其中包含不同的变量名和一组完整的导入。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal # spectrogram function
from matplotlib import cm # colour map
# basic config
sample_rate = 11240. #
sig_len_secs = 10
frequency = 2000.
# generate the signal
timestamps_secs = np.arange(samplerate*sig_len_secs) / sample_rate
mysignal = np.sin(2.0 * np.pi * frequency * timestamps_secs)
# extract the spectrum
freq_bins, timestamps, spec = signal.spectrogram(mysignal, sample_rate)
# 3d plot
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(freq_bins[:, None], timestamps[None, :], 10.0*np.log10(spec), cmap=cm.coolwarm)
plt.show()