-
-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Consider the following spectrogram animation, matplotlib seems leaks memory when switched to log scale on the Y axis, for the functions pcolorfast, pcolormesh, imshow and specgram
from scipy.signal.spectral import spectrogram
from scipy.signal.waveforms import chirp
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
fs = 8000 # sampling rate
t = np.arange(0, 5.0, 1/fs) # 5 seconds of time
fig, axes = plt.subplots(nrows=1)
def signal(t): # generates a "chirp" signal
return chirp(t = t, f0 = 100.0, f1 = 3000.0, t1 = 10.0)
def spect(x): # computes spectrogram
freq, time, Sxx = spectrogram(x, fs = fs, nfft = 1024, noverlap = 512, nperseg = 1024)
Z = 10 * np.log10(Sxx)
return freq, time, Z
y = signal(t)
freq, time, Z = spect(y)
im = axes.pcolorfast(time, freq, Z)
axes.set_xlabel('t [s]')
axes.set_ylabel('f [Hz]')
axes.set_yscale('log') # <-- exposes the leak
axes.set_ylim(0, fs/2)
def animate(i):
y = signal(t + i/30.0) # sliding temporal window
freq, time, Z = spect(y)
im.set_data(Z)
return [ im ]
ani = animation.FuncAnimation(fig, animate, np.arange(1, 200),
interval=0, blit=True)
plt.show()
Everything stays stable if we switch to a linear scale on the Y axis, commenting out the line
axes.set_yscale('log')
Metadata
Metadata
Assignees
Labels
No labels