Python - 時間周波数スペクトログラム

私は256Hzでサンプリングされた64チャンネルEEGデータを持っており、各チャンネルの時間周波数分析を行い、スペクトログラムをプロットしようとしています。

データはnumpyの3d配列に格納されます。次元の1つは長さ256で、各要素はサンプリングされたすべての時間点(全データ長は1秒です)

明確にする:私の3D配列は64 * 256 * 913(電極*電圧*試行)です。試行は実験の単なる試行にすぎません。だから私がしたいのは、単一の試行から1つの電極を取り出し、1D電圧ベクトル全体と時間 - 周波数スペクトログラムを作成することです。ですから、データ[0、:、0]からスペクトログラムプロットを作成したいと考えています。

各電極について、y軸が周波数、x軸が時間、色/強度がパワーであるプロットが必要です

私はこれをPythonで使ってみました:

from matplotlib.pyplot import specgram
#data = np.random.rand(256)
specgram(data, NFFT=256, Fs=256)

これは私にこのようなものを与えます:

enter image description here

軸の範囲が間違っているので、これは私には間違っています

さらに、すべてのEEGチャンネルに対して同じコードを実行すると、すべてのデータにわたって、データが異なることを確認したにもかかわらず、全く同じプロットになります。

私は信号処理にかなり新しいです、私のデータがどのように配置されているか、私の機能をどのように使っていたかのどこかに間違いがありますか?

0

1 答え

スペクトログラムのアイデアは、信号を複数のブロックまたはフレームに分割することです。ウィンドウ処理の後、フレームごとにFFTが計算されます。これらのFFTの出力は、グラフの列ベクトルとして収集されます。したがって、x軸は時間に関連し、y軸は周波数に関連する。実数値信号のFFTは対称であるため、半分の周波数しかプロットする必要がありません。したがって、y軸は0からFs/2 = 128になります。

信号の長さに等しい長さのFFT長さ( NFFT = 256 )を選択したので、1つのフルフレームのデータしかありません。

潜在的な解決策は、FFT長 NFFT を減らすか、データ長を長くすることです。今のところ、最も簡単な方法は NFFT を減らすことです。ただし、その場合は noverlap も調整する必要があります。広く使用されているオーバーラップ量は NFFT/2 です。

Example: The following command will give you a spectogram.

specgram(data, NFFT=64, Fs=256, noverlap=32)

代替実施:

Nfft=64
specgram(data, NFFT=Nfft, Fs=256, noverlap=Nfft/2)

FFT長さパラメータ NFFT は、時間と周波数の分解能のトレードオフにつながります。

EDIT To answer additional questions in the comments.

From the documentation in [http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.specgram]:

Returns the tuple (spectrum, freqs, t, im):

spectrum: 2-D array

columns are the periodograms of successive segments

freqs: 1-D array

The frequencies corresponding to the rows in spectrum

t: 1-D array

The times corresponding to midpoints of segments (i.e the columns in >spectrum)

im: instance of class AxesImage

The image created by imshow containing the spectrogram

したがって、返されたタプルの最初の要素には電力値が含まれます。

1
追加された
完璧、ありがとう!現在、私は得られたスペクトログラムをプロットしていますが、プロットする代わりにspecgram()がそれぞれの点でプロットしているパワー値を返すことは可能ですか?この関数は3つの配列を返すように見えますが、どれも電力値のすべてを格納するのに十分長いとは思われません
追加された 著者 PyRulez,
私は私の答えを編集しました。
追加された 著者 Dale M,