Hallo!
Um (breitbandige und kontinuierliche) akustischen Signalen mit einem
Mikrophon Array zu lokalisieren filtere ich zurzeit eine ausgewählte
Frequenz (Wellenlänge = 2 * Mikrophonabstand) und berechne anschließend
den cross-correlation-coefficient (ccc) zwischen den Signalen.
Diese Methode ist sehr rechenintensiv, weiterhin unterscheidet das
CCC-Ergebnis nicht zwischen Rechts und Links. Eine Unterscheidung
zwischen Rechts und Links ist nur möglich, wenn ich die Signale
verschiebe und den CCC erneut berechne.
Nun möchte ich mit Goertzel-Algorithmus mein Glück versuchen und die
Phasenverschiebung berechnen.
Meine Versuche sind aber fehlgeschlagen. Vielleicht habe ich die Formeln
aus http://en.wikipedia.org/wiki/Goertzel_algorithm falsch
interpretiert.
Zurzeit habe ich meine Samples (Input: x(n)) in Signed Fractional Format
und 8 Samples pro Welle. Die Frequenz, die mich interessiert ist 1429 Hz
und die Samplefrequenz ist 11432 Hz
Output = s(n) = x(n) + Coeff * s(n − 1) − s(n − 2)
Coeff = 2cos(2πω) = 2 * 0,707106781
Π = Kreiszahl = 3,141592654
ω = Cycles per Sample = 0,125
Ist meine Berechnung überhaupt richtig?
Der dsPIC Akkumulator ist nach einem Block von 64 Samples überflutet,
was mache ich falsch?
Danke Euch!
Sorry, der Akkumulator wurde wegen eines Programmierfehlers überflutet.
Bitte, nicht erschlagen, ich bin ein Anfänger zu DSPs und das ist ein
privates Projekt (Lernprojekt).
Also, die Formel funktioniert, …
Trotzdem habe ich damit aufgegeben.
"imag" und "real" sind damit schnell berechet, aber, um die Phase zu
bekommen, muss ich ja jedes Mal arctan(imag/real) berechnen. Mit
Nährungsformeln ist das natürlich machbar, das ist aber auch
Rechenintensiv. Diese Methode ist wirklich effektiv, um die Magnitude^2
für eine Frequenz schnell zu berechnen, aber nicht die Phasen.
Vielen Dank
Vielen Dank für den Hinweis und für den Code. Dieser Cordic-Algorithmus
ist eine elegante Lösung. Die einzige Lösung, die mir eingefallen war,
war eine Tabelle mit einigen vorkalkulierten Ergebnissen. Meine Lösung
habe ich aber nicht verwirklicht gehabt, weil ich mit den komplexen
Zahlen aufgegeben habe.
Irgendwie glaube ich nicht mehr, dass diese Aufgabe mit
Goertzel-Algorithmus (oder auch mit FFT und Co.) effektiver gelöst
werden kann. Trotzdem denke ich immer wieder drüber nach ;-)
Die Phase, die aus "imag" und "real" berechnet wird ist zwar von –Π bis
+Π, diese Phase hängt aber davon ab, wie die Signale im Sampleblock
zentriert sind. Sind die Signale unglücklich zentriert, dann bekommt man
einfach ein falsches Ergebnis.
Vielleicht gibt es für alle diese Probleme eine Lösung? Ich kenne aber
kein Beispielprojekt.
>>diese Phase hängt aber davon ab, wie die Signale im Sampleblock zentriert >>sind.
So ist es. Aber Du hast ja mehrere Mikrophone, also berechnest Du die
Phasendifferenz von zweien. Dein erster versuch mit der Korrelation war
doch auch nicht schlecht. Das bringt Dir zwar keine subsampleauflösung
wie die Phasenverschiebung aber sollte doch gehen. Die
KorrelationsFUNKTION läßt sich schnell über drei FFTs rechnen:
Correlation = IFFT(FFT(x)*conjugiertkomplex(FFT(y))).
FFTs für den dsPic wirds schon fertig geben.
Ist doch nen schönes Projekt, ich hatte mal ne 3D Maus erstanden, die
wurde durch 3 Mics im Raum geortet, hat solala gefunzt.
Cheers
Detlef
Ah Ha schrieb:
> Eine fouriertrafo fuer eine einzelne Frequenz ist overkill.
Richtig, deshalb möchte ich mein Glück mit dem Goertzel-Algorithmus
probieren.
"imag" und "real" für eine Frequenz, sind mit dem Goertzel-Algorithmus
schnell berechnet. Dann bekomme ich pro Kanal diese zwei Werte.
Jetzt, um die Richtung der Signale ausfindig zu machen, benötige ich
theoretisch mindestens zwei Kanäle, aber eigentlich habe ich drei
Kanäle.
Meine Frage ist; muss ich diese atan2 wirklich dreimal berechnen (einmal
pro Kanal), oder kann ich die Imag- und Real-Werte vorher irgendwie
"zusammenfassen" und mit eins oder zwei atan2-Berechnungen auskommen?