Hallo Forum,
ich möchte mich ūber die Sommerpause mal mit Signalverarbeitung auf
einem Microcontroller beschäftigen. Als Board habe ich ein Nuclueo mit
STM32H7 Prozessor, das soll das Zielsystem sein. Bevor ich auf dem Board
anfange, habe ich mir erstmal die grundlegenden Komponenten in C/C++ auf
einem PC zusammengestrickt. Als erstes ein Programm was ein
Signalgenerator ist, der einen Sinus beliebiger Frequenz, Abtastrate,
Amplitude, .... in eine Datei schreibt. Dann ein Mischerprogramm das
eine WAV einliest und damit den Sinus aus der Datei AM moduliert. Der
nächste Prozess ist dann ein simuliertes ADC, der das AM Signal
einliest, wieder mit einem Localoscilator (cos/-sin) ins Basisband
mischt und dabei die I/Q Daten schreibt. Bis hierher alles i.O.. Als
nächstes soll ein DDC, also Tiefpassfilterung und Dezimierung vor der
Demodulation geschrieben werden. Mit der Auswahl des Filtertyps und der
Bestimmung der Filterkoeffizienten tue ich mich reichlich schwer.
Nachdem ich jetzt einige Tage diverse Bücher und Scripte zur
Signalverarbeitung gelesen habe, sehe ich den Wald vor lauter Bäumen
nicht mehr.
Gibt es vielleicht noch irgendein Buch "digitale Filter für Blöde" in
dem der Filterentwurf und die Berechnungen der passenden Koeffizienten
auf "Kindergartenniveau" beschrieben wird? Hilfreich ist vielleicht auch
ein Programm mit dem man grafisch eine Filterkurve zeichnen kann und was
als Output C-Code samt Filterkoeffizienten ausspuckt. Gibt es dort etwas
simples für den Hobbybedarf ?
Gruß und allen, trotz der Tropenhitze, eine gute und erholsame Nacht!
H05 schrieb:> Hilfreich ist vielleicht auch> ein Programm mit dem man grafisch eine Filterkurve zeichnen kann und was> als Output C-Code samt Filterkoeffizienten ausspuckt. Gibt es dort etwas> simples für den Hobbybedarf ?
MATLAB mit entsprechender Toolbox kann das.
H05 schrieb:> Gibt es dort etwas> simples für den Hobbybedarf ?
Matlab in simpel und ohne Lizenzgedoens gibts als GNU Octave.
So Funktionen wie: fir2, firls, remez, freqz, grpdelay koennten dir da
weiterhelfen.
Buecher ueber digitale Filter gibt's natuerlich zum Saufuettern, sind
aber preislich oft dem Umfang des Themas angemessen ;-)
Bei www.dsprelated.com gibts oft interessante Artikel.
Gruss
WK
Erstmal vielen Dank für die Antworten.
Ein Tool hatte ich gestern Nacht noch gefunden:
http://t-filter.engineerjs.com/
Gibt es ähnlich komfortables in einer Offline-Version?
Gustl B. schrieb:> Pyfda http://www.pyfda.org
Oh das sieht sehr gut und vielversprechend aus! Vielen herzlichen Dank,
damit werde ich sicher ein Schritt weiter kommen.
In der Literatur zur IQ-Demodulation wird immer unter den Teppich
gekehrt, dass die beiden Tiefpassfilter im Blockschaltbild ein
Hilbert-Filter sein müssen, also ein Breitband-90Grad-Phasenschieber.
https://de.wikipedia.org/wiki/Hilbert-Transformation#Berechnung_mit_FIR-Filter
Zwei FIR-Filter, das eine ist nur eine Zeitverzögerung um die halbe
Filterlänge des anderen.
Moin,
Christoph db1uq K. schrieb:> In der Literatur zur IQ-Demodulation wird immer unter den Teppich> gekehrt, dass die beiden Tiefpassfilter im Blockschaltbild ein> Hilbert-Filter sein müssen, also ein Breitband-90Grad-Phasenschieber.> https://de.wikipedia.org/wiki/Hilbert-Transformation#Berechnung_mit_FIR-Filter> Zwei FIR-Filter, das eine ist nur eine Zeitverzögerung um die halbe> Filterlänge des anderen.
Das glaube ich (in dieser Allgemeinheit) nicht, Tim.
Ueblicherweise gib's vorher eine Mischstufe, in der mit einem cos und
einem sin "runter"gemischt wird, danach sind die Tiefpaesse auch unter
dem Teppich identisch.
Gruss
WK
Sin und cos haben nur 90 Grad Unterschied, zur Auslöschung der einen
Seite müssen sie aber gegenphasig sein, also 180 Grad. Deshalb ist
irgendwo noch eine 90Grad-Verschiebung nötig.
Christoph db1uq K. schrieb:> In der Literatur zur IQ-Demodulation wird immer unter den Teppich> gekehrt, dass die beiden Tiefpassfilter im Blockschaltbild ein> Hilbert-Filter sein müssen, also ein Breitband-90Grad-Phasenschieber.> https://de.wikipedia.org/wiki/Hilbert-Transformation#Berechnung_mit_FIR-Filter> Zwei FIR-Filter, das eine ist nur eine Zeitverzögerung um die halbe> Filterlänge des anderen.
Nö, um zum äquivalenten Basisbandsignal zu kommen, muss man das
analytische Bandpasssignal nicht explizit bilden wenn die Mischstufe
vorgezogen wird. Hier sind die beiden Tiefpassfilter dann identisch
Und wie bekomme ich die beiden Signale I und Q? Ich habe ein einziges
Datensignal, das in diese beiden Zweige aufgespalten werden muss, genau
das entspricht der Phasenschiebung bei einem analogen Signal, z.B. aus
einem Mikrofon.
Es hilft nichts, zweimal 90 Grad ergibt erst die 180. Wo das stattfindet
kann man aussuchen, zwei Mischer mit Anschlüssen RF LO und IF müssen an
je zwei dieser Anschlüsse phasenverschobene Signale bekommen (oder
ausgeben, dann folgt der Phasenschieber danach). Üblich ist es, den LO
zu schieben, da das nur für eine Frequenz statt ein ganzes Band
passiert, den anderen Port kann man wählen. Zur digitalen Verarbeitung
ist das zweckmäßiger die niederfrequentere Seite, also Eingang beim
Sender und Ausgang beim Empfänger.
Christoph db1uq K. schrieb:> Und wie bekomme ich die beiden Signale I und Q?
genau das steht in dem Link über deinem Beitrag.
Kurze Zusammenfassung:
Am Sender wird ein Signal gesendet, dass in der Form
darstellbar ist.
Dieses Signal wird dann am Empfänger mit cos und -sin multipliziert.
Für I:
und der hintere Term mit der doppelten Frequenz wird durch den Tiefpass
eliminiert. Damit bleibt bei dem cos-Zweig nur I übrig.
Dasselbe für Q:
auch hier wir der hintere Term durch den Tiefpass eliminiert und es
bleibt Q übrig.
Christoph db1uq K. schrieb:> Es hilft nichts, zweimal 90 Grad ergibt erst die 180.
Man brauch keine 180° sonder 90° da dann orthogonal zueinander.
Den Wiki-Artikel zur QAM habe ich jetzt mal genauer durchgelesen. Diese
Demodulation nur mit einer Phasenschiebung funktioniert demnach nur im
Fall der kohärenten Demdulation, also mit einer Phasenlage des
Empfangsmischers, der irgendwie durch zusätzlichen Aufwand mit der
Phasenlage des Senders synchronisiert ist.
Dann wirken die beiden Tiefpässe wie die Bandpassfilter in einem
SSB-Empfänger nach der Filtermethode, nur dass wir hier direkt ins
Basisband heruntermischen. Wie bei jedem Direktmischer werden aus
Bandpässen Tiefpassfilter um das unerwünschte Seitenband zu
unterdrücken.
Wenn man nur ein Seitenband braucht kann man den anderen Tiefpass und
Mischer einfach weglassen und hat damit einen gewöhnlichen
Direktmischempfänger, allerdings mit Synchrondemodulator.
Christoph db1uq K. schrieb:> Diese> Demodulation nur mit einer Phasenschiebung funktioniert demnach nur im> Fall der kohärenten Demdulation
Bei QAM ist i.A. immer eine Synchronisation nötig, unabhängig von
Empfängerstruktur. Die beiden oben gezeigten IQ-Empfänger (ob mit oder
ohne Hilbert) sind 100% äquivalent zu einander. Es kommt auf die
Modulation an, ob inkohärente Empfänger möglich sind.
H05 schrieb:> ich möchte mich ūber die Sommerpause mal mit Signalverarbeitung auf> einem Microcontroller beschäftigen. Als Board habe ich ein Nuclueo mit> STM32H7H05 schrieb:> Gibt es vielleicht noch irgendein Buch "digitale Filter für Blöde"
Ach herrje. Also wenn überhaupt, dann wird das kein Thema für die
Sommerpause, sondern für viel länger. Und so ein Buch gibt es nicht
wirklich. Allenfalls lade dir das von http://www.dspguide.com/ herunter.
Ansonsten hast du erstmal ziemlich verkehrt angefangen. Deine
Soft-Signalgeneratoren etc. brauchst du garnicht - stattdessen solltest
du dich um genau 2 Dinge kümmern, die ich dir mal versuche zu erläutern:
1. Die Lowlevel-Seite des Problems.
Du brauchst auf alle Fälle 2 Signale I und Q und selbige sind
schlichtweg um 90° phasenversetzt.
Erster Weg dazu: Du erzeugst I und Q vor dem ADC mit einem dazu
passenden Mischer. Für sowas gibt es Schaltkreise, die das erledigen. Du
kannst auch den berüchtigten Tayloe-Mischer dir aufbauen, der
funktioniert auch. Mit so einer Konstellation kannst du nen gewöhnlichen
Stereo-Audio-ADC benutzen und ihn per I2S an deinen µC anbinden.
Zweiter Weg dazu: Du erzeugst I und Q nach dem ADC. Das heißt aber, daß
du einen schnellen ADC brauchst und dahinter ein FPGA. Dort den NCO
rein, die Multiplikation mit sin und cos und anschließend Dezimation.
Dann kann es weitergehen mit I2S in deinen µC. Ist teurer und macht sich
auch nicht von selbst.
Bei der Wahl des passenden µC würde ich an deiner Stelle zuerst schauen,
wie dort die I2S-Peripherie gemacht ist. Da gibt es gravierende
Unterschiede. Bei den STM32 hat es oft nur poplige
Universal-I2S+SPI-Cores, die obendrein nur 16 bittig arbeiten. Schau
deshalb nach einem "SAI"-Core und lies gründlichst, wie dieser Core zu
benutzen ist. Oftmals braucht man dringend DMA, um nicht in Interrupts
zu ersticken und dann ist es Glückssache, ob man einen sicheren Modus
findet, der also auch bei Störungen immer wieder sauber die richtige
Zuordnung L zu R (bzw. I zu Q) findet. Hast du Pech, vergaloppiert sich
das und du kriegst entweder ne Vertauschung I zu Q oder einen Versatz
Q(0) und I(-1) oder so. Also lesen und aufpassen. Da ist nicht jeder
SAI-Core so wie ein anderer.
Und danach solltest du erst entscheiden, welchen konkreten Chip du
nehmen willst.
2. Die Highlevel-Seite des Problems:
Lernen, wie man den CORDIC vor und zurück möglichst taktsparend
schreibt. Den brauchst du dringend zum Demodulieren.
Lernen, wie man die Taps für einen FIR-Filter berechnet. Geradeaus per
sin(x)/x ist leicht, ebenso das Applizieren eines Fensters. Wobei mMn.
je nach Fall eigentlich nur noch Blackman oder Kaiser in Frage kommen.
Aber bei Kaiser mußt du verschiedene Betas ausprobieren, was dir am
ehesten paßt.
Für SSB brauchst du eine weitere Phasenverschiebung, entweder
asymmetrisch (ein Kanal nur verzögert und der andere per Hilbert 90°
gedreht) oder symmetrisch (ein Kanal +45°, der andere -45°, die
Filterkernel dafür sind gleich, lediglich der eine von vorn nach hinten
und der andere umgekehrt). Sowas kann man machen und das letztere ist
wohl das elegantste und taktsparendste, weil man zusammen mit dem
Filtern sogleich auch die Phasendrehungen erledigt. "Ioawa Hills" machen
es uns vor, aber ich kann dir das zugehörige Rezept zum schreiben der
Berechnung auch nicht geben, ich bin da selbst auf der Suche.
So. Das alles ist erst mal eine Menge Papierkram OHNE jeglichen Zukauf
irgendwelcher Hardware. Fang also erstmal DAMIT an, sonst paddelst du
bloß hilflos im Datenmeer umher ohne festen Grund unter die Füße zu
kriegen.
W.S.
W.S. schrieb:> Ach herrje. Also wenn überhaupt, dann wird das kein Thema für die> Sommerpause, sondern für viel länger.
Nicht wirklich, das Thema ist locker zweimal in Sommerurlaub durch.
> Ansonsten hast du erstmal ziemlich verkehrt angefangen. Deine> Soft-Signalgeneratoren etc. brauchst du garnicht - stattdessen solltest
Nö auch nicht! Habe die ganze Signalkette Senden und Empfangen komplett
auf einem leistungsfähigen PC runtercodiert, um zu schauen ob das alles
so problemlos funktioniert. Und ja das tut es. Ich erzeuge AM, SSB und
FM-HF und kann diese auch wieder in meinem Empfangszeig einlesen und mit
einem virtuellen Radio abhören. Das war Ziel 1 - erfüllt! Ziel 2 war mit
dem "Plain C" auf den STM32 zu gehen und anzupassen. Auch Ziel 2 ist
erfüllt.
> du dich um genau 2 Dinge kümmern, die ich dir mal versuche zu erläutern:
Gäääh, Herr Oberlehrer! Noch nicht gesehen das das alles schon umgetzt
ist? Du erzählst werder mit dem Signalverlauf, noch mit der
Programmierung eines STM32 etwas Neues!
Einzig ein passendes Tool zum Erzeugen der Filterkoef. im DDC und DUC
hat noch gefehlt, aber dafür wurde oben ja schon eine wunderbare Lösung
genannt!
H05,
nicht aufregen, manche Leute wie W.S. können zwar lesen aber nicht
verstehen und müssen immer den Oberlehrer raushängen lassen! Die
schreiben immer den ganzen Urschleim runter und bekommen nicht mit das
das Problem praktisch gelöst ist.
@W.S. Deinen ganzen Text hat der T.O. doch schon in Kurzform
niedergeschrieben. Hast du nicht gerafft das es hier nur noch um
Filterentwurf ging?
H05 schrieb:> Nicht wirklich, das Thema ist locker zweimal in Sommerurlaub durch.
OK, dann mach mal. Du hast es ja nach deinem letzten Post schon alles
gelöst - aber warum fragst du dann überhaupt? Da du ja so schlau bist,
solltest du es doch selber können - gelle?
W.S.
@W.S.
Na ist doch wahr!
Ich frage nach einem Hilfmittel/Buch zum Filterdesign und Du kommst
kaust mir den Signalweg eines SDR runter. Willst mir erklären wo und wie
man den ADC hinknallt, das man einen schnellen ADC braucht und willst
mir was von Interrupts, DMA, NCO und Cordic erzählen. Ist ja alles
irgendwo auch richtig was Du schreibst, aber danach hatte ich doch gar
nicht gefragt!
Dann willst Du mir klarmachen, das mein Anfang völlig verkehrt war:
#Ansonsten hast du erstmal ziemlich verkehrt angefangen. Deine
#Soft-Signalgeneratoren etc. brauchst du garnicht -
Wenn ich das alles vorher mal auf dem PC als Proof-of-Concept modular
runtercodiere, bevor ich dann speziell auf den STM32 gehe, dann war der
Anfang eben nicht verkehrt, sondern Bestandteil meiner gestellten
Aufgabe.
Wenn jemand das SDR gleich auf einem STM32 codieren will, so kann er das
tun.
Ich habe das erstmal auf dem Rechner komplett in Software umgesetzt und
mir die Ausgangsdaten im virtuellen Oszi und Spektrumanalyzer angesehen
, ganz einfach weil ich das absichtlich so wollte!
H05 schrieb:> Dann willst Du mir klarmachen, das mein Anfang völlig verkehrt war
Ja was muß ich denn deinen eigenen Worten folgend von dir annehmen?
Siehe "Gibt es vielleicht noch irgendein Buch "digitale Filter für
Blöde" " und "Kindergartenniveau".
Und dann kommst du mit "Habe die ganze Signalkette Senden und Empfangen
komplett auf einem leistungsfähigen PC runtercodiert, um zu schauen ob
das alles so problemlos funktioniert."
Also hast du auch die zum Empfangen benötigten Filter schon im Signalweg
drinnen - ODER??
Was soll das also, willst du andere Leute wie mich hier an der Nase
herumführen?
Und welche deiner Aussagen gelten denn nun wirklich?
Ich habe dir nicht ohne Grund die zwei wirklich wichtigen Ansatzpunkte
genannt und erläutert. Von oben die theoretischen Grundlagen und von
unten das genaue Angucken und Durchrechnen der schieren Hardware. Ich
nehme nämlich an, daß all die schicken Algorithmen, die am PC mit float
in double und Gigahertztakt und Gigabytes an Ram und mehreren
Prozessorkernen tadellos funktionieren, auf einem Mikrocontroller sich
sehr schwer tun, weswegen dort das extreme Knausern mit Taktzyklen
angesagt ist.
Lies ganz einfach die Dspguide, dann siehst du sicherlich auf der
theoretischen Seite weiter.
Und schau dir diese Seite an: http://www.claysturner.com/
Der Mann ist ein wirklicher Fachmann. Von dem kann man was lernen.
W.S.
H05 schrieb:> Hilfreich ist vielleicht auch> ein Programm mit dem man grafisch eine Filterkurve zeichnen kann und was> als Output C-Code samt Filterkoeffizienten ausspuckt. Gibt es dort etwas> simples für den Hobbybedarf ?
Ist schon älter, aber funktioniert bei mir.
http://www.winfilter.20m.com/08/WinFilter08.zip
Und noch ein Online-Tool der Vollständigkeit halber:
http://www.micromodeler.com/
der Codegenerator ist leider in der freien Version beschränkt auf
maximal 21 Koeffizienten bei FIR oder maximal Ordnung 4 bei IIR, aber
immerhin.