Moin,
ich ein Problem an dem ich schon eine ganze Zeit sitze und mir die
Lösung einfach nicht einfallen möchte, obwohl diese bestimmt super
einfach ist.
Also: ich möchte Daten mit FSK übertragen. Problem macht mir jetzt
allerdings die korrekte Synchronisation, bei der ich abwechselnd zwei
Frequenzen sende. Ich lasse ein Fenster mit der Länge eines Symbols über
die Eingangswerte laufen und berechne die Spektrallinien für beide
Frequenzen (Eingang mit sin(2*pi*f1*t) und cos(2*pi*f1*t)
multiplizieren, über das Fenster Integrieren, am Ende Quadieren und den
sin und cos addieren, das gleiche dann noch mal für die zweite
Frequenz).
Nun suche ich einfach nach peaks und merke mir die Positionen. Durch
Rauschen verschieben sich die peaks aber leider, so dass die Abstände
zwischen diesen variieren. Wenn die Symbollänge z.B. 200 sein soll
(Dauer der Übertragung durch Abtastrate), dann bekomme ich statt ohne
Rauschen:
200 200 200 200
nach dem Rauschen z.B.
190 203 205 190
Und genau das ist mein Problem: ich muss mich ja genau auf die Symbole
synchronisieren (+- ein paar Punkte). Ich weiß ja aber nicht, welcher
Punkt wirklich auf dem Signalende liegt, und welcher verschoben ist.
Ich hatte jetzt erst einmal nach den zwei Punkten gesucht, deren
Differenz minus Anzahl der Punkte minimal ist, und ausgehend hiervon ein
200er "Raster" über die peaks gelegt und die Abstände zwischen den Peaks
und dem Raster summiert. Wo die Summe am geringsten ist, sollte ja
eigentlich auch das beste Ergebnis zu erzielen sein, oder?
Gibt es denn für dieses Problem noch einen schöneren Ansatz, der
vielleicht zu einem besseren Ergebnis führt?
Vielen Dank im Voraus für Eure Hilfe und Anregungen!
Die peaks zeigen Dir die Symbolmitte an. Da sollte der Betrag für die
eine der Frequenzen maximal, für die andere minimal sein, damit kannst
Du entscheiden. Wenn die peaks in der Position bißchen jittern sollte
das nicht stören.
Dein Demodulationsverfahren scheint mir sehr aufwendig zu sein. Das geht
auch einfacher mit einem Mischer und einem Filter, Matlab Beispiel
anbei.
Cheers
Detlef
dat=(-1).^(0:100);
fl= 2*pi*1300; %rad/sec
fh= 2*pi*2100; %rad/sec
fm= (fl+fh)/2; %rad/sec
fa=8000 ; %Hz
nn=20/3; %Abtastwerte/Datenbit
% Modulation
sig=(fix((0:(nn*length(dat))-1)/nn)+1);
ff=[fl 0 fh];
sig=ff(dat(sig)+2)/fa;
sig=real(exp(i*cumsum(sig)));
var(sig)
sig=sig+0.0*randn(1,length(sig));
var(sig)
%Demodulation
%komplexer Träger
carr= exp(i*cumsum(ones(1,length(sig))*(1.00*fm)/fa));
dsig=carr.*sig;
[ffb,ffa] = butter(10,2.2*((fm-fl)/2/pi)/4000);
dsig1=filter(ffb,ffa,dsig);
dsig3=(dsig1(1:end-1)./dsig1(2:end));
dsig2=angle(dsig3);
Moin,
ne, die peaks zeigen mir nicht die Mitte, sondern das Ende an, da am
Ende, also nach einem Symbol, die Frequenz natürlich am meisten im
Fenster vorkommt. Wie gesagt, dieser jitter, der entstehen kann, soll
minimiert werden. Teilweise liegte ich über 10% daneben, da muss man
schon entscheiden kann, welchen Punkt man als Referenz verwendet...
Besonders aufwändig ist das Verfahren eigentlich nicht; es sind pro
Schritt 3 Multiplikationen und eine Addition. Nagut, das ganze dann 4
mal. Aber ich denke, das geht noch.
Werde mir aber trotzdem noch einmal den Code von Dir anschauen, aber mit
einem digitalen Mischer habe ich noch nie etwas gemacht...
Viele Grüße, und vielen Dank noch einmal für Deine Antwort!
Moin,
jo, stimmt, der Peak trifft ja auch auf, wenn das Fenster genau auf dem
Symbol liegt. Und da das Symbol bei mir auch genau eine Fensterlänge
lang übertragen wird ist der Wert maximal, wenn das Symbolende erreicht
ist...
Viele Grüße
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.