Digitale Signalverarbeitung, Signal detektieren

hier ist ein Ausschnitt aus meiner Delphi-Simulation. In C wird das noch etwas kompakter.

- Abtasten mit der passenden Taktfrequenz

- wenn Flag gesetzt, dann Pegel invertieren

- Flag invertieren

- Tiefpassfiltern

was fehlt ist hier nur noch die Gleichrichtung

Die multiplikation mit 31 mache ich indem ich das Datenwort um 5 Bit nach links schiebe, dann den Ursprungswert subtrahiere Division durch 32 dann durch 5 Bit nach Rechts schieben.

------------------- snip -----------------------------------------

while t < 10E-3 do // t ist der Zeitpunkt, hier 1ms betrachten begin

// Signal alle 48 Mikrosekunden abtasten

if vz then y := - y; // jeden zweiten Abtastwert invertieren

if vz=true then vz := false // Vorzeichenflag invertieren else vz := true;

series4.AddXY(t*1E6,y,'',clred); // Mischprodukt plotten

y0 := (31*y0 + y)/32; // Tiefpassfilter series5.AddXY(t*1E6,y0*16,'',clyellow); // plotten

end;

Reply to
Stefan
Loading thread data ...

Und dran denken, dass wenn die Abtastfrequenz genau dem Sendesignal entspricht und das auch noch die gleiche Phase hat, null herauskommen kann. Falls das ein Problem ist, koennte man mal kurz "dithern" oder wie immer das in Germanien heisst.

Da muss ich leider passen. Ich gebe zwar oft Software-Strukturen vor, aber die Implementation machen dann immer die Programmier-Profis.

--
Gruesse, Joerg 

http://www.analogconsultants.com/
Reply to
Joerg

Schon klar. Ich gehe von eine Frequenzdifferenz von 100-200 Hz aus, also ca. 1-2% bezogen auf die ca. 10kHz. Die Genauigkeit der Quarze am Sender

Reply to
Stefan

Koennte man verfeinern, indem Du statt Tiefpass einen Bandpass einsetzt. Das gibt besseres SNR.

Es sieht alles sehr schlank im Code aus, aber es haengt davon ab, wieviel der uC dafuer schuften muss. So aehnlich wie der Posten "Neue Aussentreppe bauen" nur eine kurze Zeile auf der "Honey do" Liste meiner Frau ist, aber einen Haufen Arbeit darstellt.

--
Gruesse, Joerg 

http://www.analogconsultants.com/
Reply to
Joerg

ist klar,

y0 := (31*y0 + y)/32; // Tiefpassfilter / gleitender Mittelwert

das sieht dann in C so aus:

y0 = ((y0 >>= 5) - y0) + y; // 5 Bit rechts schieben ist multiplikation mit 32 // dann einmal subtrahieren und ich habe y0 * 31

y0

Reply to
Stefan

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.