scipy.signal.spectrogram输出不如预期

时间:2016-10-03 14:45:16

标签: python scipy signal-processing fft spectrogram

我正在使用scipy.signal.spectrogram()来分析包含当前值的数据集。我对该功能的输入如下:

f, t, Sxx = signal.spectrogram(y, fs)

(用于在子图3中绘图(从顶部开始)我使用plt.pcolormesh(t, f, Sxx)

其中y是10002个值的列表,包含第一个图中绿色图的y值(从顶部开始)。 fs = 1/T其中T = x[1]-x[0]其中x是属于y值(当前)的x值(时间)列表。

我的问题是

t[-1]-t[0] != x[-1]-x[0]

含义:我想将图3与图1中的绿色图进行比较,当这两个图的时间范围不同时,频谱图就变得无用了。您可以从图片中看到total_length_x > total_length_t

enter image description here

为什么会这样?我能做些什么来使频谱范围与我原始数据的时间跨度相同?

1 个答案:

答案 0 :(得分:0)

我写了一些代码来解释我上面关于数据大小的评论:

#!/usr/bin/env python

import numpy as np
import scipy.signal
from scipy.signal import spectrogram

WINDOW_LEN = 256
OVERLAP_LEN = WINDOW_LEN / 8
DATA_LEN = 10002
DURATION = 2.0001997
fs =  (DATA_LEN - 1) / DURATION
eps = 1/(fs * 1000.0)

y = np.random.rand(DATA_LEN)
x = np.arange(0, DURATION + 1/fs, 1/fs)

f, t, Sxx = spectrogram(y, fs=fs, nperseg=WINDOW_LEN)

T = np.zeros( int(1 +  np.floor((len(y) - WINDOW_LEN) / (WINDOW_LEN - OVERLAP_LEN))) )

T[0] = x[WINDOW_LEN / 2]
T[1:] = [x[WINDOW_LEN / 2 + (n + 1) * (WINDOW_LEN - OVERLAP_LEN)] for n in np.arange(0,len(T) - 1)]


if all(t - T < eps):
    print (t - T)
    print "All are fine"
    print x[-1] - x[0]
    print t[-1] - t[0]
    print T[-1] - T[0]
else:
    print t
    print T
    print "Wrong estimates"