Forum: Digitale Signalverarbeitung / DSP / Machine Learning PLL in Matlab simulieren


von Sam (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche zur Zeit eine PLL in Matlab (ohne Simulink) zu 
implementieren, doch erhalte ich irgendwie nicht das gewüschte Ergebnis. 
Der Ausgang vom VCO zeigt zwar die richtige Tendenz, aber es ist leider 
kein richtiger Sinus zu sehen. Es wäre echt nett, wenn jemand mal über 
den Code schauen könnte. Der Code ist direkt in Matlab ausführbar.

Danke!

Gruß
Sam

% Signalerzeugung
f1=2000;
T1=1/f1;
N=5000;
fs=N/T1;
T=1/fs;
t=(0:T:2*N*T-T);
signal=sin(2*pi*f1*t);

% Modulierter Träger
fc=40000;
carrier_mod=cos(2*pi*fc*t+10*signal);

% Initalisierung
e=zeros(1,length(t));     %Ausgang Phasendetektor
u=zeros(1,length(t));     %Ausgang Filter
y=zeros(1,length(t));     %Ausgang VCO (nur hase)
y_vco=zeros(1,length(t)); %Ausgang VCO (Signal)

e(1)=0;
u(1)=0;
y(1)=0;
y_vco(1)=0;

% Parameter
T1=180e-6;
T2=1.21e-3;
f_vco=40000;

% Loop
for k=2:length(carrier_mod)

       %Phasendetektor
       e(k)=carrier_mod(k-1)*y_vco(k-1);

       %Schleifenfilter=> F(s)= (1+T1*s)/(1+T2*s)
       u(k)=T/T2*(u(k-1)*(T2/T-t1)+e(k)*(t2+T1/T)-e(k-1)*T1/T);

       %VCO (nur Phase)
       y(k)=y(k-1)+2*pi*1e6*u(k)*T;

       %VCO (Signal)
       y_vco(k)=cos(2*pi*f_vco*T+y(k));

end

figure(99);
subplot(3,1,1);plot(signal);ylabel('Signal');
subplot(3,1,2);plot(carrier_mod);ylabel('Modulierter Träger')
subplot(3,1,3);plot(y_vco);ylabel('VCO Ausgang')

von klaus (Gast)


Lesenswert?

t1 und t2 sind nicht undefined

von klaus (Gast)


Lesenswert?

klaus schrieb:
> t1 und t2 sind nicht undefined

t1 und t2 sind undefined

von Sam (Gast)


Lesenswert?

Oh ja, hatte die Variable noch im Workspace, daher bekam ich keine 
Fehlermeldung. t1=t2=1. Hab sie im neuen Code ersetzt.

Danke für den Hinweis

Gruß
Sam



% Signalerzeugung
f1=2000;
T0=1/f1;
N=5000;
fs=N/T0;
T=1/fs;
t=(0:T:2*N*T-T);
signal=sin(2*pi*f1*t);

% Modulierter Träger
fc=40000;
carrier_mod=cos(2*pi*fc*t+10*signal);

% Initalisierung
e=zeros(1,length(t));     %Ausgang Phasendetektor
u=zeros(1,length(t));     %Ausgang Filter
y=zeros(1,length(t));     %Ausgang VCO (nur hase)
y_vco=zeros(1,length(t)); %Ausgang VCO (Signal)

e(1)=0;
u(1)=0;
y(1)=0;
y_vco(1)=0;

% Parameter
T1=180e-6;
T2=1.21e-3;
f_vco=40000;

% Loop
for k=2:length(carrier_mod)

       %Phasendetektor
       e(k)=carrier_mod(k-1)*y_vco(k-1);

       %Schleifenfilter=> F(s)= (1+T1*s)/(1+T2*s)
       u(k)=T/T2*(u(k-1)*(T2/T-1)+e(k)*(1+T1/T)-e(k-1)*T1/T);

       %VCO (nur Phase)
       y(k)=y(k-1)+2*pi*1e6*u(k)*T;

       %VCO (Signal)
       y_vco(k)=cos(2*pi*f_vco*T+y(k));

end

figure(99);
subplot(3,1,1);plot(signal);ylabel('Signal');
subplot(3,1,2);plot(carrier_mod);ylabel('Modulierter Träger')
subplot(3,1,3);plot(y_vco);ylabel('VCO Ausgang')

von klaus (Gast)


Lesenswert?

Sam schrieb:
> %Phasendetektor
>        e(k)=carrier_mod(k-1)*y_vco(k-1);

ich hab zwar eigentlich keine Ahnung von PLL, aber hast du diese Zeile 
mal mit e(k)=carrier_mod(k-1)-y_vco(k-1); ersetzt?

dann hast du jedenfalls einen richtigen Sinus

von Sam (Gast)


Lesenswert?

klaus schrieb:
> ich hab zwar eigentlich keine Ahnung von PLL, aber hast du diese Zeile
> mal mit e(k)=carrier_mod(k-1)-y_vco(k-1); ersetzt?
>
> dann hast du jedenfalls einen richtigen Sinus

Im Grunde hast du recht, der Regelfehler besteht aus der Differenz von 
Soll- und Istgröße. Bei der PLL sind Soll- bzw. Istgröße die 
Momentanphase der Eingangssignale (carreir_mod bzw. y_vco). Auf diese 
Momentanphase kann ich jedoch ohne Weiteres nicht zugreifen - denn sie 
sind ja im Kosinus der Signale "versteckt". Daher nehme ich den 
multiplzierenden Phasendetektor. Die Multiplikation von 2 
Kosinus-Signalen ergibt einen Sinus mit der Phasendifferenz und einen 
mit der Phasensumme:

cos(x)*cos(y)=0.5*(sin(x-y)+sin(x+y))

sin(x+y) wird im Filter rausgefiltert und wenn x-y klein ist, gilt:

cos(x)*cos(y)=sin(x-y) = x-y (natürlich nur ungefähr, mir fehlt das 
Symbol :)

Und so bekomme ich die Differenz beider Phasen. Ich hoffe, du weißt nun 
warum ich die Multiplikation brauche.

von Sam (Gast)


Angehängte Dateien:

Lesenswert?

So, ich bin wieder ein Stück weiter gekommen. Und zwar habe ich hinter 
den Multiplizierer noch mal einen extra Tiefpass gesetzt. Ich bin ja 
davon ausgegangen, dass der Schleifenfilter alles überflüssige 
rausfiltert, doch sah das Ergebnis danach aus, dass da noch immer ein 
paar andere Frequenzanteile drinsteckten. Der extra TP soll da Abhilfe 
schaffen.

Man sieht jetzt gut, wie er einregelt. So sollte es doch aussehen, oder 
was meint ihr?  Es fällt mir aber noch auf, dass der Ausgang immer noch 
konstant 90Grad in der Phase versetzt ist. Ist das normal? Und dass er 
so lange braucht zum einregeln?

Vielen Dank schon mal!

Gruß
Sam

von Mayank (Gast)


Lesenswert?

Hallo Sam,

kannst du bitte laden die letzte MATLAB-Code für die PLL

Viel Gruß
Mayank

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.