生活随笔
收集整理的這篇文章主要介紹了
插值法位同步 gardner算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
插值算法,其作用在于根據輸入的信號,通過插值獲得最佳時刻(插值時刻有數控振蕩器控制產生)的采樣值信號。
定時誤差檢測器在于檢測本地時鐘采樣時刻與最佳采樣時刻之間的相位差,得到一個最優的采樣時刻。
%E8_41_gardner程序
close all
clear all
N=20000; %符號數
K=4; %每個符號采
4個樣點
Ns
=K*N; %總的采樣點數w
=[0.5,zeros(1,N-1)]; %環路濾波器輸出寄存器,初值設為
0.5
n
=[0.7 zeros(1,Ns
-1)]; %NCO寄存器,初值設為
0.9
n_temp
=[n(1),zeros(1,Ns
-1)];
u
=[0.6,zeros(1,2*N-1)]; %NCO輸出的定時分數間隔寄存器,初值設為
0.6
yI
=zeros(1,2*N); %I路內插后的輸出數據
yQ
=zeros(1,2*N); %Q路內插后的輸出數據
time_error
=zeros(1,N); %Gardner提取的時鐘誤差寄存器i
=1; %用來表示Ts的時間序號
,指示n
,n_temp
,nco
,
k
=1; %用來表示Ti時間序號
,指示u
,yI
,yQ
ms
=1; %用來指示
T的時間序號
,用來指示a
,b以及w
strobe
=zeros(1,Ns
);
c1
=5.41*10^(-3);
c2
=3.82*10^(-6); %環路濾波器系數
%%%%% 仿真輸入測試的
PSK基帶數據
%%%
bitstream
=(randi(2,N,1)-1);
psk2
=pskmod(bitstream
,2);
xI
=zeros(1,Ns
);
xQ
=zeros(1,Ns
);
xI(1:8:8*N)=real(psk2
); %8倍插值
%8倍插值,后面
2倍抽取實現輸入采樣信號是輸出插值符號速率的
4倍
%即
4個采樣點確定一個插值
xQ(1:8:8*N)=imag(psk2
);%截短后的根升余弦匹配濾波器
h1
=rcosfir(0.8,[-8,8],4,1,'sqrt');
aI1
=conv(xI
,h1
);
bQ1
=conv(xQ
,h1
);
L=length(aI1
);%仿真輸入數據
aI
=[aI1(22:2:L),0,0]; %2倍抽取
bQ
=[bQ1(22:2:L),0,0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %下面兩行代碼是我添加
,直接進行
4倍插值濾波后得到仿真數據
% aI
=rcosflt(real(psk2
),1,4,'sqrt',0.8);
% bQ
=rcosflt(imag(psk2
),1,4,'sqrt',0.8);
%采用這種數據產生方式,從仿真波形看似不收斂,實際已收斂
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% %下面這段程序可以驗證不同定時起始點情況下的收斂情況
% %對
PSK信號進行
16倍上采樣
% I=rcosflt(real(psk2
),1,16,'sqrt',0.8);
% Q=rcosflt(imag(psk2
),1,16,'sqrt',0.8);
% initial
=3; %不同的初始采樣點下采樣對應不同的收斂u值
% m
=4; L=length(I); %4倍下采樣后,形成每個符號
4個采樣點的輸入數據
% aI
=[I(initial
:m
:L)];
% bQ
=[Q(initial
:m
:L)];% %下面這段程序可以驗證采樣頻率不是符號速率整數倍情況下的收斂情況
% %對
PSK信號進行
32倍上采樣
% I=rcosflt(real(psk2
),1,32,'sqrt',0.8);
% Q=rcosflt(imag(psk2
),1,32,'sqrt',0.8);
% initial
=2; %不同的初始采樣點下采樣對應不同的收斂u值
% m
=9; L=floor(length(I)/m
)*m
; %7倍下采樣后,形成每個符號
32/7個采樣點的輸入數據
% aI
=[I(initial
:m
:L)];
% bQ
=[Q(initial
:m
:L)];ns
=length(aI
)-2;
while(i
<ns
)n_temp(i
+1)=n(i
)-w(ms
);if(n_temp(i
+1)>0)n(i
+1)=n_temp(i
+1);elsen(i
+1)=mod(n_temp(i
+1),1);%內插濾波器模塊
FI1=0.5*aI(i
+2)-0.5*aI(i
+1)-0.5*aI(i
)+0.5*aI(i
-1);FI2=1.5*aI(i
+1)-0.5*aI(i
+2)-0.5*aI(i
)-0.5*aI(i
-1);FI3=aI(i
);yI(k
)=(FI1*u(k
)+FI2)*u(k
)+FI3;FQ1=0.5*bQ(i
+2)-0.5*bQ(i
+1)-0.5*bQ(i
)+0.5*bQ(i
-1);FQ2=1.5*bQ(i
+1)-0.5*bQ(i
+2)-0.5*bQ(i
)-0.5*bQ(i
-1);FQ3=bQ(i
);yQ(k
)=(FQ1*u(k
)+FQ2)*u(k
)+FQ3; strobe(k
)=mod(k
,2);%時鐘誤差提取模塊,采用的是Gardner算法
if(strobe(k
)==0)%每個數據符號計算一次時鐘誤差
if(k
>2)time_error(ms
)=yI(k
-1)*(yI(k
)-yI(k
-2))+yQ(k
-1)*(yQ(k
)-yQ(k
-2));elsetime_error(ms
)=(yI(k
-1)*yI(k
)+yQ(k
-1)*yQ(k
));end
%環路濾波器
,每個數據符號計算一次環路濾波器輸出
if(ms
>1)w(ms
+1)=w(ms
)+c1
*(time_error(ms
)-time_error(ms
-1))+c2
*time_error(ms
);elsew(ms
+1)=w(ms
)+c1
*time_error(ms
)+c2
*time_error(ms
);endms
=ms
+1;endk
=k
+1;u(k
)=n(i
)/w(ms
);endi
=i
+1;
end
figure(1);
subplot(311);plot(u
);xlabel('運算點數');ylabel('分數間隔');
subplot(312);plot(time_error
);xlabel('運算點數');ylabel('定時誤差');
subplot(313);plot(w
);xlabel('運算點數');ylabel('環路濾波器輸出');
利用四個點
總結
以上是生活随笔為你收集整理的插值法位同步 gardner算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。