36 lines
953 B
Python
36 lines
953 B
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
Fs = 1 # Hz
|
|
N = 100 # number of points to simulate, and our FFT size
|
|
|
|
t = np.arange(N) # because our sample rate is 1 Hz
|
|
s = np.sin(0.15*2*np.pi*t)
|
|
#s = s * np.hamming(100)
|
|
S = np.fft.fftshift(np.fft.fft(s))
|
|
S_mag = np.abs(S)
|
|
S_phase = np.angle(S)
|
|
f = np.arange(Fs/-2, Fs/2, Fs/N)
|
|
#plt.figure(0)
|
|
#plt.plot(f, S_mag,'.-')
|
|
#plt.figure(1)
|
|
#plt.plot(f, S_phase,'.-')
|
|
#plt.show()
|
|
|
|
|
|
# simulate the signal above, or use your own signal
|
|
|
|
x = 20
|
|
|
|
fft_size = 1024
|
|
sample_rate = 512
|
|
num_rows = len(s) // fft_size # // is an integer division which rounds down
|
|
spectrogram = np.zeros((num_rows, fft_size))
|
|
for i in range(num_rows):
|
|
spectrogram[i,:] = 10*np.log10(np.abs(np.fft.fftshift(np.fft.fft(x[i*fft_size:(i+1)*fft_size])))**2)
|
|
|
|
plt.imshow(spectrogram, aspect='auto', extent = [sample_rate/-2/1e6, sample_rate/2/1e6, len(s)/sample_rate, 0])
|
|
plt.xlabel("Frequency [MHz]")
|
|
plt.ylabel("Time [s]")
|
|
plt.show()
|