首页 > 解决方案 > scipy.signal.stft 的分析框架居中(和 matplotlib 绘图差异)

问题描述

我正在用 Scipy 的 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()

matplotlib STFT 输出

如代码中所述,我正在分析 2 秒、440 赫兹的测试音,两端都填充了 0.5 秒的静音,但在图像中,信号从 1 秒开始并持续到 3 秒。对于较小的nperseg值,这种差异不会产生太大的差异,但对于较大的值和音乐数据,差异可能很大,因为它决定了 STFT 是节拍(所需的行为)还是节拍(不希望的行为)上将其帧居中,因为那样它会从两个连续的节拍中涂抹数据)。

我对 STFT 分析设置有误解吗?感谢您的任何见解。

标签: matplotlibaudioscipysignal-processing

解决方案


推荐阅读