2016-05-04 3 views
0

Ich habe einige EEG-Daten, die ich in 30-Sekunden-Fenster brechen und eine schnelle Fourier-Transformation auf jedem Datenfenster ausführen möchte. Ich habe versucht, eine for-Schleife zu implementieren und den Indexwert um die Anzahl der Stichproben im Zeitfenster zu erhöhen. Wenn ich das ausführe, kann ich sehen, dass (1) dies für das erste Datenfenster funktioniert, aber nicht für den Rest, weil (ich denke) die "Anzahl der Beispiele minus eins" zu weniger Elementen führt als für data_fft und somit notwendig hat nicht die gleichen Dimensionen wie f, die beide in einer Figur dargestellt sind. (2) Ich habe versucht, den Indexwert durch Hinzufügen der Anzahl der Samples in einem Fenster zu aktualisieren, aber nach i = 1 geht es in meinem Arbeitsbereich zu i = 2 und nicht wie erwartet auf i = 7681. Ich habe eine peinlich lange Zeit damit verbracht, herauszufinden, wie ich das ändern kann, damit es richtig funktioniert, also wird jeder Ratschlag geschätzt! Code ist unten. Lass es mich wissen, wenn ich etwas klären kann.Matlab: läuft fft in kurzen Zeitintervallen in einer for-Schleife für die Länge der Daten

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

Warum nicht 'Spectrogram' verwenden? – ThP

+0

Dies ist nur eine Übung, die ich für mich selbst erstellt habe, da ich FFTs über lange Zeiträume von Daten machen muss. Mein Problem ist noch "grundlegender" als "wie führe ich eine FFT aus", ich denke, es muss mehr damit anfangen, wie man eine For-Schleife richtig für diese Art von Situation konstruiert, in der ich um eine bestimmte Anzahl von Punkten erhöhen möchte und ich möchte wissen, was ich falsch mache. Trotzdem danke. – rana

Antwort

0

Nun, es gibt ein paar Dinge, die in Ihrem Code falsch sind. Zuerst möchte ich sagen, dass i eine sehr schlechte Wahl für einen Variablennamen ist, da es in Matlab normalerweise für sqrt{-1} steht.
Für Ihren Code gehe ich davon aus, dass Sie gefenste FFT ohne Überlappung durchführen möchten.

1) Ihre Schleife geht von 1 bis Nsamps mit einem Inkrement von 1. Das bedeutet, jedes Mal, wenn Sie 1 Probe vorrücken. Mit anderen Worten, Sie haben Nsamps_window-1 Überlappung. Sie können vielleicht i=1:Nsamps_window:Nsamps-Nsamps_window-1 verwenden, wenn Sie nicht in Überschneidungen interessiert sind.

2) Die Länge data_fft ist Nsamps_window, also denke ich, was dich data_fft = data_fft(1:round(Nsamps_window/2));

3) tun wollte, als FFT-Ergebnisse Plotten, ich schlage vor, mit dB: plot(20*log10(abs(data_fft)));

4) Die Linie i = i+Nsamps_window; ist bedeutungslos seit i ist Ihre Loop-Variable (es hat keinen Effekt).

Verwandte Themen