ich suche nach einer Möglichkeit aus ordentlich verrauschten Daten die frequenzabhängige Gruppenlaufzeit zu ermitteln. Das dumme daran ist, dass ich den Referenzgenerator nicht vernünftig mit dem ADC synchronisieren kann, da das Ergebnis auch mit relativ räudigen Soundkarten und unbekannter Latenz als Konverter funktionieren soll.
Das bedeutet ich habe als zusätzliche Unbekannte eine lineare Phasenverschiebung, die durchaus im Bereich von Sekunden liegen kann, zumal die Programme für Testsignal und Auswertung auch nie ganz gleichzeitig gestartet werden. Die eigentlich zu ermittelnden Differenzen in der Gruppenlaufzeit sollen aber mit einer Genauigkeit von
Didn't find your answer? Ask the community — no account required.
M
Marc Jet
Warum benutzt Du nicht einfach einen Carrier mit moduliertem Datensignal? Das Signal koennte eine bestimmte Bitfolge enthalten, die die 0 Phase definiert. Erkennen kannst Du es per Bandpassfilter und Korrelation.
M
Marcel Müller
Hmm, die Korrelation nur in einem engen Bandbreitenbereich durchzuführen, daran habe bisher noch nicht gedacht. Es müsste halt ein Bereich sein, der auf alle Fälle einigermaßen gut übertragen wird. Das sollte erst einmal kein Problem darstellen. Allerdings sollte es auch nicht zu eng werden, sonst wird es wieder knapp mit dem SNR.
Das Ganze bringt mich aber auf die Idee, es einmal mit eine Kreuzkorrelation mit dem kompletten Referenzsignal zu versuchen. wenn die einen Abweichungen in der Größenordnung von einer Sekunde liegen und die Schwankungen der Gruppenlaufzeit in der Größenordnung von zweistelligen Millisekunden, sollte es doch ein mehr oder minder deutliches Maximum in der Kreuzkorrelation geben. Dessen Schwerpunkt müsste die von mir gewünschte Information enthalten.
Marcel
W
Winfried Salomon
Hallo Marcel,
Marcel Müller schrieb:
[.....]
wie wäre es mit einem Chirp-Testsignal? Eine ähnliche Problematik hatte sich kürzlich mit Rafael Deliano ergeben, der beliebige Frequenzgänge gestörter Systeme messen wollte und den Chirp-Generator als erstes realisieren wollte.
Zufällig hatte ich kürzlich selbst eine Lösung für eine solche Problematik in Simulink erstellt, es funktioniert ähnlich einem Spektrumanalyzer im Basisband, benötigt einen Hilbert-Transformator und einen Quadratur-Oszillator, der den Chirp auch macht, also komplexe Signalverarbeitung.
Für eine Offline-Analyse mit Daten auf der Festplatte wäre das sicher kein Problem. da stören die aufwendigen Filter nicht. Ich habe hier noch das Archiv liegen mit dem Simulationsmodell und Screenshots. Die Phase könnte man IMHO sehr einfach aus den komplexen Signalen zusätzlich ermitteln bzw. sich Abgleichstrategien überlegen.
mfg. Winfried
M
Marcel Müller
Chirp kann ich nicht machen. Erstens erzeugt das ein ziemlich nerviges Geräusch, zweitens kann ich bei Chirp nicht gezielt einige Frequenzen weglassen, um die 2. und 3. Harmonische frei zu haben respektive die zu messenden Kanäle zu separieren, drittens hat mir Chirp zu wenig Energie im unteren Frequenzbereich. Ich arbeite mit 1/sqrt(f) Gewichtung. (Kann sein, dass man letzteres auch mit Chirp irgendwie hinbekommt.)
Ich denke aber, dass meine Testsignale in diesem Kontext auch nicht viel anders als Chirps sind. Der wesentliche Unterschied ist, dass ich die Phasen per Pseudozufallszahlen belege, die ich aber auch kenne. Das Signal enthält genauso alle möglichen Frequenzen nur hat es keinen definierten Anfang in der Zeitdarstellung und ist akustisch nicht von Rauschen zu unterscheiden.
Offline ist schlecht. Derzeit mache ich alle paar Sekunden eine Onlineberechnung und dabei sollte es auch bleiben.
Simulink habe ich nicht und auch kein Windows. Ich muss mit C/C++ vorlieb nehmen. Das hat allerdings den Vorteil, dass eine Echtzeitauswertung mit ein Dutzend FFTs (2^16 bis 2^18 Samples) selbst auf betagter Hardware kein Problem darstellt. Wenn, dann muss ich also alles direkt codieren.
Mittlerweile bin ich aber ein gutes Stück weiter gekommen. Durch Kreuzkorrelation mit dem Referenzsignal konnte ich die Phasenlage des Gesamtsignals wie es aussieht hinreichend genau bestimmen. Ich habe einfach alle Punkte der Kreuzkorrelation, x[i] wie folgt transformiert und aufsummiert und davon die Phase ermittelt:
phase = arg( sum( x[i]^2 * exp(I*i/N) )) für i = 0..N-1 delay = phase * N / 2 / Pi / fsamp
Das Ergebnis ist, wie es aussieht, auch bei ordentlich verrauschten Signalen sehr stabil. Das phase-unwrap gelingt in Folge und die Gruppenlaufzeiten lassen sich stabil ermitteln. Das so ermittelte Delay kann man nachher wieder auf die Gruppenlaufzeit addieren, wenn gewünscht.
Marcel
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.