2013-03-07 22 views
13

Ich habe Daten von einem Sensor und ich muss die Frequenz davon finden. Es sieht aus wie fft() scheint der Weg zu sein, aber die MATLAB Docs zeigen nur, wie man eine Grafik der Frequenzen bekommen, ich weiß nicht, was ich von dort tun soll.Ermitteln der Frequenz von Signaldaten in MATLAB

Hier ist, was meine Daten wie folgt aussieht:

enter image description here

Antwort

18

Eine Möglichkeit, in der Tat zu gehen, ist eine fft zu verwenden. Da das fft Ihnen die Frequenzdarstellung des Signals gibt, wollen Sie nach dem Maximum suchen, und da das fft ein komplexes Signal ist, wollen Sie zuerst den absoluten Wert nehmen. Der Index entspricht der normalisierten Frequenz mit maximaler Energie. Letztendlich, wenn Ihr Signal einen Offset hat, wie es bei dem einen ist, den Sie zeigen, wollen Sie diesen Offset entfernen, bevor Sie das fft nehmen, so dass Sie kein Maximum am Ursprung bekommen, der die DC-Komponente darstellt.

Alles, was ich in einer Zeile setzen beschrieben wäre:

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

wo indexMax den Index ist, wo der max fft Wert gefunden werden kann.

Hinweis: Um von indexMax zu der tatsächlich interessierenden Frequenz zu gelangen, müssen Sie die Länge L des fft (wie die Länge Ihres Signals) und die Abtastfrequenz Fs kennen. Die Signalfrequenz ist dann:

frequency = indexMax * Fs/L; 

Alternativ schneller und arbeiten auch recht gut auf dem Signal ab, die Sie haben, nehmen Sie die Autokorrelation des Signals: nach

autocorrelation = xcorr(signal); 

und finden die ersten maximal auftretende der Mittelpunkt der Autokorrelation. (Die Autokorrelation ist symmetrisch zu ihrem Maximum in der Mitte.) Wenn Sie dieses Maximum finden, finden Sie den ersten Ort, an dem das verschobene Signal mehr oder weniger wie es selbst aussieht. I.e. Sie finden die Periode Ihres Signals. Da das Signal, das um ein Vielfaches seiner Periode verschoben ist, immer wie es selbst aussieht, müssen Sie sicherstellen, dass das Maximum, das Sie finden, tatsächlich der Periode des Signals und nicht einem ihrer Vielfachen entspricht.

Aufgrund des Rauschens in Ihrem Signal könnte das absolute Maximum sehr wohl bei einem Vielfachen Ihrer Periode statt der Periode selbst auftreten. Um dieses Rauschen zu berücksichtigen, würden Sie das absolute Maximum der Autokorrelation (Autokorrelation (Länge (Autokorrelation)/2 + 1) nehmen und dann ermitteln, wo die Autokorrelation größer ist als beispielsweise 95% dieses Maximalwerts für den ersten Zeit in der zweiten Hälfte des Signals 95%, 99% oder eine andere Zahl würde davon abhängen, wie viel Rauschen Ihr Signal korrumpiert

UPDATE: Ich weiß, dass ich angenommen habe, dass Sie mit "Frequenz" Ihres Signals gemeint haben Pitch oder Base Harmonic oder Frequenz mit der meisten Energie, wie auch immer Sie es betrachten möchten.Wenn mit Frequenz die Frequenzdarstellung Ihres Signals gemeint ist, dann wollen Sie in erster Näherung nur die ABS der FFT aufzeichnen, um ein Idee wo die Energie ist:

plot(abs(fft)); 

Wenn Sie verstehen wollen, warum es ein abs ist, oder welche relevante Informationen Sie verlieren durch die Phase des fft darstellt, möchten Sie vielleicht ein bisschen mehr lesen über die DFT genau zu verstehen, transformieren, was man bekommt.

+0

Das Signal, das ich habe, ist von einigen gemessenen Oszillationen einen Dehnungsmeßstreifen verwendet. Ich möchte die Frequenz dieser Schwingungen finden. Mit Hilfe der 'fft' Methode, die Sie geschrieben haben, bekomme ich 0,0357 für die Frequenz, sondern auf dem Grundstück suchen, gibt es etwa 10 Zyklen pro Sekunde, also sollte ich etwa 10 für die Frequenz nicht bekommen? – edc1591

+0

Wenn Sie 10 Schwingungen pro Sekunde haben, ist das eine Periode von .1s oder eine Frequenz von 10 Hz. Was sind die Werte für indexMax, L und Fs? Führen Sie auch plot (abs (fft)) aus, um zu bestätigen, dass Sie eine große Spitze haben, und dass indexMax der richtige Index dafür ist, wo diese Spitze auftritt. Ich stelle fest, in der Grafik, die Sie zeigen, dass es ein negatives in Ihrem Signal-Offset ist, was bedeutet, es wird auch eine Spitze nahe Null für fft sein, die die DC-Komponente darstellt. Es könnte sein, was Sie messen. Wenn dies der Fall ist, nehmen Sie stattdessen die fft von (Signal-Mittelwert (Signal)), um diese DC-Komponente zu entfernen. – Lolo

+0

Die Spitze, die ich bekam, war bei Null (indexMax = 1). Ich habe getan, was du gesagt hast, indem du den Mittelwert (Signal) subtrahiert hast und jetzt bekomme ich ungefähr 9,8 Hz für die Frequenz, das scheint richtig zu sein! Vielen Dank für die Hilfe !! – edc1591

0

ich denke, es

(indexMax-1) * Fs/L 

Das erste Element von abs (fft (x)) sein soll, ist der Gleichstrom (DC) oder Voreingenommenheit oder bedeutet das Signals oder X0. Wir zählen aus dem zweiten Element (X1). Bitte lassen Sie mich wissen, wenn ich falsch liege. Vielen Dank. enter image description here

clear all 
clc 
close all 
Fs = 1; 
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal 
t = 0:Fs:T; % T seconds 
L = length(t); % L is the length of sample sequence 
bias = 4 
signal = sin(t) + bias; 

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

frequency_method1 = (indexMax-1) * Fs/(L-1); 
frequency_method2 = (indexMax-1) * Fs/L; 


number_of_cycles_method1 = frequency_method1*T 

number_of_cycles_method2 = frequency_method2*T 


subplot(2,1,1) 
plot(t,signal,'-or') ; grid on; 
legend('about 1.7 cycles of cosine signal') 
subplot(2,1,2) 
plot(abs(fft(signal-mean(signal))),'-xb'); grid on 
legend('abs of fft') 

number_of_cycles_method1 = 

    2 


number_of_cycles_method2 = 

    1.8333 
Verwandte Themen