Я хотел бы построить спектрограмму файла MP3. С этой целью я придумал
import matplotlib.colors as colors
import matplotlib.pyplot as plt
import numpy
from pydub import AudioSegment
from scipy import signal
filename = "a.mp3"
track = AudioSegment.from_file(filename)
out = numpy.array(track.get_array_of_samples()).reshape(-1, track.channels)
f, t, Sxx = signal.spectrogram(
out[:, 0], fs=track.frame_rate, scaling="spectrum", mode="magnitude",
)
# Make sure all values are positive for the log scaling
smallest_positive = numpy.min(Sxx[Sxx > 0])
Sxx[Sxx < smallest_positive] = smallest_positive
plt.pcolormesh(
t, f, Sxx, norm=colors.LogNorm(vmin=1.0e-2, vmax=Sxx.max()),
)
plt.ylabel("Frequency [Hz]")
plt.xlabel("Time [sec]")
plt.colorbar()
plt.show()
Это работает хорошо, но проблема в том, что для вычисления требуется немного времени и особенно для отображения. Это связано с тем, что размер спектрограммы действительно велик: Sxx.shape == (129, 32626)
, намного больше, чем нужно для отображения на экране. Есть ли способ «уменьшить частоту» спектрограммы? Возможно, уже можно сэкономить время и в signal.spectrogram
.