Forum: Mikrocontroller und Digitale Elektronik Digitale FSK Demodulation mit Goertzel Algorithmus


von Mathias (Gast)


Lesenswert?

Hallo!

Erstmal meine Anforderung an das System:

f0= 38400Hz
f1= 38700Hz

Baudrate = 300 Baud

Frequenz und Baudrate sind gegeben und können leider nicht verändert 
werden!

Auf der Suche nach geeigneten Filtermethoden bin ich auf digitale Filter 
und hier im speziellen auf den Goertzel Algorithmus gestoßen, da dieser 
im Vergleich zu einer FFT bzw. FIR und IIR Filtern wesentlich schneller 
arbeiten soll.

Nur liegen die Frequenzen, etwa bei DTMF, wesentlich niedriger und 
deshalb bin ich nicht sicher ob dieser Algorithmus für meine Frequenzen 
überhaupt funktioniert bzw. sinvoll ist!?

Hier habe ich mich einmal in die Grundlagen des Algorithmus eingelesen:
http://www.embedded.com/story/OEG20020819S0057

Die Samplingrate wäre demnach bei mir 80000 ( min 38700*2)

Die Auflösung hätte ich aufgrund des geringen Abstandes beider 
Frequenzen auf 100Hz gelegt. Folglich wäre die Blocksize 800.

Die Auswertung eines Blocks würde daher 1/80000Hz * 800 = 10ms 
benötigen, also länger als ein Bit (3.3ms).

Als Controller hätte ich mir einen C8051F5X von Silabs mit 50Mips 
vorgestellt, eventuell auch noch einen Cortex M3. Nur ist eine sinvolle 
Auswertung der FSK mit gegebenen Parametern mittels Goertzel Algorithmus 
überhaupt möglich?

Und wenn nein, wäre die Messung der Periodendauer sinvoller?

Vielen Dank im Voraus!

lg, Mathias

von zwieblum (Gast)


Lesenswert?

probier's aus, Sourcode vom Algorithmus hast du ja.

von Karl (Gast)


Lesenswert?

Was ist denn sonst noch alles auf der Leitung? Evtl. kann man mit 
Undersampling arbeiten. Wie groß ist die mögliche VErstimmung zwischen 
Sender und Empfänger? Es wird dir auf jeden Fall nichts bringen, wenn du 
nur alle 10 ms eine Aussage bekommst, also solltest Du dich mal mit 
Zero-Padding befassen und das Fenster in kleineren Abständen neu 
berechnen.

Sag mal GENAU, was das werden soll. Und: Versuch macht Kluch. Octave 
bzw. Matlab sind deine Freunde.

von Purzel H. (hacky)


Lesenswert?

Den goerzel zum demodulieren von FSK ? Was soll das ? Es gibt genau zwei 
Frequenzen, die detektiert werden muessen. Dann sollte man sich auch 
einen Zweikanalfilter basteln, der genau das kann. Das waer dann ein FIR 
Filter mit je ein paar MACs.

von Karl (Gast)


Lesenswert?

Ohne Anpassung der Frequenzen wird es in der gegebenen Konstellation 
aber schwierig. Den Görtzel könnte man schon nehmen und er wird auch in 
einigen ASICs verwendet.

von ---- (Gast)


Lesenswert?

Mal so ne Idee: Signal mittels Bandpass filtern, digitalisieren und mit 
38550Hz herunter mischen (mittels IQ-Mischer in Software). Die 
Drehrichtung des Phasors gibt dann Auskunft über die Frequenz.

von Mathias (Gast)


Lesenswert?

Danke für eure Vorschläge, nur was ist jetzt am sinvollsten bzw. am 
einfachsten umsetzbar ohne sich tief in die Mathematik einarbeiten zu 
müssen?

Idealerweise sollte das Ganze mit einem ATMega oder 8051 realisiert 
werden können.

FIR Filter wären sicher eine Möglichkeit. Kann mir vielleicht jemand 
überschlagsmäßig sagen welche Ordnung ein solcher haben müsste um beide 
Frequenzen (38,4kHz und 38,7kHz) zu filtern?

Die Mischung klingt auch sehr interessant, jedoch auch nicht wirklich 
einfach zu realisieren? Außerdem wird hier wohl zusätzlicher 
Hardwareaufwand nötig sein.

lg

von ---- (Gast)


Lesenswert?

Wenn es möglich währe den ADC genau auf (38550 * 4) Hz einzustellen, 
dann könntest du dein Signal direkt herunter mischen. Nach dem Samplen 
verwendest du für I jedes vierte Sample und für Q jedes vierte Sample + 
1 (90°) (I = s[n*4], Q = s[n*4+1]). Danach können die I/Q-Daten noch um 
den Faktor k reduziert werden (Ir = I[n*k], Qr = Q[n*k]). Die Richtung 
des Phasors lässt danach einfach bestimmen.

von Mathias (Gast)


Lesenswert?

Hallo!

Angenomen ich schaffe es die ADC Messung per Timer-IR auf die gewünschte 
Mittenfrequenz zu triggern.

Somit wäre es wie von dir beschrieben möglich Samples für I und Q 
aufzunehmen.

Nur wie werte ich die aufgenommen Samples dann aus und bekomme 
schließlich die gewünschte Bitfolge?

Leider finde ich im Internet keine konkreten Informationen dazu.

Wäre dir sehr dankbar wenn du mir etwas weiterhelfen könntest bzw. 
Literaturangaben, Softwarebeispiele etc. hättest!

Wie rechenintensiv würdest du die Auswertung einschätzen, mit 8-Bit uC 
noch machbar?

lg

von ---- (Gast)


Lesenswert?

Die einzelnen I/Q Samples sind eigentlich nur Komplexe Zahlen. Mittels 
atan() kann die Phase ermittelt werden. Betrachtet man die Phase 
mehrerer Samples, kann der Phasenverlauf ermittelt werden. Der 
Phasenverlauf CW/CCW gibt Auskunft ob die Frequenz grösser oder kleiner 
38550Hz ist.

Damit das funktioniert, müssen störende Frequenzen vor dem Samplen aus 
dem Signal gefiltert werden. Der Takt des ADCs darf "keinen" Jitter 
haben. Eine komplette Lösung kann ich dir nicht geben, am besten 
probierst du es einfach mal aus.

von FunkAbsorber (Gast)


Lesenswert?

Moin,

ich steh/stand auch vor einem ähnlichen Problem. Ich habe mir die Freq. 
auf etwa 2 KHz runter gemischt und dann per Soundkarte die Daten 
eingelesen. Die weitere Bearbeitung dann per Software um zu sehen wie 
rechenintensiv das ganze ist. Leider bin ich bei 2 FIRs mit zu vielen 
TABs hängen geblieben :-/, der Vergleich der Frquenzen hat danach aber 
funktioniert und das Signal konnte rekonstruiert werden. Ich könnte 
einen Soundkartenchip nehmen und die FIRs in Hardware verbauen, das ist 
aber ein heiden Aufwand. Um es kurz zu machen:

An einem Algorithmus und/oder Erklärung wäre ich auch interessiert.


Grüße.

von ---- (Gast)


Angehängte Dateien:

Lesenswert?

Habe was in Matlab gemacht, was das Verfahren erklären sollte. Ich hoffe 
es funktioniert auch unter realen Bedingungen (Rauschen, Clk-Jitter, 
...).
1
baud = 300;
2
fs = 38550 * 4;
3
4
% Signal für Simulation generieren
5
l = fs/baud;
6
w = 2*pi/(fs/(38400));
7
lo = sin(linspace(0,w*l-1,l));
8
w = 2*pi/(fs/(38700));
9
hi = sin(linspace(0,w*l-1,l));
10
11
% Vom ADC abgetastetes Signal fs = 154200 Hz
12
signal = [lo, hi, lo, hi, hi, hi, lo];
13
14
% Analytisches Signal fs = 38550 Hz
15
inphase = signal(1:4:length(signal));
16
quadratur = signal((1:4:length(signal))+1);
17
18
% Samplingrate dezimieren fs = ~2000 Hz. Kann je nach Auswertung noch
19
% weiter dezimiert werden (eventuell durch mitteln).
20
inphase_r = inphase(1:20:length(inphase));
21
quadratur_r = quadratur(1:20:length(inphase));
22
23
% Phasenverlauf berechnen. Da nicht die Phase selbst interessiert sonden
24
% den Verlauf, kann ein effizienteres Verfahren implementiert werden. 
25
angles = unwrap(angle(inphase_r + 1i*quadratur_r));
26
27
plot(angles, '-o');

von Mathias (Gast)


Lesenswert?

Hallo  ----!

Dank deiner Hilfe habe ich das ganze soweit verstanden!

Testweise habe ich das ganze mal in Scilab ausprobiert und 
folgendermaßen umgeschrieben:
1
baud = 300;
2
fs = 38550 * 4;
3
4
// Signal für Simulation generieren
5
l = fs/baud;
6
w = 2*%pi/(fs/(38400));
7
lo = sin(linspace(0,w*l-1,l));
8
w = 2*%pi/(fs/(38700));
9
hi = sin(linspace(0,w*l-1,l));
10
11
// Vom ADC abgetastetes Signal fs = 154200 Hz
12
signal = [lo, hi, lo, hi, hi, hi, lo];
13
14
// Analytisches Signal fs = 38550 Hz
15
inphase = signal(1:4:length(signal)); // jeden 4ten Wert von Signal verwenden
16
quadratur = signal((1:4:length(signal))+1); //jeden 4ten Wert+1 von Signal verwenden
17
18
// Samplingrate dezimieren fs = ~2000 Hz. Kann je nach Auswertung noch
19
// weiter dezimiert werden (eventuell durch mitteln).
20
inphase_r = inphase(1:20:length(inphase)); //jeden 20igsten Wert von inphase verwenden
21
quadratur_r = quadratur(1:20:length(inphase)); //jeden 20igsten Wert von quadratur verwenden
22
23
// Phasenverlauf berechnen. Da nicht die Phase selbst interessiert sonden
24
// den Verlauf, kann ein effizienteres Verfahren implementiert werden.
25
z = inphase_r + %i*quadratur_r;
26
angles = atan(imag(z),real(z));
27
28
plot(angles, '-o');

Das Ergebnis vom plot sieht jedoch ganz anders aus als bei dir!
Die angle-Funktion habe ich durch die arctan Funktion ersetzt. 
(http://www.scilab.org/product/dic-mat-sci/angle.html)
Unwrap gibt es bei Scilab standardmäßig wohl nicht!?

Bezüglich der Realisierung in einem uc, beschränkt sich die Rechenarbeit 
ja dann auf eine atan Funktion?

Bei Verwendung einer atan Funktion mit CORDIC 
(http://www.8051projects.net/downloads108.html), welche mit Shiften, 
Addieren und Subtrahieren auskommt, wäre das doch wohl auch mit einem 
8-Bit uC möglich?

Vielen Dank nochmal!

von Mathias (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch der Phasenverlauf!

von ---- (Gast)


Lesenswert?

Die unwrap Funktion macht den Unterschied, denn der Bildbereich von atan 
ist definiert für (-pi, pi). Die Berechnung der Phase mittels atan() 
dient in diesem Beispiel nur für die Darstellung. Die Drehrichtung 
sollte sich auch ohne atan direkt aus z ermitteln lassen. Dadurch wird 
der Rechenaufwand minimal und kann IMO auf einem MCU implementiert 
werden.

von Mathias M. (aragorn)


Lesenswert?

Stimmt jetzt fällts mir selber auf! :-)

Ist im Prinzip der gleiche Graph nur das er bei meinem Bild immer bei pi 
abschneidet!

Das heißt wenn ich wie in deinem Beispiel das Signal auf ~2KHz 
dezimiere, dann würden einem Bit ungefähr 6 Messwerte mit der selben 
Phasendrehrichtung entsprechen?

Bezüglich der Bestimmung der Drehrichtung direkt aus Z, stehe ich gerade 
irgendwie auf der Leitung!

Inphase wäre ja "cos*(w*t+phi)" und Quadratur "j*sin(w*t+phi)"?

Nur auch wenn alles bis auf phi konstant bleibt, wie kann ich dann 
direkt auf die Drehrichtung schließen?

von ---- (Gast)


Lesenswert?

Stell dir einen Zeiger auf der Gaußschen Zahlenebene vor, dieser Zeiger 
bewegt sich im Uhrzeigersinn wenn z.B. im 1. Quadrant von Messung zu 
Messung real(Z) grösser und imag(Z) kleiner wird. Du brauchst daher nur 
den Quadranten und die Änderung an Z zu ermitteln um die Drehrichtung 
bestimmen zu können.

von Mathias M. (aragorn)


Lesenswert?

Hallo!

Habe jetzt einmal einen ersten Versuch mit einer anderen Frequenz 
unternommen, welche ich mir exakt mit Timer-Auto Reload erzeugen kann.
Der ADC ist damit getriggert und misst exakt in diesen Abständen. Habe 
zur Überprüfung auch noch einen Pin getoggelt und die Frequenz mit einem 
Oszi überprüft!

Als Mittenfrequenz habe ich jetzt für Testzwecke 18,75kHz gewählt, 
folglich wird mit 75kHz abgetastet!

Dabei habe ich jeden 4rten Wert in ein Array bInphase[] gespeichert und 
jeden 4rten Wert + 1(90° phasenverschoben) in das Array bQuadratur[]!


Zum Testen habe ich mittels Simulator 18.6kHz und 18.9kHz angelegt!

1.) 18.6kHz am Eingang (18,75kHz Mittenfrequenz)

 I   Q
242 170
 11  82
245 176
  9  76
248 182
  6  70

2.) 18.9kHz am Eingang (18,75kHz Mittenfrequenz)

 I   Q
162  64
 96 194
156  58
102 199
149  53
109 204


Prinzipiell ist bei beiden Frequenzen eine Tendenz bzw. Drehung zu 
erkennen. Vielleicht könntest du mir noch bei der Interpretation des 
Ergebnisses helfen? Bzw. eine Aussage darüber treffen ob eine Filterung 
beider Frequnen mit dieser Methode aufgrund def Messergebnisse 
zielführend ist?

lg

von Mathias M. (aragorn)


Lesenswert?

Habe jetzt noch den Fehler gefunden, warum sich bei mir immer nur jeder 
2te Messwert in die selbe Richtung ändert.

Habe ja wie beschrieben die 75kHz an einem Pin ausgegeben, nur wenn ich 
bei jedem Timer-Überlauf einen Pin Toggle habe ich die doppelte Frequenz 
also 150kHz und nicht 75kHz :-)

Habe jetzt die Frequenz mit der ich messe auf 75kHz geändert und erhalte 
folgendes Ergebnis:

1.) 18.6kHz am Eingang (18,75kHz Mittenfrequenz)

 I   Q
170  7
176 10
182 12
187 15
193 18
198 22

=> Realteil wird größer, Imaginärteil wird kleiner => Drehung CW => 
niedrigere Frequenz!

2.) 18.9kHz am Eingang (18,75kHz Mittenfrequenz)

64 17
58 21
53 24
48 28
43 32
38 37

=> Realteil wird kleiner, Imaginärteil wird größer => Drehung CCW => 
höhere Frequenz!

So wie es aussieht funktioniert die Auswertung im Simulator und ist 
recht simpel! Wichtig ist eben dass die ADC Messung mit höchster 
Priorität durchgeführt wird! Hier eben per Timer Auto Reload und 
getriggerter Messung
=> Frequenz sollte immer stimmen!

von FunkAbsorber (Gast)


Lesenswert?

Sehr schön !

Hast du mal ein Signal mit Störungen probiert ?

von ---- (Gast)


Lesenswert?

Sieht schon mal gut aus. Beim Abtasten vom Signal muss man aber 
vorsichtig sein. Hat der Takt vom ADC Jitter verschlechtert sich der 
Rauschabstand. Was für einen ADC verwendest du eigentlich und wie 
betreibst du ihn?

Gruss Samuel

von Mathias M. (aragorn)


Lesenswert?

Hallo!

Mit einem Signal mit Störung habe ich es noch nicht probiert!

Bisher habe ich den internen ADC eines LPC900 Derivats verwendet und wie 
gesagt sind die Messwerte mit dem Simulator entstanden!

von Martin (Gast)


Lesenswert?

Kannst du eine WAV-Datei von ein paar Sekunden Länge posten?

von marc (Gast)


Lesenswert?

>Frequenz und Baudrate sind gegeben und können leider nicht verändert
>werden!

Wenn Du nur eine der Frequenzen nimmst und auf Phasenkodierung 
umsteigst, könnte das Verfahren hier für Dich das richtige sein:

Beitrag "PSK 31 Modlulation im Mikrocontroller"

von Mathias M. (aragorn)


Angehängte Dateien:

Lesenswert?

Hall!

Das Prinzip des IQ Demodulators würde jetzt ja theoretisch 
funktionieren.

Aufgrund der Tatsache, dass ich jetzt doch einen ARM Cortex M3 verwende 
bin ich beim überlegen ob ich nicht doch mit einem FIR oder IIR Filter 
arbeiten soll.

Habe mir mit "Filter Solutions" einmal angeschaut welche Ordnung ich bei 
einem IIR Filter benötigen würde, bzw. wieviele Taps ein vergleichbarer 
FIR filter benötigt.

Also bei einem IIR Filter sieht das mit einer Ordnung von 3 schon sehr 
gut aus (siehe Anhang)!

Ein vergleichbarer FIR Filter würde schon an die 5000 Taps benötigen!

Laut dem STM32 Appnote: 
http://www.st.com/stonline/products/literature/um/14988.pdf benötigt 
aber schon die Berechnung eines 32 Tap FIR Filters ~50us. 
Schätzungsweise würde also ein 5000Tap FIR an die 10ms benötigen.

Hingegen benötigt ein 8 stufiger IIR Filter nur 28us! D.h. ein 3 
stufiger müsste sich noch wesentlich schneller berechnen lassen!

Bei Verwendung einer Abtastrate von 80kHz ergibt sich eine Periodendauer 
von 12,5us pro Messwert. Mit einem IIR Filter 2ter oder 3ter Ordnung 
wäre es also vielleicht sogar möglich laufend zu messen.

Wie sind eure Erfahrungen mit IIR Filtern in der Praxis? Wie wirkt sich 
die nichtlineare Gruppenlaufzeit aus?

FIR scheidet ja leider schon mal aus, weil er schon für eine Berechnung 
länger als die Bitdauer (3.33ms) benötigen würde.

Wie würdet ihr die FSK Demodulation realisieren? In gewissen Abständen 
die Ausgänge beider IIR Filter vergleichen, oder doch wenn möglich 
laufend?

lg, Mathias

von ---- (Gast)


Lesenswert?

Ich kenne dein reelles Signal nicht um eine Aussage über die 
Notwendigkeit eines so aufwändigen Filters zu machen. Kannst du das 
Spektrum deines Signals veröffentlichen? Folgende Massnahmen solltest du 
aber unbedingt beachten damit das ganze zuverlässig funktioniert (nach 
Priorität sortiert).

1. Vor dem Sampeln muss das Signal mit einem schmalbandigen 
Bandpassfilter gefiltert werden.

2. Sauberes Abtasten des Signals (Jitter beachten!).

3. Nach des Mischen also bei inphase und quadratur (siehe Script) 
beträgt die Frequenz des Signals nur noch 150Hz bei einer sampling rate 
von 38550Hz. Die Dezimierung könnte verbessert werden, wenn ein Filter 
eingesetzt würde. Wahrscheinlich reich es, wenn man einfach den 
Mittelwert bildet (bei der Mittelung von 20 Samples kann sich der SNR 
bis zu 13 dB verbessern!).

Gruss Samuel

von Ulrich (Gast)


Lesenswert?

Mit dem FIR oder IIR Filter oder ähnlchem hat man noch fast nichts 
gewinnen. Man hat nur einige Störungen rausgefiltert aus anderen 
Frequenzbereichen. Die Eigenliche demodulation muß man weiterhin machen.

Die Lösung mit dem Phasor ist da schon ganz gut. Wenn der AD wandler es 
hergibt und man die Recehnzeit hat, könnte man auch mit einer anderen 
Abtastrate arbeiten. Dann muß man nur ggf. die Mischung wirklich rechnen 
mit sinus und cosinus werten. Wobei sich das vereinfachen kann wenn die 
Frequenz in einem einigermaßen einfachen Verhältnis zu der Mischfrequenz 
steht, dann kann man ein tabelle nehmen, die hat in dem Beistpiel oben 
gerade nur werte von -1,0 und 1 enthielt.

Zum Dezimieren muß man auch keine scharf abgegrenzten Blöcke nehmen. 
Etwas überlapp und ein kontinuierlicher Übergang sind dabei hilfreich 
ähnlich wie bei der FFT. Das man eine Datenrate von 300 Baud auslesen 
will, solle die Rate nach dem Dezimieren schon etwas höher liegen, also 
eher in der Größenordnung 1000 Hz, etwa so viel bei den Tests oben. 
Durch die geringe Abtastrate ist die darauffolgende Bestimmung der 
Steigung relativ unkritisch von der Rechenzeit, den arctan braucht man 
dann nur noch rund 1000 mal die Sekunde berechnen, und eine große 
Auflösung wird hier auch nicht gebraucht  (8 bis 12 Bits sollten 
reichen).

Eine Alternativ zur Berechnung mit dern Arctan, wäre es eventuell die 
amplituden für Frequenzen von +150Hz und -150 Hz ähnlich dem 
Görzelagorithmus zu bestimmen, nur dann halt bei der viel niedriegeren 
Frequenz und aus den IQ-Daten.

Ein wirklich scharfer Filter vor der Modulation ist nicht nötig, die 
Modulation ist gibt schon eine gute Unterdrückung fremder Frequenzen. 
Ein analoger Antialiasingfilter ist natürlich trotzdem sinnvoll, und das 
kann hier halt auch mal ein Bandpass sein, weil man die niedriegen 
Frequenzen ja nicht braucht.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Nimm einen NE567 als 'Coprozessor'. Dazu noch 3-poliges 
Butterworth-Filter oder ähnlich. Fertig.

von Mathias M. (aragorn)


Lesenswert?

Hallo!

Bezüglich des Spektrums. Es handelt sich um ein kabelgebundenes System, 
auf dem prinzipiell keine anderen Frequenzen vorhanden sein sollten. 
Jedoch sollen mögliche Störquellen entlang der Leitung mit beliebiger 
Frequenz keinen Einfluss auf die Datenübertragung haben. (Außer 
natürlich die Störquelle hat die selbe Frequenz wie die für die 
Datenübertragung..)

Extern möchte ich maximal den nötigen Antialiasfilter (TP oder eben hier 
BP) verwenden.

Also findet ihr ist es sinvoller die Demodulation mittels IQ Mischer zu 
machen. Bei Verwendung von zwei IIR Filtern müsste ich ja nur noch die 
Amplituden der Ausgangssignale vergleichen und hätte somit schon meine 
Information!?

Um noch einmal auf die Auswertung des IQ Mischers zurückzukommen:

1. Ich taste mit der 4fachen Frequenz ab
2. Jeder 4rte Wert = I, Jeder 4rte Wert +1 = Q

Anschließend erhalte ich beispielsweise folgende Werte bei f0 am 
Eingang:

n  I   Q    n   I   Q
1  21  56   21 130  0
2  24  50   22 136  0
3  28  45   23 143  1
4  32  41   24 149  2
5  37  36   25 155  3
6  41  32   26 161  5
7  46  27   27 168  6
8  51  24   28 174  9
9  57  20   29 180 11
10 62  17   30 185 14
11 68  14   31 191 17
12 74  11   32 197 21
13 79   8   33 202 24
14 85   6   34 207 28
15 92   4   35 212 32
16 98   3   36 217 37
17 104  1   37 221 41
18 11   0   38 225 46
19 117  0   39 229 51
20 123  0   40 233 57

Diese Werte könnte man jetzt dezimieren, bzw. einen Mittelwert daraus 
bilden. Jedoch besteht doch immer das Problem des Überlaufs bei 255?

lg

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Hm. Was du machst ist natürlich deine Sache. Wie die Leute hier drauf 
reagieren, deren Sache.

Soll das nun was praktisches werden oder als Lernplattform für 
DSP-Demodulation dienen? Für mich ist das auf Spatzen mit Kanonen 
geschossen.

Irritiert -
Abdul

von Mathias M. (aragorn)


Lesenswert?

Wird was praktisches und war auch schon als fertiges Produkt analog 
gelöst.

Gibt für mich einige Gründe es diesmal in SW zu realisieren!

Lieber mit Kanonen auf Spatzen schießen (da ich die Rechenpower so und 
so habe) und es funktioniert, als umgekehrt!

Keiner mehr eine Anregung?

lg

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ich sehe einfach keinen Grund eine simple binäre Modulation aufwändig 
per DSP zu mathematisieren. Das sieht bei 64QAM anders aus, gerne.

Soll heißen, deine vorherigen Designs taugten wohl nix.

Der Goertzel ist equivalent zu einer FFT ohne Ausgabe der Phase. 
Interessant, wenn man gleichzeitig mehrere Frequenzen (n>2!!) beobachten 
muß, z.B. MFW beim Telefon.

Wenn es dir auf maximales Rauschabstand ankommt, brauchste ein FIR als 
'Matched Filter'.

Soll es besonders elegant sein, dann BP, delay, XOR, LP, 
Schmitt-Trigger. Kann in Software sein oder teils in Hardware wie z.B. 
beim PSoC von Cypress. AppNote findest du dort. Das habe ich getestet 
und funzt entsprechend dem Aufwand sehr gut.

Ja, ist alles ohne IQ, so ein Mist aber auch.


Viel Spaß!

von Mathias M. (aragorn)


Lesenswert?

Hallo!

Sry für die späte Antwort!

Das vorherige Design funktioniert soweit ganz gut. Gründe jetzt einen 
digitalen Ansatz zu wagen sind unter anderem: Bauteiltoleranzen, 
Verfügbarkeit (Chips wie NE567, MF10 etc. sind eher beim Aussterben), 
Kosten

Rechenleistung in Form eines ARM Cortex M3 habe ich, also weiß ich 
ehrlich gesagt nicht was gegen eine digitale Implementierung spricht?

Aber bitte belassen wir es jetzt dabei, Grundsatzdiskussionen helfen wir 
leider nicht weiter.

Der Ansatz von Samuel (----) mit dem IQ Demodulator ist doch extrem 
simpel zu implementieren und außerdem benötigt er kaum Rechenzeit! Ich 
werde das ganze jetzt auf meiner Zielplattform implementieren und 
anschließend in der Praxis testen!

Vielleicht hat ja noch jemand eine Idee bezüglich der Auswertung?

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Gut, ist ein freies Land lol

Welche Anregung? Der Überlauf bei 255? Floating-Point oder als auf 
Integer skalieren oder gebrochene Int-Frac Darstellung. Das alles jetzt 
durchzukauen, wird zu langwierig. Du wirst Bücher und Google bemühen 
müssen. Wenn du genug Zeit hast, ist das ja kein Problem.

Such dir AppNotes der Hersteller und moddele das auf deine Parameter um. 
Ist alles ein alter Hut. Grundsätzlich kannst du dir auch alles zur 
BPSK-Demodulation reinziehen, da der Unterschied nur minimal ist.

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.