频偏纠正matlab实现,Matlab关于OFDM同步定时估计和频偏估计的算法
各位高手你們好,在下有理了。我最近在寫有關ofdm的同步的問題,主要是SC算法,
我已經把M(d)的圖像仿真出來了,也找到了M(d)取最大時的那個點,還有小數頻偏也算算出來了,但是我不會算'定時估計均方差'和‘頻率估計均方差’,請給位高手指點一下 在下感激不盡!!!
我寫的代碼 ,請高手們看一下那兒出錯了:
前半部分仿真可能是對的 ,但是后面求頻偏估計均方誤差與定時估計均方誤差的圖像時,就不對了
希望告訴們能給我解答一下
clear
clc
gilen=32;
para=512;? ?% Number of parallel channel to transmit (points)
fftlen=512; % FFT length
noc=512;? ? % Number of carrier
nd=6;? ?? ? % Number of information OFDM symbol for one loop
ml=2;? ?? ? % Modulation level : QPSK
sr=250000;??% Symbol rate
br=sr.*ml;??% Bit rate per carrier
%gilen=32;? ?%Length of guard interval (points)
fullen=gilen+para;??%ofdm符號總長
deltad=250;??%時延
deltaf=0.25;??%頻偏
deltaderr=0;%時延均方誤差
deltaferr=0;%頻偏均方誤差
derr=zeros(1,11);%時延均方誤差
ferr=zeros(1,11);%頻偏均方誤差
%f=-1;
error=zeros(1,11);
o=0
%************************** main loop part **************************
for ebn0=0:2:20
o=o+1;
%************************** main loop part **************************
nloop=100;??% Number of simulation loops
noe = 0;? ? % Number of error data
nod = 0;? ? % Number of transmitted data
eop=0;? ?? ?% Number of error packet
nop=0;? ?? ?% Number of transmitted packet
for iii=1:nloop
%************************** transmitter*********************************
%**************************訓練序列 ****************************
pn = rand(1,para)>0.5;
pn = reshape(pn,para/2,2);
[ipn0,qpn0] = qpskmod(pn,para/2,1,ml);
kmod=1/sqrt(2); %??sqrt : built in function
ipn0=ipn0.*kmod;
qpn0=qpn0.*kmod;
sym = ipn0 + i*qpn0;
symbuf = zeros(para,1);
symbuf(1:2:para,1) = sym;
%train1 = symbuf*7;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???%為什么乘以7
train1 = symbuf*15;
clear sym;
clear symbuf;
pn1 = rand(1,para)>0.5;
pn1 = reshape(pn1,para/2,2);
[ipn1,qpn1] = qpskmod(pn1,para/2,1,ml);
kmod=1/sqrt(2); %??sqrt : built in function
ipn1=ipn1.*kmod;
qpn1=qpn1.*kmod;
sym = ipn1 + i*qpn1;
symbuf = zeros(para,1);
symbuf(1:2:para,1) = sym;
clear sym;
pn2 = rand(1,para)>0.5;
pn2 = reshape(pn2,para/2,2);
[ipn2,qpn2] = qpskmod(pn2,para/2,1,ml);
kmod=1/sqrt(2); %??sqrt : built in function
ipn2=ipn2.*kmod;
qpn2=qpn2.*kmod;
sym = ipn2 + i*qpn2;
symbuf(2:2:para,1) = sym;
train2 = symbuf*5;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?%為什么乘以5
%train2 = symbuf;
clear sym;
clear symbuf;
v = zeros(1,para);
kpois=1:2:para;
v(kpois) = sqrt(2)*train2(kpois)./train1(kpois); % 含有 訓練序列對應子載波的相位差信息
%************************** Data generation
%****************************
seldata=rand(1,para*nd*ml)>0.5;??%??rand : built in function
%****************** Serial to parallel conversion
%***********************
paradata=reshape(seldata,para,nd*ml); %??reshape : built in function
%************************** QPSK modulation
[ich,qch]=qpskmod(paradata,para,nd,ml);
kmod=1/sqrt(2); %??sqrt : built in function
ich1=ich.*kmod;
qch1=qch.*kmod;
%******************* IFFT ************************
x=ich1+qch1.*i;
x(:,1)=train1;
x(:,2)=train2;
y=ifft(x); %??ifft : built in function
ich2=real(y);? ?%??real : built in function
qch2=imag(y);? ?%??imag : built in function
%********* Gurad interval insertion **********
[ich3,qch3]= giins(ich2,qch2,fftlen,gilen,nd);
fftlen2=fftlen+gilen;
%********* Attenuation Calculation *********
spow=sum(ich3.^2+qch3.^2)/nd./para;??%??sum : built in function
attn=0.5*spow*sr/br*10.^(-ebn0/10);
attn=sqrt(attn);
%***************************??Receiver??*****************************
%*************************加頻率偏移和時延***************************
[ich3,qch3]=delay(ich3,qch3,length(ich3),deltad);
y=ich3+qch3.*i;
for k=1:length(ich3);
y(k)=y(k)*exp(i*2*pi*deltaf*k/para);
end
ich3=real(y);
qch3=imag(y);
%***************** AWGN addition *********
[ich4,qch4]=comb(ich3,qch3,attn);
y=ich4+qch4.*i;
%*****************小數頻率偏移和時延估計*********************************
for d=1:para
for n=1:para/2
z1(n)=conj(y(d+n+para/2))*y(d+n);
end
p1(d)=sum(z1);
for n=1:para/2
z2(n)=abs(y(d+n+para/2)).^2;
end
p2(d)=sum(z2);
end
p=abs(p1).^2./(p2.^2);
plot(p);
%c=linspace(-150,150,256);
%stem(c,p);
%grid on;
[a a1]=max(p); % 求最大值
th=a*0.9;
xulie1=p(1:a1-1);
xulie2=p(a1+1:end);
[j1 j2]=min(abs(xulie1-th));
[j3 j4]=min(abs(xulie2-th));
if(mod(j2+j4+a1,2)==0)
j5=(j2+j4+a1)/2;
else
j51=(j2+j4+a1-1)/2;
j52=(j2+j4+a1+1)/2;
[j53 j54]=max([p(j51) p(j52)]);
j5=j54+j51-1;
end
%********************求小數陪頻偏***********************
f=-angle(p1(j5))/pi;
%這是一種 最大似然方法聯合實現符號定時同步和載波同步的方法
% 具體的推導 見 《OFDM移動通信技術原理與應用》 4.6節 P104
%m =m-1;%??公式推導中的d實際上是delay 了 d-1 個樣值? ?wm added
%********************定時估計方差***********************
%********************小數倍頻偏補償***********************
%r1=y;
%ich5=real(r1);
%qch5=imag(r2);
for k=1:length(ich4);
y(k)=y(k)*exp(i*2*pi*(-f)*k/para);
end
%********************整數倍頻偏估計***********************
r1 = fft(y(gilen+deltad+1:para+gilen+deltad));
r2 = fft(y(2*gilen+deltad+para+1:2*para+2*gilen+deltad));
for n=2:2:para/2-1
for k=1:2:para/2-n
z11(k)=conj(conj(r1(k+n))*r2(k+n))*v(k);
end
r11(n)=sum(z11);
for k=para/2-n+2:2:para/2
z22(k)=conj(conj(r1(k+n-para/2))*r2(k+n-para/2))*v(k);
end
r22(n)=sum(z22);
x=r11+r22;
end
for k=1:2:para/2
z33(k)=2*abs(r2(k)).^2;
end
q=sum(z33);
F=abs(x).^2./(q.^2);
b=max(F);? ?% 求最大值
g=find(F==b) ;? ?% 求最大值所在位置
%plot(abs(x));
%plot(F);
%********************頻偏的估計值***********************
l=g+f; %頻偏估計值
%********************同步估計均方誤差計算***********************
deltaderr=deltaderr+(j5-16-deltad)^2;
deltaferr=deltaferr+(f-deltaf)^2;
end
derr(o)=sqrt(deltaderr/(nloop))
ferr(o)=sqrt(deltaferr/(nloop))
end
figure(1);
grid on
semilogy(0:2:20,ferr,'x--b');
hold on
semilogy(0:2:20,ferr,'x--b');
hold on
總結
以上是生活随笔為你收集整理的频偏纠正matlab实现,Matlab关于OFDM同步定时估计和频偏估计的算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spark四大组件是什么?(Spark的
- 下一篇: php kml文件解析,英语翻译中文:详