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
Goertzel oder Lock-in (Multiplikation mit den gesuchten Frequenzen und Tiefpassfilter) Wird das live berechnet? Am PC?
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
Wie kannst du mit einer baudrate von 1.2kbps eine Frequenz von 1800Hz live berechnen?
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
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
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."
Danke für das Zitat. Was aber heißt das nun konkret auf Software-Basis?
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.
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.