मेरा प्रश्न निम्नलिखित है:

मेरे पास एक स्पेक्ट्रोग्राम (scipy.fftpack.fft) के लिए आवश्यक सभी मान हैं। मैं अजगर में एक 3D स्पेक्ट्रोग्राम बनाना चाहूंगा।

MATLAB में यह एक बहुत ही सरल कार्य है, जबकि अजगर में यह बहुत अधिक जटिल लगता है। मैंने मायावी, 3डी प्लॉटिंग मैटप्लोटलिब की कोशिश की लेकिन मैं ऐसा करने में कामयाब नहीं हुआ।

धन्यवाद


मेरा कोड:

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()


इसी तरह का अनुत्तरित प्रश्न: एक स्पेक्ट्रोग्राम को 3डी प्लॉट में कैसे बदलें। अजगर

मैटलैब के फिगर की तरह अजगर में वांछित प्लॉट (यहां अंतिम प्लॉट: https://www। mathworks.com/help/signal/ref/spectrogram.html)

enter image description here

4
user8925657 27 जून 2019, 13:12

1 उत्तर

सबसे बढ़िया उत्तर

आपको बस अपने सरणियों को सही आकार में लाने की आवश्यकता है:

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()
5
Nils Werner 27 जून 2019, 15:06