Центрирование фрейма анализа для scipy.signal.stft (и несоответствие в графике matplotlib) - PullRequest
1 голос
/ 20 января 2020

Я провожу некоторые эксперименты с STFT Сципи и хотел бы подтвердить, что я все правильно понимаю.

Следующий код генерирует изображение, которое я ожидал, но помеченное с неправильными значениями времени:

from math import ceil, log
from scipy.io.wavfile import read
from scipy.signal import stft
import numpy as np
import matplotlib.pyplot as plt

# read a 2s, 440 Hz test tone, padded with 0.5s of silence on either end
fs, x = read('a440_2s_padded.wav')
nperseg = 44100
# pick an FFT size that's the smallest power of 2 >= the window size
nfft = pow(2, ceil(log(nperseg, 2)))
# N.B. no overlap between windows
f, t, Zxx = stft(x, fs, 'blackman', nperseg=nperseg, noverlap=0, nfft=nfft, boundary='zeros')

# crop the display to relevant bins
minBin, maxBin = 600, 700

# plot it
plt.pcolormesh(t, f[minBin:maxBin], np.abs(Zxx[minBin:maxBin]), vmin=None, vmax=None)
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

выход STP matplotlib

Как отмечено в коде, я анализирую тестовый сигнал 2 с, 440 Гц, дополненный 0,5 с тишины на любом из них. конец, но на изображении сигнал начинается с 1 с и длится до 3 с. Для малых значений nperseg это расхождение не имеет большого значения, но для больших значений и музыкальных данных разница может быть существенной, поскольку она определяет, центрирует ли STFT свои кадры в пределах ударов ( желаемое поведение), или на ударов (нежелательно, потому что тогда происходит размазывание данных от двух последовательных ударов).

Я что-то неправильно понимаю в настройках анализа STFT? Спасибо за понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...