2016-05-04 18 views
0

私は30秒間のウィンドウに分解し、データの各ウィンドウで高速フーリエ変換を実行するEEGデータをいくつか持っています。私はforループを実装しようとし、インデックスウィンドウのサンプル数でインデックス値をインクリメントしました。これを実行すると、(1)これはデータの最初のウィンドウでは機能しますが、残りの部分では機能しません(つまり、サンプルの数から1を引いた数がdata_fftに必要な要素数より少ないためどちらもフィギュアにプロットされているfと同じ次元を持たない。 (2)ウィンドウにサンプル数を追加してインデックス値を更新しようとしましたが、i = 1の後、私のワークスペースではi = 2になります。私はこれを変更する方法を理解しようとする際に恥ずかしいほど長い時間を費やしてしまったので、正しく動作するので、アドバイスをいただければ幸いです!コードは以下のとおりです。私が何かを明確にすることができたら教えてください。matlab:データの長さのforループで短時間間隔でfftを実行

data_ch6 = data(:,6); % looking at just 1 electrode 

    tmax = 2*60; % total time in sec I want to analyze; just keeping it to 2 minutes for this exercise 
    tmax_window = 30; %30 sec window 
    times = tmax/tmax_window; % number of times fft should be run 
    Nsamps = tmax*hdr.SPR; % total # samples in tmax; sample rate is 256 hz 
    Nsamps_window = tmax_window*hdr.SPR; % # samples in time window 
    f = hdr.SPR*(0:((Nsamps_window-1)/2))/Nsamps_window; % frequency for plotting 


    for i = 1:Nsamps; % need to loop through data in 30 second windows in tmax 
     data_fft = abs(fft(data_ch6(i:i+Nsamps_window-1))); %run fft on data window 
     data_fft = data_fft(i:((i+Nsamps_window-1)/2)); %discard half the points 

     figure 
     plot(f, data_fft) 
     i = i+Nsamps_window; 

    end 
+0

なぜスペクトログラムを使用しないのですか? – ThP

+0

これは、私が最終的に長期間にわたってFFTをやらなければならないので、私自身が作成した練習です。私の問題は、「どのように私はFFTを実行するのですか」よりも「基本的な」ものです。私は、このタイプの状況に対してforループを正しく構築して、特定のポイント数私は何が間違っているのか知りたい。しかし、ありがとう。 – rana

答えて

0

コードに間違った点がいくつかあります。最初に、私はiは、通常はsqrt{-1}のために立っているので、変数名のための非常に悪い選択であることを言って開始させてください。
あなたのコードに関して、私はあなたが重複することなくウィンドウFFTを実行しようとしていると仮定します。

1)ループは、1から増分で1からNsampsになります。つまり、1つのサンプルを前進させるたびにループします。つまり、Nsamps_window-1が重複しています。重複したくない場合はおそらくi=1:Nsamps_window:Nsamps-Nsamps_window-1を使用できます。

2)data_fftの長さはNsamps_windowあるので、私はあなたがFFTの結果をプロットすると

3)、私はデシベルdata_fft = data_fft(1:round(Nsamps_window/2));使用することをお勧めされてやりたいと思う:plot(20*log10(abs(data_fft)));

4)ラインi = i+Nsamps_window;がありますiはあなたのループ変数であるので意味がありません(効果はありません)。

関連する問題