Raqamli aloqa faza siljishini boshqarish. Kvadratik faza siljishi manipulyatsiyasi
Kvadratik faza siljishi manipulyatsiyasi (QPSK) fazani almashtirishning bir shakli bo'lib, unda ikkita bit bir vaqtning o'zida modulyatsiya qilinadi va to'rtta mumkin bo'lgan tashuvchining fazali siljishidan (0, 90, 180 yoki 270 daraja) birini tanlaydi. QPSK signalni bir xil tarmoqli kengligidan foydalangan holda oddiy PSKga qaraganda ikki baravar ko'p ma'lumot uzatish imkonini beradi.
rasm. QPSK modulatori
Modulyatorning kirishida xabar signalining juft bitlari (ya'ni, 2-bit, 4-bit, 6-bit va boshqalar) va toq bitlar (ya'ni, 1-bit, 3-bit, 5-bit va boshqalar) bitlarni ajratuvchi va toq BPSK (PSKI deb ataladi) va hatto BPSK (PSKQ deb ataladi) hosil qilish uchun bir xil tashuvchi bilan ko'paytiriladi. PSKQ signali modulyatsiyadan oldin faza 90 ° ga siljiydi.
Ikki bitli kirish uchun QPSK to'lqin shakli quyidagicha bo'lib, u ikkilik kirishlarning turli misollari uchun modulyatsiyalangan natijani ko'rsatadi.
QPSK demodulyatori
QPSK Demodulyatori mahalliy osilator, ikkita tarmoqli o'tish filtri, ikkita integrator sxemasi va ketma-ket konvertorga parallel ravishda 2 bitli ikkita mahsulot demodulyatori sxemasidan foydalanadi. Quyida xuddi shunday diagramma keltirilgan.
Demodulyatorning kirish qismidagi ikkita mahsulot detektori bir vaqtning o'zida ikkita BPSK signalini demodulyatsiya qiladi. Bitlar juftligi bu erda asl ma'lumotlardan tiklanadi. Ushbu signallar qayta ishlangandan so'ng, parallel ravishda ketma-ket konvertorga uzatiladi.
Task (1-variant)
Matlab kodi (8-ish):
clear all clf char=double ('PENCIL') Ac=1; As=Ac fc=1.5; first_data=0 a (1:2)=first_data; t1(1:2)=[0,1]; i=3; for cc=1:length(char) for n=0:2:7 bit_n=bitshift(char(cc),-n); a(i:i+1) = bitand(bit_n,3); t1(i) = (i-1)/2; t1(i+1) = t1(i)+1;i=i+2; end; end
for j=1:length(char)*20000+4999 t2(j)=j/5000; i=floor(t2(j)*2+1); c(j)=Ac*sin(2*pi*fc*t2(j)); s(j)=Ac*sin(2*pi*fc*t2(j)+a(i)*pi/2+pi/4); end
last_data=first_data; buff_data=first_data time_c=1; rec_data(1:2)=first_data; rec_time (1:2)=[first_data,1]; rec_c=3; for j=4:length(s) if t2(j)>time_c-0.2 if abs (s(j-1)-s(j-2))>Ac*0.1 change_point=t2(j-1) buff_data=get_data(s(j-3:j),last_data); else if abs (s(j-2))s(j)||s(j-3)>s(j-2)&&s(j-1) change_point=t2(j) buff_data=get_data(s(j-3:j),last_data); end; end; end
if t2(j)>time_c last_data=buff_data rec_data(rec_c:rec_c+1)=last_data; rec_time(rec_c:rec_c+1)=[time_c, time_c+1]; time_c=time_c+1; rec_c=rec_c+2; end end
subplot(4,1,4); plot(rec_time,rec_data) function res=get_data (s,last_data) degree2=asin(double(s(2)))/pi*180; degree3=asin(double(s(3)))/pi*180; if s(2)>s(1) if degree2<0 degree2=360+degree2; end else if degree2>0 degree2=180-degree2; else degree2=abs (180-degree2); end end if s(4)>s(3) if degree3<0 degree3=360+degree3;end else if degree3>0 degree3=180-degree3; else degree3=abs (180-degree3); end end degree2=degree2-last_data*90; degree3=mod(degree3-degree2,360); res=round (degree3/90); end
Matlab kodi (9-ish):
clear all char=double(input('Binary letter codes for the first letter of your name : ')); Ac=1; As=Ac fc=1.5; first_data=0 a (1:2)=first_data; t1(1:2)=[0,1]; i=3; for cc=1:length(char) for n=0:2:7 bit_n=bitshift(char(cc),-n); a(i:i+1) = bitand(bit_n,3); t1(i) = (i-1)/2; t1(i+1) = t1(i)+1;i=i+2; end; end
for j=1:length(char)*20000+4999 t2(j)=j/5000; i=floor(t2(j)*2+1); c(j)=Ac*sin(2*pi*fc*t2(j)); s(j)=Ac*sin(2*pi*fc*t2(j)+a(i)*pi/2+pi/4); end
last_data=first_data; buff_data=first_data; time_c=1; rec_data(1:2)=first_data; rec_time (1:2)=[first_data,1]; rec_c=3; for j=4:length(s) if t2(j)>time_c-0.2 if abs (s(j-1)-s(j-2))>Ac*0.1 change_point=t2(j-1); buff_data=get_data(s(j-3:j),last_data); else if abs (s(j-2))s(j) || s(j-3)>s(j-2) && s(j-1) change_point=t2(j); buff_data=get_data(s(j-3:j),last_data); end; end; end
if t2(j)>time_c last_data=buff_data; rec_data(rec_c:rec_c+1)=last_data; rec_time(rec_c:rec_c+1)=[time_c, time_c+1]; time_c=time_c+1; rec_c=rec_c+2; end end
subplot(4,1,4); plot(rec_time,rec_data) function res=get_data (s,last_data) degree2=asin(double(s(2)))/pi*180; degree3=asin(double(s(3)))/pi*180; if s(2)>s(1) if degree2<0 degree2=360+degree2; end else if degree2>0 degree2=180-degree2; else degree2=abs (180-degree2); end end if s(4)>s(3) if degree3<0 degree3=360+degree3;end else if degree3>0 degree3=180-degree3; else degree3=abs(180-degree3); end end degree2=degree2-last_data*90; degree3=mod(degree3-degree2,360); res=round (degree3/90); end