сигнал внизу. Спектрограмма для построения графика - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы построить спектрограмму файла 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()

enter image description here

Это работает хорошо, но проблема в том, что для вычисления требуется немного времени и особенно для отображения. Это связано с тем, что размер спектрограммы действительно велик: Sxx.shape == (129, 32626), намного больше, чем нужно для отображения на экране. Есть ли способ «уменьшить частоту» спектрограммы? Возможно, уже можно сэкономить время и в signal.spectrogram.

...