Forum: Digitale Signalverarbeitung / DSP / Machine Learning sample Delay herausfinden


von Gringo Z. (gringo84)


Lesenswert?

Hallo zusammen,
ich suche mit Matlab eine Lösung um herauszufinden was mein Delay ist 
bei einem Signal das von zwei ADC "gleichzeitig" abgetastet wurde.

mit xcorr funktioniert die ganze sache nur wenn ich ganze samples 
verschoben bin (die kreuzkorrelation ist ja auch samplebasierend).

ich möchte ein resultat haben wie: "das signal ist um 1.2 Samples 
verschoben".

als Test abe ich gleich zwei Sinus generiert und mit matlab ausgewertet.
1
fs=20480;
2
fo=1151;
3
delay=1.2*1/fs;   % mit 1/fs (ganzen Samples) funktioniert es
4
t=0:1/fs:1;
5
x=sin(2*pi*fo*t);
6
y=sin(2*pi*fo*(t+delay)); %time delay 0.01s 
7
8
[xr,lag]=xcorr(x,y);
9
[mx,mind]=max(abs(xr));
10
delay_eva=lag(mind);
11
disp(sprintf('Actual sample delay is %d', delay_eva));
12
disp(sprintf('Actual time delay is %d', delay_eva*(1/fs)));

danke für eure hilfe...

von peter26 (Gast)


Lesenswert?

Hi ...

Is jetzt nur eine spontane Idee aber du könntest das Signal einfach 
interpolieren ... damit erhält du jedoch natürlich wieder eine 
Quantisierung.

Wenn du wirklich reine Sinussignal ohne Rauschen hast dann müsste das 
ganze auch über die Phase funktioniern, da die Phasenwerte, wenn ich 
mich nicht täusche kontinuierlich sind.  D.h ... fft -> und 
Phasendifferenz berechnen -> phase unwrap.


Hoffe die Ideen funktioniern auch ;-)

lg Peter

von Gringo Z. (gringo84)


Lesenswert?

mit der interpolation plus kreutzkorelation hat es auch nicht 
funktioniert.

Die perfekte Lösung war von beiden Signalen fft, und dann über die 
Winkeldifferenz:

(fs/fo)*(1/2pi)*winkelunterschied = anzahl samples differenz

cheerio gringo

von peter (Gast)


Lesenswert?

hi ... supa, mi würd aber irgendwie auch brennend interessiern wie ma 
des anstellt wenn des signal rauscht. Ich meine den Betragsgang könnt ma 
ja über ein Periodiogram  mitteln aber i hab keine Ahnung was dabei mit 
der Phase passiert.

lg
Peter

von Gerrit B. (gbuhe)


Lesenswert?

Hallo Gringo,

in der Praxis wird das in einer klassischen PLL (Phase Locked Loop) im 
Zeitbereich erledigt, indem ein Mischer/Multiplizierer als 
Phasenvergleicher eingesetzt wird. Da das Ergebnis auch eine 
Frequenzkomponente bei der Summenfrequenz hat, muß diese mit einem 
Tiefpassfilter unterdrückt werden. Das könnte in Matlab ungefähr so 
aussehen:

PDout = x.*y;                             %phase detector
a = 0.001;                                %filter coefficient for 
simplest IIR low pass filter
PDoutf = filter(a, [1 -(1-a)],PDout);     %low pass filter

Der gefilterte Gleichanteil entspricht der Phasenverschiebung der beiden 
Eingangssignale und kann dann in ganze und Bruchteile von Abtastperioden 
umgerechnet werden. Es ergibt sich ein Offset von genau Pi/2, die 
berücksichtigt werden müssen. Die Einschwingzeit des Tiefpaßfilters ist 
natürlich von seiner Grenzfrequenz abhängig und begrenzt die 
"Meßgeschwindigkeit". Hier macht es schnell Sinn, ein breiteres Filter 
mit höherer Flankensteilheit einzusetzen, damit trotz genügend hoher 
Unterdrückung der Summenfrequenzkomponente ein schnelles Einschwingen 
realisiert wird.

Am Ende ist das natürlich die praktische Realisierung eines Korrelators 
im Zeitbereich.

Viele Grüße!

Gerrit, DL9GFA

P.S.
Bei verrauschten Signalen sollte man Bandpass-Filter in beide Pfade vor 
dem Phasenvergleich einsetzen. Aber bitte darauf achten, daß die 
Gruppenlaufzeiten identisch sind. Durch Einsatz identischer Filter ist 
das natürlich automatisch sicher gestellt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.