2016-10-03 4 views
2

Я использую scipy.signal.spectrogram() для анализа набора данных, содержащих значения для тока. Мой вход функции выглядит следующим образом:scipy.signal.spectrogram output не так, как ожидалось

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

(для прокладки в сюжетных 3 (сверху) я использую plt.pcolormesh(t, f, Sxx))

Где y представляет собой список из 10002 значений, содержащее значение у для зеленый график на первом участке (сверху). fs = 1/T где T = x[1]-x[0] где x - это список значений x (время), принадлежащих значениям y (текущий).

Моя проблема заключается в том, что

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

Значение: Я хочу, чтобы сравнить участок 3 с зеленым графом в участке 1, и когда эти два не пробегает же временный интервал, спектрограмма становится бесполезной. Вы можете видеть на картинке, что total_length_x > total_length_t

enter image description here

Почему это так? И что я могу сделать, чтобы диапазон спектра за тот же промежуток времени, что и исходные данные?

+1

Пожалуйста, прочтите http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal. spectrogram.html, чтобы получить представление о том, что возвращает эта функция. Для создания спектрограммы необходимо использовать набор точек (окно), и вычисляется FFT этих значений. По умолчанию вы используете неперекрывающееся окно с 256 точками. Это означает, что ваш набор данных 1002 обеспечит 40 наборов. Я предполагаю, что у вас есть 40 очков. Таким образом, для каждого столбца Sxx (и каждого t) это соответствует 256 первоначальным значениям входного времени. –

+0

Я прочитал документ, и я все еще не понимаю выход. Вот некоторые числа: len (t) = 44. t [-1] -t [0] = 1.92639999. x [-1] -x [0] = 2.0001997. Итак, вы видите, я «пропустил» 0.0738 микросекунд данных. – roggjah

+0

Я сделал ошибку выше о перекрытии. В документе, если не указано, перекрытие считается «256/8 = 32». Это означает, что ваши очки будут «1 + пол» ((10002 - 256)/(256 - 32)) = 44'. Точками 't' являются средние точки окна, т. Е.' T [0] = x [128] 'и для' n> 0', 't [n] = x [128 + (n - 1) * (256 - 32)] '. Надеюсь, это объяснит это. –

ответ

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" 
+0

Спасибо за это, это объясняет вывод очень красиво! Теперь мой вопрос изменился на: как правильно построить эти значения? Потому что, когда я рисую 'plt.pcolormesh (t, f, Sxx)', это кажется неправильным. Теперь мой график начинается с 'time = t [0]', а не начинается с 'time = 0'. Итак, как я могу правильно масштабировать этот график как шкалу времени 1: 1 с моим исходным набором данных? (ofc. Я могу исправить смещение с помощью 't = t + x [0]', если 't [0] = 0'.) Но это не решит мою проблему, так как общее время в них различно. – roggjah

+0

't, f, Sxx = self.spect_Ihv()' #basically вызывает signal.spectrogram() и возвращает значения 'new_t = []' # изменение бинов 'для i в диапазоне (0, 45): \t джада = 0,045454545454545456 # 2microsec/44bins = binsize \t new_t.append (джада * я) '' new_t = new_t + self.Ihv.x [0] '#adjusting к оригинальному datastring ' ax3.pcolormesh (new_t , f, Sxx) ' Если я это делаю, он отлично масштабируется, но я не уверен, что то, что я делаю, является« законным »?. Извините за ужасное форматирование ... – roggjah

+0

Я не могу правильно прочитать ваш код.Но я могу сказать, что каждый столбец 'Sxx', возвращающийся из спектрограммы, представляет временные образцы, которые ** центрированы ** вокруг' t'. Проблема в том, что первый образец (и может быть последним) должен быть рассмотрен по-разному. При перекрытии каждый образец 't' отображает образцы порядка 256 - 256/8',' x'. Надеюсь, это поможет. –