Hier kann ich ein Signal erzeugen:Wie kann ich ein Spektrogramm eines Signals plotten, indem ich das Leistungsspektrum von in einem Fenster angeordneten Fenstern berechne?
import numpy as np
from matplotlib import pyplot as plt
from numpy.lib import stride_tricks
import seaborn as sns
sns.set(style = "darkgrid")
fs = 48000.0
t = np.arange(0, 10, 1.0/fs) # 0 to 10 sec at 48k samples per second
f0 = 1000
phi = np.pi/2 # pi/2
x = 0 # initial x
f = [500, 100, 40, 1] #vector of frequencies
A = [1, 0.5, 0.25, 0.1] #vector of amplitudes
for i in range(0, len(f)):
x = x + A[i] * np.sin(2 * np.pi * f[i] * t + phi) #add waves
x = x + max(x) # shift plot upwards
plt.plot(t, x)
plt.axis([0, .05, 0, max(x)])
plt.xlabel('time')
plt.ylabel('amplitude')
plt.show()
Hier kann ich das Leistungsspektrum des gesamten Signals Grundstück:
time_step = 1/fs
ps = np.abs(np.fft.fft(x))**2
freqs = np.fft.fftfreq(x.size, time_step)
idx = np.argsort(freqs)
plt.plot(freqs[idx], 256*ps[idx]/max(ps[idx])) # set max to 256 for later image plotting purposes
plt.xlabel('frequency')
plt.ylabel('power')
plt.show()
Next I generieren möchten ein Spektrogramm, dargestellt als ein Bild der Frequenz (y-Achse) und der Zeit (x-Achse), aber ich bin neu zu Fourier Analyse und bin verwirrt darüber, wie man eine window function (rechteckig, Hamming, Hanning, etc) während dieser Phase verwenden. Gibt es einen geeigneten Weg dies zu tun, so dass eine Fensterfunktion meiner Wahl verwendet werden kann, um das Signal rechtzeitig aufzubrechen?