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