Forum: Digitale Signalverarbeitung / DSP / Machine Learning Übergangsfrequenz per Software ermitteln


von dietzi (Gast)


Lesenswert?

Hallo,

ich möchte einen FSK-Demodulator in VB.NET programmieren. Zur Zeit 
werden die einzelnen Samples in einen Buffer gespeichert und 
anschließend werden die Nulldurchgänge gezählt woraus sich die Frequenz 
berechnen lässt. Nun habe ich aber das Problem, dass ich nicht weiß, wie 
ich die Frequenz im Übergang ermitteln (rückschließen) kann. Ich vermute 
mal, dass hierzu eine PLL nötig ist. Vielleicht gibt es auch andere 
Möglichkeiten?

Ich versuche mein Problem nochmal zu vereinfachen:
ich untersuche ein FSK-Signal, welches mit den Frequenzen 1200Hz und 
1800Hz arbeitet. Mein Problem ist, dass ich nicht weiß wie ich den 
Übergang von 1200Hz zu 1800Hz bzw. umgekehrt errechnen kann. Die Anzahl 
der Samples verändert sich ja im "Übergangsbereich".

Ein normales Sinus-Signal der Frequenz 1200Hz hat 36,75 Samples bei 
einer Samplerate von 44100Hz. Geht das Signal auf 1800Hz über, dann habe 
ich für die Frequenz 1200Hz keine 36,75 Samples mehr (welche aber in der 
aktuell untersuchten Periode noch present ist).

Ich hoffe, dass man mir irgendwie folgen kann.

Für Hinweise, Ratschläge, Denkanstöße oder auch Lösungsansätze bin ich 
sehr dankbar.

P.s.: FFT kommt nicht in Frage, da eine Baudrate von 1200 bit/s 
vorliegt. FFT benötigt zur Berechnung zu viele Samples um zu 
funktionieren.

Liebe Grüße
Dietzi

von Gerald M. (gerald_m17)


Lesenswert?

Goertzel oder Lock-in (Multiplikation mit den gesuchten Frequenzen und 
Tiefpassfilter)
Wird das live berechnet? Am PC?

von dietzi (Gast)


Lesenswert?

Ja es wird live berechnet. Goertzel hatte ich schonmal versucht - 
allerdings bin ich hier mit dem Schwellwert der Magnitude gescheitert. 
Was ist Lock-In? Wie wird das umgesetzt und wie schnell arbeitet das?

LG Dietzi

von dietzi (Gast)


Lesenswert?

P.s.: ich arbeite aktuell mit der Bass-DLL

von dietzi (Gast)


Lesenswert?

Nochmal p.s.: ja am PC

von Gerald M. (gerald_m17)


Lesenswert?

Wie kannst du mit einer baudrate von 1.2kbps eine Frequenz von 1800Hz 
live berechnen?

von dietzi (Gast)


Lesenswert?

Samplerate / Samples_pro_Periode=Frequenz

Anmerkung: bei FSK mit 1200 bit/s gilt:
2 Nulldurchgänge 1200Hz="1"
3 Nulldurchgänge 1800Hz="0"

Live bedeutet, dass ich in diesem Fall spätestens nach 416 mikrosekunden 
eine Frequenz bestimmt habe (entspricht einer halben Periode von 1200Hz)

Eine halbe Periode von 1800Hz entspricht 278 mikrosekunden.

Eine halbe Periode ergibt sich aus (1/Frequenz)/2

von Detlef _. (detlef_a)


Lesenswert?

Hi,

FSK wird seit Jahren erfolgreich demoduliert, mischen mit den Frequenzen 
und über die Symbolperiode integrieren, hier steht das:

https://de.wikipedia.org/wiki/Frequenzumtastung

Was Anderes und Selbgebasteltes wird schlechter funktionieren. Es ist 
bitter, aber man ist selbst nicht schlauer als die Generationen der 
Signalverarbeiter, auf deren Schultern man sich stellen sollte ;-/

Cheers
Detlef

von Sultan (Gast)


Lesenswert?

http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=slaa037&fileType=pdf


Zitat:

"A quadrature demodulator provides the FSK demodulation. In this type of
demodulation, the signal and its delayed version are multiplied together 
and then low-pass filtered. If the delay, T, is set such that Wcarrier × 
T = p/2, then the low-pass filter result is proportional to the 
frequency deviation from the carrier and therefore represents the bit 
value sent."

von dietzi (Gast)


Lesenswert?

Danke für das Zitat. Was aber heißt das nun konkret auf Software-Basis?

von Gerald M. (gerald_m17)


Lesenswert?

Lese mal wie ein digitaler  Lock-In Verstärker funktioniert.
In der Software heißt das:
Erzeuge (oder verwende eine LUT) für die  gesuchte Frequenz je einen 
Sinus und einen Cosinus. Multiplizieren das empfangene Signal einmal mit 
dem Sinus und einmal mit dem Cosinus. Eliminiere die Schwingungen mit 
der doppelten Frequenz durch einen geeigneten Tiefpassfilter. Addiere 
die Quadrate der beiden Werte und ziehe die Wurzel. Du erhälst die halbe 
Amplitude der gesuchten Frequenz. Ist sie größer als ein Schwellenwert 
(z.B. 0,5), ist es eine 1, ansonsten eine 0.
Es muss lediglich der optimale Tiefpassfilter bestimmt werden.

von dietzi (Gast)


Lesenswert?

Danke für die Antwort. Das hilft mir schonmal weiter. Wie könnte die LUT 
aussehen? Spalte 1 = Wert des Samples, Spalte 2 = Sinus des Werts und 
Spalte 3 = Cosinus des Werts?

LG Dietzi

von dietzi (Gast)


Lesenswert?

Und was heißt optimaler Tiefpassfilter?

von dietzi (Gast)


Lesenswert?

Und zum Verständnis für mich: ich berechne den Sinus pro Sample? Also 
nach einem Phasenwechsel setze ich t=1 bei der Formel s=t  f  2 * pi 
und erhöhe t um 1 nach jedem Sampel? Und den Sinus bzw. Cosinus von s 
multipliziere ich mit dem Wert des "gelesenen" Sample?

von Gerald M. (gerald_m17)


Lesenswert?

Du brauchst einfach nur Sinus- und Cosinuswerte mit 1800Hz und 1200Hz 
die mit  deiner Samlplefrequenz ausgegeben werden.
Aufgrund der "krummen" Samplerate deines Line-in (?) ist es ratsam zwei 
Tabellen anzulegen:
1800Hz
44.1kHz/1800Hz= 24.5
Es empfiehlt sich also eine (Co)sinustabelle anzulegen, die aus 49 
Werten besteht und zwei volle Perioden enthält.

1200Hz
44.1kHz/1200Hz= 36.75
Also hier 147 Werte die vier Perioden enthält.

Sobald du startete multipliziert du deinen einkommenden Wert mit den 
Cosinus und Sinuswerten an 0. Stelle.
Der nächste einkommende Wert wird mit allen Werten in den 
Co/Sinustabellen an nächster Stelle multipliziert. Wenn du durch die 
Tabelle durch bist, fängst du sie wieder von vorne an.

Da du ja nur zwei deutlich verschiedene Frequenzen hast, würde es 
wahrscheinlich auch reichen die Anzahl der Samples zwischen Minimum und 
Maximum zu zählen. Bei 1200Hz sollten es ca. 36 Werte sein, bei 1800Hz 
ca. 25. Das ca. stört nicht, da du als Grenze ja z.B. 30 nehmen kannst. 
Zählst du also über 30, ist es eine halbe Periode der 1200Hz Schwingung, 
zählst du unter 30 ist es eine halbe Periode der 1800Hz Schwingung. Nach 
4 bzw. 6 halben Perioden ist es entsprechend eine 1 oder 0.
Wenn es wirklich die Nulldurchgänge sein MÜSSEN dann musst du eben 
vorher ableiten, sprich neues sample minus altes sample.

von dietzi (Gast)


Lesenswert?

Ich habe nun ein wenig probiert. Die Nulldurchgänge zu zählen hilft mir 
nur dann, wenn das Signal glasklar ist und kein Rauschen oder Sprache 
darüber liegt. Da aber beides der Fall ist bringt es mir nichts die 
Nulldurchgänge zu zählen. Ich habe versucht den Goertzel-Algorithmus zu 
nutzen - aber womit vergleiche ich das Ergebnis? Auch Sprache oder 
Rauschen interpretiert der Goertzel teilweise als "richtig".....

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.