2009-06-14 3 views
8

Gibt es einen Algorithmus, der verwendet werden kann, um zu bestimmen, ob eine Stichprobe von Daten, die in festen Zeitintervallen aufgenommen wurden, einer Sinuswelle nahe kommt?Bestimmen, ob sich ein Datensatz einer Sinuswelle annähert

+1

Ich wäre mir ziemlich sicher, dass bei gegebenen * beliebigen * * endlichen * Datensätzen (mit unterschiedlichen X-Werten) eine Sinuswelle gefunden werden kann, die genau passt, wenn Sie keine Häufigkeitsbeschränkungen angeben (wenn die Frequenz ansteigt, nähert sich die Sinuswelle einer raumfüllenden Kurve an). – AakashM

+0

Das ist die Definition der kontinuierlichen Fourier-Transformation. In der Praxis können Sie nur die diskrete Fourier-Transformation verwenden, und Sie werden auf endliche Frequenzen beschränkt sein (da die Erweiterung des Fourier-Integrals im kontinuierlichen Fall auf unendlich geht). Die meisten "gekrümmten" Funktionen können mit der Fourier-Transformation sehr gut angepasst werden, aber "rechteckige" Funktionen haben immer Verzerrungen an den Kanten, auch wenn die Expansion für eine lange Zeit fortgesetzt wird. (Vertikale Linien sind ähnlich dem Dirac-Delta, das 1 für ALLE Frequenzen ist). – CookieOfFortune

+0

Der beste Weg würde davon abhängen, wie Sie erwarten, dass die Daten von der Sinuslinie abweichen. Zufälliges Geräusch? Verzerrte Wellenform (z. B. dreieckige oder abgeschnittene Spitzen)? Eine Summe von mehreren Sinus gegen einen reinen Sinus? – DarenW

Antwort

16

Nehmen Sie die Fourier-Transformation, die die Daten in eine Häufigkeitstabelle umwandelt (Suche nach fft, schnelle Fourier-Transformation, für eine Implementierung. Zum Beispiel FFTW). Wenn es sich um einen Sinus oder Cosinus handelt, enthält die Frequenztabelle einen sehr hohen Wert, der der Frequenz entspricht, nach der Sie suchen, und etwas Rauschen bei anderen Frequenzen. Alternativ können Sie mehrere Sinussen mit mehreren Frequenzen kombinieren und versuchen, sie mit der Kreuzkorrelation zu vergleichen: die Summe der Quadrate der Differenzen zwischen Ihrem Signal und dem Sinus, in den Sie passen möchten. Sie müssten dies natürlich für Sinussen bei einer Reihe von Frequenzen tun. Und Sie müssten dies tun, während Sie den Sinus entlang der x-Achse verschieben, um die Phase zu finden.

+0

Sinussen - Sini? –

+0

Plural scheint auch Sinus zu sein ... Das ist das Problem, wenn Sie nicht in Ihrer Muttersprache tippen. Sinai dann :)? –

+3

Eine gute Schätzung der Qualität ist die Höhe des sehr hohen Peaks geteilt durch die Summe der Höhen anderer Peaks. Mit diesem Maß bedeutet 1 eine perfekte Anpassung, 0 bedeutet überhaupt keine Anpassung. – Martijn

0

Überprüfen Sie die least squares method.

@CookieOfFortune: Ich stimme zu, aber die Fourier-Serie passt optimal im Sinne der kleinsten Quadrate (wie auf dem Wikipedia-Artikel gesagt wird).

Wenn Sie zuerst mit eigenen Eingabedaten spielen möchten, überprüfen Sie die Discrete Fourier Transformation (DFT) auf Wolfram Alpha. Wie bereits erwähnt, wenn Sie eine schnelle Implementierung möchten, sollten Sie einen von mehreren FFT-libraries überprüfen.

+3

Die Sinuswelle hat wahrscheinlich einen Phasenversatz, was die Implementierung der Methode der kleinsten Quadrate schwieriger machen würde. – CookieOfFortune

0

Ins Blaue geschossen: Sie könnten den Vorteil nutzen, dass das Integral a*sin(t)a*cos(t) ist. Wenn Sie den Überblick über Ihre Daten behalten, sollten Sie wissen, a.

+0

a (a · sin (k · t + m) + b) dt = (-a/k) · cos (k · t + m) + b · t + C –

+0

Ich bin nicht sicher, ob dies eine fruchtbare Richtung ist Es kann jedoch nützlich sein, darauf hinzuweisen, dass die 2. Ableitung eines Sinus proportional zum Original und negativ ist. d2/dx2) sin (kx) = -k^2 sin (x). Um die Auswirkungen von Rauschen und Abrundungsfehlern zu reduzieren, verwenden Sie eine glättende Ableitung - lesen Sie die Savitzky-Golay-Filterung. – DarenW

7

Sie können die Fourier-Transformation berechnen und nach einer einzelnen Spitze suchen. Das würde Ihnen sagen, dass der Datensatz eine Sinuskurve bei dieser Frequenz approximiert.

+0

das funktioniert leider nur, wenn die sinuswelle genau die gleiche frequenz wie ein fft-bin hat. Wenn es irgendwo zwischen den Behältern ist, bekommt man ein völlig anderes Spektrum. –

+1

Sie erhalten einen einzelnen markanten Spike, egal wie hoch die Frequenz ist. Die Frage fragt nicht nach der Häufigkeit; nur um festzustellen, ob es ein Sinus ist oder nicht. – endolith

Verwandte Themen