webentwicklung-frage-antwort-db.com.de

Bestimmen Sie die Frequenz aus den Signaldaten in MATLAB

Ich habe Daten von einem Sensor und muss die Frequenz ermitteln. Es sieht so aus, als wäre fft() der Weg zu gehen, aber die MATLAB-Dokumente zeigen nur, wie man einen Graphen der Frequenzen erhält.

So sehen meine Daten aus:

enter image description here

13
edc1591

Ein Weg zu gehen ist in der Tat eine FFT zu verwenden. Da die FFT die Frequenzdarstellung des Signals angibt, möchten Sie nach dem Maximum suchen, und da die FFT ein komplexes Signal ist, sollten Sie zuerst den absoluten Wert annehmen. Der Index entspricht der normalisierten Frequenz bei maximaler Energie. Wenn Ihr Signal einen Versatz aufweist, wie es bei dem von Ihnen gezeigten Signal der Fall ist, möchten Sie diesen Versatz entfernen, bevor Sie die FFT-Taste verwenden, damit Sie keinen Maximalwert für den Ursprung erhalten, der die Komponente DC darstellt .

Alles, was ich beschrieben habe, wäre:

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

dabei ist indexMax der Index, an dem der maximale fft-Wert gefunden werden kann.

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

frequency = indexMax * Fs / L;

Alternativ, schneller und je nach vorhandenem Signal auch recht gut funktionieren, nehmen Sie die Autokorrelation Ihres Signals:

autocorrelation = xcorr(signal);

und finde das erste Maximum, das nach dem Mittelpunkt der Autokorrelation auftritt. (Die Autokorrelation wird symmetrisch sein, wobei das Maximum in der Mitte liegt.) Wenn Sie dieses Maximum ermitteln, finden Sie den ersten Ort, an dem das verschobene Signal mehr oder weniger sich selbst ähnelt. Das heißt Sie finden die Periode Ihres Signals. Da das um ein Vielfaches seiner Periode verschobene Signal immer wie sich selbst aussieht, müssen Sie sicherstellen, dass das gefundene Maximum tatsächlich der Periode des Signals und nicht einem seiner Vielfachen entspricht.

Aufgrund des Rauschens in Ihrem Signal könnte das absolute Maximum bei einem Vielfachen Ihrer Periode anstelle der Periode selbst auftreten. Um dieses Rauschen zu berücksichtigen, würden Sie also den absoluten Maximalwert der Autokorrelation (Autokorrelation (Länge (Autokorrelation)/2 + 1)) nehmen und dann herausfinden, wo die Autokorrelation größer ist als beispielsweise 95% dieses Maximalwerts für den ersten Wert Zeit in der zweiten Hälfte des Signals: 95%, 99% oder eine andere Zahl hängt davon ab, wie stark das Rauschen Ihr Signal beschädigt.

UPDATE: Ich merke, dass ich davon ausgegangen bin, dass Sie unter "Frequenz" Ihres Signals die Tonhöhe oder Basisharmonische Frequenz oder Frequenz mit der höchsten Energie verstanden haben, egal wie Sie es betrachten möchten. Wenn Sie mit Frequenz die Frequenzdarstellung Ihres Signals gemeint haben, möchten Sie in erster Näherung nur die abs der FFT darstellen, um eine Vorstellung davon zu erhalten, wo sich die Energie befindet:

plot(abs(fft));

Wenn Sie wissen möchten, warum es einen Bauchmuskel gibt oder welche relevanten Informationen Sie verlieren, wenn Sie nicht die Phase der FFT darstellen, möchten Sie vielleicht ein wenig mehr über die DFT-Transformation lesen, um genau zu verstehen, was Sie erhalten.

18
Lolo

Ich denke es sollte sein 

 (indexMax-1) * Fs / L 

Das erste Element von abs (fft (x)) ist der Gleichstrom (DC) oder die Vorspannung oder der Mittelwert des Signals oder X0. Wir zählen ab dem zweiten Element (X1) ... Bitte geben Sie mir Bescheid, 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