Когда я использую plt.specgram из matplotlib, используя следующий код, генерируемая спектрограмма является правильной
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
Pxx, freqs, bins, im = plt.specgram(samples[:,1], NFFT=1024, Fs=44100, noverlap=900)
Однако, если я сгенерирую спектрограмму, используя пример кода, указанный на странице scipy со следующим кодом, я получу что-то вроде этого:
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
frequencies, times, spectrogram = signal.spectrogram(samples[:,1],sample_rate,nfft=1024,noverlap=900, nperseg=1024)
plt.pcolormesh(times, frequencies, spectrogram)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
Чтобы отладить происходящее, я попытался использовать Pxx
, freqs
, bins
, сгенерированные первым методом, а затем использовать второй метод для вывода данных:
plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
Сгенерированный график почти такой же, как график, сгенерированный вторым методом.
Так что, похоже, с scipy.signal.spectrogram
проблем нет. Проблема в том, как мы строим график. Интересно, является ли plt.pcolormesh
правильным способом построения спектрограммы, несмотря на тот факт, что этот метод предлагается в scipy документе
Подобный вопрос был задан здесь , но пока нет решения вопроса.