Ich kann den Zeitraum meines Signals nicht herausfinden

7

Ich habe ein verrauschtes Signal, das das Geräusch eines Motors mit konstanter Drehzahl ist, daher sollte das Geräusch "periodisch" sein. Ich weiß, dass es eine Möglichkeit gibt, die Autokorrelationsfunktion zu verwenden, um die Periode zu erhalten. Ich habe es getan, aber ich kann den Zeitraum nicht herausfinden. Jede Idee, wie das unter dem Signal und dem Ergebnis der Autokorrelation zu tun ist: das Signal Signal

das Autokorrelationsergebnis: Autokorrelation

Motor
quelle
Wenn Sie eine neue Frage haben, fragen Sie es bitte durch Klicken Frage stellen Taste. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt. - Von der Überprüfung
MBaz

Antworten:

6

Hier ist ein Versuch, das zu tun, was Sie brauchen scilab.

Geben Sie hier die Bildbeschreibung ein

Das obere Diagramm zeigt einige Daten, die ich synthetisiert habe. Das zweite Diagramm zeigt die Autokorrelation der Rohdaten (vergrößert um den zentralen Peak der Autokorrelation). Die roten Kreise zeigen die mit dieser find_peaksFunktion gefundenen Peaks .

Das endgültige Diagramm zeigt den Unterschied zwischen allen Spitzenpositionen. Dies ist eine Schätzung des Zeitraums. Da Sie nicht wirklich garantiert sind, dass der zugrunde liegende Zeitraum eine ganzzahlige Anzahl von Stichproben ist, sollten Sie wahrscheinlich den Mittelwert dieser Werte ermitteln.

In diesem Fall ist die „wahre“ Zeit 1/f0 = 11.191996und unter diffs = diff(peaks);und dann mean(diffs(10:173))Ausbeuten 11.195122.


Code unten.

N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;

x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);

clf
subplot(311)
plot(x);

subplot(312)
plot(XC);

peaks=peak_detect(XC,0);

plot(peaks,XC(peaks),'ro')

a = get('current_axes');
a.data_bounds=[950 1050 -500 800];

subplot(313)
plot(diff(peaks));
Peter K.
quelle
4

Es scheint, dass Sie eine Fensterfunktion in Ihrem Signal anwenden (Autokorrelationsdiagramm scheint mit Fenstern versehen zu sein)!

Um seine Arbeit zu erledigen, teilen Sie Ihr Signal in konstante gerahmte Daten auf, die sich überlappen oder nicht, und wenden Sie die Autokorrelationsfunktion an:

y(k)=n=0N1x(k)x(n+k)

Am Ende finden Sie die Spitzenposition und herzlichen Glückwunsch, Sie haben die Periode gefunden!

Wie kann es in Matlab hier

ederwander
quelle
Nein, ich nicht, und über Spitzen sprechen, welche meinst du?
Motor
Der Peak ist der Maximalwert in Ihrem Autokorrelationsvektor!
Federwander
Meine Periode kann nicht 10000 sein. Mein Vektor hat 10000 Elemente.
Motor
2
Es muss keine Fensterfunktion angewendet werden. Der standardmäßige (voreingenommene) Autokorrelationsschätzer erzeugt eine dreieckige Hüllkurve zur Autokorrelation. Außerdem befindet sich der Peak der Autokorrelation immer in der Mitte, sodass Sie etwas genauer erklären müssen, was Sie unter "Finden der Peakposition" verstehen. Ich vermute, Sie meinen, finden Sie den Hauptgipfel und dann den nächstgrößeren Gipfel, der ihm am nächsten liegt. Der Abstand zwischen den beiden ist eine Schätzung des Zeitraums.
Peter K.
du hast recht, die Handlung von @Engine scheint eine Standard-Autokorrelantion zu sein :-) Ich habe es hier mit
matlab gemacht
0

Mein bevorzugter Weg, um die "Periode" Ihres Signals herauszufinden, ist das Betrachten des Spektrums. Es sieht so aus, als hätte Ihr Signal eine starke Sinuswelle mit etwas Rauschen. Wenn Sie die FFT nehmen und die Größe zeichnen, können Sie sehen, welche Frequenzen am stärksten sind (sie entsprechen wahrscheinlich der Drehzahl, mit der der Motor läuft). Die "Periode" Ihres Signals ist 1 geteilt durch die Signalfrequenz. Wenn Sie eine 10-Hz-Sinuswelle haben, beträgt ihre Periode 0,1 Sekunden.

Jeremy
quelle