matplotlib - 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()
如代码中所述,我正在分析 2 秒、440 赫兹的测试音,两端都填充了 0.5 秒的静音,但在图像中,信号从 1 秒开始并持续到 3 秒。对于较小的nperseg
值,这种差异不会产生太大的差异,但对于较大的值和音乐数据,差异可能很大,因为它决定了 STFT 是在节拍(所需的行为)还是在节拍(不希望的行为)上将其帧居中,因为那样它会从两个连续的节拍中涂抹数据)。
我对 STFT 分析设置有误解吗?感谢您的任何见解。
解决方案
推荐阅读
- django - Django url dispatch error - AttributeError: 'WSGIRequest' object has no attribute 'data'
- python - Is there a way to guarantee that coroutines have been started before doing something that will allow them to finish?
- r - 带有 x10^x 符号 ggplot 标题的换行符
- tableau-api - 如何将网络上的数据导入 Tableau?
- json - 用bash中的空格解析JSON数组
- c# - 如何声明一个包含委托的元组?
- python - 尝试在 Windows 上使用 igraph,但 python 无法加载 cairo
- css - 在表单顶部设置固定导航
- amazon-web-services - 在负载均衡器上使用 SSL 的 CNAME
- c# - 从asp.net中的列表中提取特定数据