Datum:
Kennt jemand das PSK31 Verfahren zu Datenübertragung über einen Analogkanal? http://de.wikipedia.org/wiki/PSK31 Ich frage mich, ob man dieses Prinzip in einem Atmega8 oder ähnlichem implemetieren könnte. Nach einiger Überlegung bin ich der Meinung, dass es geht, wenn man Tricks wie Abtastratenreduktion usw. anwendet. Mir ist noch unklar, wie die Zeichenkodierung funktioniert. Irgendwie muss man sich auf die Phase synchronisieren um zu erkennen, ob eine 1 oder eine 0 übertragen wird. Daher meine Vermutung: die Information kann eigenlich nur im Phasenwechsel kodiert sein.
Datum:
Gibt es schon, ein ATmega als PSK31-Decoder und Encoder mit einem inzwischen nicht mehr lieferbarem Display von Pollin: http://www.aatis.de/content/aatis-bei-der-ham-radio-2008 "...Am gleichen Stand werden Workshops zum Aufbau eines einfachen und preisgünstigen PSK31-Controllers angeboten, so dass Sende- und Empfangsbetrieb ohne Einsatz eines PCs oder Notebooks durchgeführt werden kann. Der Transceiver muss dabei eine Abstimmung von 10Hz ermöglichen. Es wird nur eine PC-Tastatur mit deutschem Zeichensatz benötigt. Jeweils bis zu zwölf Interessenten können täglich um 9.30 Uhr und um 13.30 Uhr unter Anleitung diese Schaltung aufbauen."
Datum:
Klingt interessant. Schade, dass es nicht mehr Informationen gibt: Ist ein externer AD-Wandler eingebaut? Ist die Schaltung wirklich mimimalistisch, also nur Atmega und Display? Vor allen Dingen: wie ist die Signalverarbeitung umgesetzt? Ist tatsächlich ein I/Q Mischer implementiert? Noch eine andere Frage: kann man mit einem Weltempfänger auf irgendeinem Band solche Signale empfangen?
Datum:
Angehängte Dateien:So sieht die Schaltung und das Blockdiagramm aus. Es gibt einen Artikel dazu im Praxisheft 18.
Datum:
Angehängte Dateien:Anscheinend kann ich nicht nachträglich eine zweite Datei anhängen, hier das Blockdiagramm aus dem Artikel.
Datum:
PSK31 ist im Internet ausführlichst bis ins letzte Detail dokumentiert. Einfach nach "PSK31" googeln und lesen. :-) Kostenlose PSK31-Software auf dem PC installieren, SSB-Weltempfänger mit der Soundkarte verbinden, PSK31-Frequenz einstellen. Fertsch! :-)
Datum:
Hallo Christoph, vielen Dank für die Unterlagen. Beim Durchsehen des Schalplans meine ich Optimierungsmöglichkeiten zu erkennen: Den R2R DAC könnte man durch eine einfach PWM mit RC-Tiefpass ersetzen. Das würde Bauteile spaaren. Ausserdem könnte man den nachfolgenden Verstärker weglassen und statt dessen eine AGC im Eingangszweig implementieren. Auf der Softwareseite ist mir noch nicht ganz klar, warum da eine FFT implementiert ist. Um die Phase zu bestimmen, ist die nicht notwendig, oder? marc
Datum:
Hallo marc. > Den R2R DAC könnte man durch eine einfach PWM mit RC-Tiefpass ersetzen. > Das würde Bauteile spaaren. Vorsicht! PSK31 soll auch schmalbandig sein. Wenn Du irgendwelche Artefakte, Nichtlinearitäten oder gar Reste vom Takt auf dem Signal hast, funktioniert Deine Übertragung möglicherweise noch, aber Du störst andere mit dem breitbandigen Störnebel, und letztlich wird Deine Leistungsbilanz auch mies. In Bezug auf Linearität des Audiozuges ist PSK31 relativ anspruchsvoll. Also an dem Punkte GUT FILTERN! > Auf der Softwareseite ist mir noch nicht ganz klar, warum da eine FFT > implementiert ist. Um die Phase zu bestimmen, ist die nicht notwendig, > oder? Es gibt PSK 31 Phasenumtastung mit 180 Grad, aber eben auch mehrfach mit 90 Grad. Ersteres ist langsamer, aber störfester, zweites empfindlicher aber schneller, weil du eine höhere Anzahl von Zuständen überträgst bei gleichem Takt. Es gibt auch noch Varianten mit schnellerem oder langsamerem Takt. Ausserdem willst Du eventuelle Frequenzabweichungen noch ausgleichen können..... FET könnte Dir dafür die Parameter liefern. Die Problematik solcher Stand allone Lösungen ist meist die Abstimmanzeige....oder Du brauchst eine NF-AFC. Die wird aber möglicherweise von benachbarten Stationen (insbesondere wenn sie breitbandig sind) schon beinflusst. Mit freundlichem Gruß: Bernd Wiebus alias dl1eic http://www.dl0dg.de Selbsterkenntnis ist der erste Schritt zur Depression. Jeder echte Wettbewerb ist ruinös. Darum beruht jede funktionierende Wirtschaft auf Schiebung.
Datum:
>> Den R2R DAC könnte man durch eine einfach PWM mit RC-Tiefpass ersetzen. >> Das würde Bauteile spaaren. >Vorsicht! PSK31 soll auch schmalbandig sein. Wenn Du irgendwelche >Artefakte, Nichtlinearitäten oder gar Reste vom Takt auf dem Signal In einem Beispiel für ein PSK31 Signal habe ich eine Signalfrequenz von 1600Hz gesehen. Wenn man eine PWM Frequenz von 32Khz nimmt und einen doppelten RC Tiefpass nachschaltet dürfte der Noise flor deutlich kleiner 46dB sein. Ich würde vermuten, dass das sogar eine besseres Ergebnis als beim R2R DAC mit seinen toleranzbehafteten Widerständen ist.
Datum:
Hallo marc. > In einem Beispiel für ein PSK31 Signal habe ich eine Signalfrequenz von > 1600Hz gesehen. Wenn man eine PWM Frequenz von 32Khz nimmt und einen > doppelten RC Tiefpass nachschaltet dürfte der Noise flor deutlich > kleiner 46dB sein. Ich würde vermuten, dass das sogar eine besseres > Ergebnis als beim R2R DAC mit seinen toleranzbehafteten Widerständen > ist. Das ist Richtig. Du must halt nur darauf achten. PSK31 ist eben nicht in dem Sinne "digital", als das Du meinst, Du hättest auf unterster Ebene nur mit "High/Low" zu tun. Mit freundlichem Gruß: Bernd Wiebus alias dl1eic http://www.dl0dg.de Selbsterkenntnis ist der erste Schritt zur Depression. Jeder echte Wettbewerb ist ruinös. Darum beruht jede funktionierende Wirtschaft auf Schiebung.
Datum:
Angehängte Dateien:Um die Schwächen und Stärken des Verfahrens besser zu verstehen, möchte ich das ganze simulieren. Für die Simulation benutze ich Octave ( die freie Version von Matlab ). Ich habe die Modulation des Sendesignals modelliert. Die Modulationsfrequenz und Baudrate kann mit den Variblen verändert werden. Als nächstes ist das Kanalmodell an der Reihe. Dort weiß ich noch nicht, wie es realistischerweise aussehen sollte. Ich werde wohl mit einem einfachen Rauschoffset beginnen.
% modulation frequency [Hz ] fmod=1000; % sample frequency of the system [Hz] fs=20000; % bit rate ( Baud [1/s]) baud=31; %bits to be transmitted bits=[0 1 0 1]; bittime=1/baud; sendtime=length(bits)*bittime; % samples n n=1:sendtime*fs; phases=[]; onebitsamples=bittime*fs; % phase 180 degree phase180=fs/fmod/2; % generate phase vektor for bitcount=1:length(bits) for kk=1:onebitsamples phases=[phases bits(bitcount)*phase180]; endfor endfor %plot(phases); envelope=abs(sin(pi*baud/fs*n)); signal=sin(2*pi*fmod/fs*(n+phases)); modulatedSignal=envelope.*signal; plot(modulatedSignal); grid on |
Datum:
Angehängte Dateien:Hier mein erster Versuch für den Demodulator: Das Empfangssignal wird mit der Modulationsfrequenz gemischt
signalMixed=modulatedSignal.*exp(i*2*pi*fmod/fs*n); |
und danach mittels eines einfache RC-Tiefpassmodels gefiltert. Der einpolige Filter wird deshalb verwedet, weil er sich auf einem Atmega8 mit einer Addion und einem Schiebebefehl realisieren lässt und damit sehr wenig Rechenzeit verbraucht. Im Diagramm sieht man den Realteil und den Imaginärteil des ungefilterten und gefilterten Signals. Wie man sieht, findet sich die Modulationsinformation im Imaginärteil des Signals wieder ( durch die Berechnung sind die Vektoren synchronisiert, das ist in Wirklichkeit nicht gegeben ). Allerdings sind die Ripple auf den gefilterten Signalen noch ziemlich groß, deshalb bin ich mir nicht sicher, ob nicht deutlich bessere Filter notwendig sind. Hat jemand eine Idee für einen recheneffizienten Tiefpass? Folgende Einstellungen wurden verwendet
% modulation frequency [Hz ] fmod=1000; % sample frequency of the system [Hz] fs=20000; % bit rate ( Baud [1/s]) baud=250; %bits to be transmitted bits=[0 1 1 0 1]; |
Kode für Mischer und Tiefpassfilter
%############# demodulation ################################### signalMixed=modulatedSignal.*exp(i*2*pi*fmod/fs*n); %corner frequency of lowpass fg=200; %simple RC-lowpass a=2*pi*fg/fs; B=a; A=[1 a-1]; % filter signal with IIR-Filter ( RC-low pass modell ) signalFiltered=filter(B,A,signalMixed); subplot(2,1,1) plot(real(signalMixed)); hold on plot(real(signalFiltered),'g'); hold on subplot(2,1,2) plot(imag(signalMixed)); hold on plot(imag(signalFiltered),'g'); hold on grid on |
Datum:
Angehängte Dateien:Um das Signal noch besser zu Filtern, habe ich einen Moving Average Filter und den RC-Tiefpass kombiniert. Die Länge des Moving Average Filters entspricht genau der halben Modulationsfrequenz, dadurch wird das heruntergemischte Modulationssignal ideal unteredrückt, da sich genau an der Stelle der Modulationsfrequenz die Nullstelle des Moving Average Filters befindet. Das Ergebnis ist super, wie in den Diagrammen zu sehen :-) Zur Rückgewinnung des Signals habe ich einfach die Phase aus dem I und Q Anteil berechnet und siehe da: Die Phase zeigt sich als sehr stabil.
% phase plotten ( rote Farbe )
plot(angle(signalFiltered),'r');
|
Um zu testen, wie gut das Verfahren funktioniert, habe ich dem Nutzsignal ein weises Rauschen mit der selben Amplitude überlagert ( 2tes Bild ). Die Phase zeigt sich trotz der Störungen weiterhin ziemlich stabil.
modulatedSignal=modulatedSignal+(rand(1,length(modulatedSignal))-0.5); |
Jetzt muss ich überlegen, wie ich aus dem roten Signal die Bits wieder zurückgewinnen kann. Wenn man sich das rote Signal ansieht, scheint das kein Problem zu sein. Man sieht ja deutlich, wenn die rote Linie ( Phase ) oben oder unten ist. Aber einen Algorithmus dazu zu entwerfen, der dies Unterscheidung trifft, scheint mir nicht so einfach.
Datum:
Angehängte Dateien:Hier mal ein reales Signal (aus dem Internet ) durch den "octave Demodulator" geschickt. Seltsamerweise liegt die Modulationsfrequenz wohl bei ca.954Hz. Zumindest habe ich die Mischfrequenz so gewählt. Allerdings sieht man, dass die Frequenz nicht haargenau stimmt, weil im unteren Diagramm die Phase ( rot ) langsam nach unten davon läuft. Warum die Funker in diesem Fall eine so ungerade Modulationsfrequenz gewählt haben, ist mir ein Rätsel. Für diesen Fall müsste man wohl noch einen "Tracker" einbauen, der das langsame Weglaufen der Phase korrigiert. Auf jeden Fall kann man im roten Phasendiagramm super die BITs erkennen. Programmkopf zum laden des Signals
% psk31 signal von: http://www.pci-card.com/PSK31_BPSK.wav [Y,FS,BITS]=wavread("PSK31_BPSK.wav"); modulatedSignal=Y(2000:6000)'; % modulation frequency [Hz ] fm=954; % sample frequency of the system [Hz] fs=FS; % bit rate ( Baud [1/s]) baud=31; bittime=1/baud; onebitsamples=bittime*fs; n=1:length(modulatedSignal); |
Datum:
Datum:
Datum:
Hallo Marc, die Trägerfrequenz und selbst die Symbolrate des PSK31-Signales wird immer "krumm" sein, da die Taktbasis der beteiligten Rechner - ob Mikrocontroller oder PC - immer leicht unterschiedlich ist. Zum Ausgleich ist eine Trägerfrequenz- und Symboltaktrückgewinnung in der Signalverarbeitung vorzunehmen. Auf den Folien 106 und 107 folgender Präsentation findest Du etwas Information dazu: http://www.unidsp56.de/data/DigitaleDatenuebertrag... Im Falle dieser einfachen BPSK und angesichts der gwünschten niedrigen Komplexität, kann die Symboltaktrückgwinnung deutlich vereinfacht werden, indem die Symbolmitte bei der betragsmäßig größten Amplitude angenommen wird (genügend Überabtastung vorrausgesetzt). Selbst bei der QPSK erhöht man damit schon die BER (Bit Error Rate), weil die größten Amplituden nicht zum Symbolabtastzeitpunkt auftreten, sondern durch das "Überschwingen", bedingt durch die Pulsformung zur Bandbreitenreduzierung. Bei der BPSK hat sich die einfache Variante aber durchaus bewährt. Die Simulation mit Octave (oder Alternativen) ist absolut der beste Weg, so ein PSK31-Modem zu entwickeln. Ich würde als Datensequenz eine PRBS (Pseudo Random Bit Sequence) einsetzen, z.B. eine PRBS9 (9 Bit Schieberegister). So kannst Du später den empfangenen Bitstrom in ein identisches Schieberegister einspeisen und die BER feststellen. Diese ist die wichtigste Metrik zur Beurteilung von in die Signalverarbeitung eingebrachten Verbesserungen oder Vereinfachungen. So kannst Du dann beurteilen, wie viel dB Signalrauschabstand für eine gegebene BER mehr nötig sind, wenn z.B. die Frequenzrückgewinnung sehr einfach anstatt komplex implementiert wird, usw. Weiterhin viel Erfolg und viele Grüße! Gerrit, DL9GFA
Datum:
Hallo Gerrit, vielen Dank für Deine Antwort und Deine auführlichen Folien ( sieht nach viel Arbeit aus). Die Folien finde ich ganz gut weil sie das Thema Signalverarbeitung ziemlich umfangreich behandeln. >Im Falle dieser einfachen BPSK und angesichts der gwünschten niedrigen >Komplexität, kann die Symboltaktrückgwinnung deutlich vereinfacht >werden, indem die Symbolmitte bei der betragsmäßig größten Amplitude >angenommen wird (genügend Überabtastung vorrausgesetzt) Daran habe ich auch schon gedacht, aber ich bin noch im Zweifel: Ich nehme an dass in einem Funkkanal auch ordentlich Amplitudenschwankungen vorhanden sein können. Ich bin mir auch nicht ganz sicher, ob bei PSK31 zwischen 2 gleichen Symbolen die Amplitude auf 0 geregelt wird ( der Einfachheit habler habe ich es in der Senderoutine so gemacht ). Gerade vorher kam mir die Idee, dass ein "matched Filter" vor dem Mischer ja ideal sein müsste um Störungen zu unterdrdrüken. Mit meine Simulationsroutinen konnte ich ein Rauchen mit 10 facher Stärke auf das Nutzsignal legen und die Phase war immer noch einigermaßen gut detektierbar. Das Interessante: Bei der Ausgabe des Signals auf die Soundkarte ist bei Rauschfaktor 10 das eigentlich Signal schon gar nicht mehr hörbar. Gruß, marc
Datum:
Das man das PSK-modulierte Signal nicht mehr hören kann, ist normal. Kannste bei Phil Karn dich schlau machen. Du ersparst dir viel Kopfschmerzen, wenn du dein Signal mit einem Komparator jeglicher Amplitude befreist und DPSK verwendest.
Datum:
Hallo Marc, bei der Symbolsynchronisation anhand der maximalen Amplitude betrachtet man vorzugsweise nur ein kleines zeitliches Fenster um den genauen Erwartungswert des Symbolabtastzeitpunktes herum. Wenn das Amplitudenmaximum systematisch immer etwas später kommt, erhöht man den Periodenzähler, der das nächste Abtastfenster vorhersagt. Wenn das Maximum früher kommt, erniedrigt man den Zähler. Der Zähler schwankt schlußendlich +/-1 um den idealen Abtastwert herum. Das ist der sogenanne "early/late"-Ansatz. Er ist auch auf Mikrocontrollern leicht implementiert und die Performance ist auch sehr gut. Ggf. hilft eine AGC mit langsamer Zeitkonstante (>>Tsymbol=32ms), die Amplitudenwerte in einem geeigneten Fenster zu halten. > Ich bin mir auch nicht ganz sicher, ob bei PSK31 > zwischen 2 gleichen Symbolen die Amplitude auf 0 geregelt wird ( der > Einfachheit habler habe ich es in der Senderoutine so gemacht ). Nein, wenn eine '1' gesendet wird, verändert sich die Phase nicht und die Amplitude geht nicht in Richtung Null. Eine größere Anzahl von '1' in direkter Folge wird durch die Kodierung allerdings vermieden. Viele Nullen können ohne weiteres auftreten (z.B. wenn kein Zeichen gesendet wird), aber das führt zu lauter 180°-Änderungen, die hervorragend zur Synchronisation taugen. > Gerade vorher kam mir die Idee, dass ein "matched Filter" vor dem > Mischer ja ideal sein müsste um Störungen zu unterdrdrüken. Ja, das Matched Filter ist das optimale Filter hinsichtlich Signal-Rausch-Abstand. > Simulationsroutinen konnte ich ein Rauchen mit 10 facher Stärke auf das > Nutzsignal legen und die Phase war immer noch einigermaßen gut > detektierbar. Das Interessante: Bei der Ausgabe des Signals auf die > Soundkarte ist bei Rauschfaktor 10 das eigentlich Signal schon gar nicht > mehr hörbar. Immer wenn die Gesamtrauschleistung in der abgehörten Bandbreite höher ist als die Nutzsignalleistung des PSK31-Signales, kann man letzteres nicht heraushören. Dank des schmalen Bandpaß- bzw. Tiefpaß-Filters (Matched Filter), das auf die PSK31-Bandbreite optimiert ist, wird die Rauschbandbreite in der Signalverarbeitung deutlich reduziert und das SNR des Nutzsignales wächst so weit, daß eine Auswertung möglich wird. Bei Bandbreitenverhältnissen von 2.4kHz (SSB-Filter des Empfängers) zu 60Hz (Auswertebandbreite des PSK31-Signals) hat man z.B. einen Gewinn an Rauschunterdrückung von 16dB (10*log10(2400/60)). Viele Grüße! Gerrit, DL9GFA
Datum:
Hallo Marc, mir ist aufgefallen, daß Du oben mit genau 31 Symbolen pro Sekunde rechnest. Die Symbolrate bei PSK31 ist aber 31.25 Symbole pro Sekunde, also genau 32ms pro Symbol. Wenn Du Dich also wunderst, warum Deine Symboltaktrückgewinnung immer hinterher rennt, liegt es vielleicht daran ;o). Gute Nacht! Gerrit, DL9GFA
Datum:
Nanu, Thread eingeschlafen? Gibt es schon Neuigkeiten bzgl. des Demodulators? Bin sehr interessiert.
Datum:
Hallo? Gehts hier nicht weiter?? Das wäre sehr sehr schade!!! Leider kommt man ja bei AATIS schlecht an Bausätze ran, das hier hat nach einer hoffnungsvollen Alternative ausgesehen...
Datum:
NUE-PSK, open source






