Я провожу некоторые эксперименты с 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? Спасибо за понимание.