📄 dmb_t_channel_esti_equa.m
字号:
clear all;
close all;
%OFDM Transmission
%DMB-T Parameters
Tu=500e-6; %useful OFDM symbol period
T=Tu/3780; %baseband elementary period
G=420/3780; %choice of 1/4, 1/9
delta=G*Tu; %guard band duration
Ts=delta+Tu; %total OFDM symbol period
Kmax=3779; %number of subcarriers
Kmin=0;
FS=3780; %IFFT/FFT length
sn=25;
M=255;
%Data generator
N=Kmax+1;
rand('state',1000);
sigx=rand(1,N);sigy=rand(1,N);
QAMx=-7*(sigx<0.125)+(-5)*((sigx>0.125)&(sigx<0.25))+(-3)*((sigx>0.25)&(sigx<0.375))+(-1)*((sigx>0.375)&(sigx<0.5))...
+1*((sigx>0.5)&(sigx<0.625))+3*((sigx>0.625)&(sigx<0.75))+5*((sigx>0.75)&(sigx<0.875))+7*(sigx>0.875);
QAMy=-7*(sigy<0.125)+(-5)*((sigy>0.125)&(sigy<0.25))+(-3)*((sigy>0.25)&(sigy<0.375))+(-1)*((sigy>0.375)&(sigy<0.5))...
+1*((sigy>0.5)&(sigy<0.625))+3*((sigy>0.625)&(sigy<0.75))+5*((sigy>0.75)&(sigy<0.875))+7*(sigy>0.875);
% QAMx=-7*(sigx<0.1)+(-5)*((sigx>0.1)&(sigx<0.15))+(-3)*((sigx>0.15)&(sigx<0.37))+(-1)*((sigx>0.37)&(sigx<0.38))...
% +1*((sigx>0.38)&(sigx<0.62))+3*((sigx>0.62)&(sigx<0.75))+5*((sigx>0.75)&(sigx<0.87))+7*(sigx>0.87);
% QAMy=-7*(sigy<0.12)+(-5)*((sigy>0.12)&(sigy<0.35))+(-3)*((sigy>0.35)&(sigy<0.4))+(-1)*((sigy>0.4)&(sigy<0.5))...
% +1*((sigy>0.5)&(sigy<0.6))+3*((sigy>0.6)&(sigy<0.75))+5*((sigy>0.75)&(sigy<0.9))+7*(sigy>0.9);
QAM=QAMx+1i*QAMy;
carriers=FS.*ifft(QAM,FS);
%Add PN420
pn_amp=sqrt(2)*sqrt(sum(abs(carriers.*carriers))/3780);
PN_255=genpncode(8)*pn_amp;
Pre_amble=PN_255(end-82+1:end);
Post_amble=PN_255(1:83);
Frame_Sync=[Pre_amble,PN_255,Post_amble];
Frame=[Frame_Sync,carriers];
%用两帧数据来仿真
Two_Frame=[Frame,Frame];
%Pass through multi-channel
delay=[0 0.2 0.5 1.6 2.3 5];
Power=[-3 0 -5 -6 -8 -10];
amp_decline=10.^(Power/20);
delay_round=round((delay*1e-6)/T);
h(delay_round+1)=amp_decline;
carriers_passh=conv(Two_Frame,h);
carriers_passh=carriers_passh(1:length(Two_Frame));
% for sn=0:30
%Add wgn
Frame_power=10*log10(2*sum(abs(Frame.*Frame))/4200);
carriers_receive=awgn(carriers_passh,sn,'measured',0);
%OFDM Reception
%Channel Estimation
PN_255_local=Frame_Sync(end-M+1:end);
Frame_head=carriers_receive(1:420);
Frame_win=Frame_head(end-M+1:end);
%做相关
for i=1:M;
y=[Frame_win(i:end),Frame_win(1:i-1)];
correlation1(i)=sum(PN_255_local(1:M).*y);
end;
correlation1=correlation1./pn_amp^2;
L=0;
alfa=sum(correlation1)/M;
temp0=sort(correlation1,'descend');
gate=abs(temp0(6))/abs(alfa)
for i=1:M;
if abs(correlation1(i))/abs(alfa)>=gate;
L=L+1;
end;
end;
%迭代L次,消除旁瓣影响
correlation=[];
for i=1:L;
temp1=sort(correlation1,'descend');
peak=find(correlation1==correlation1(i));
correlation=correlation1+correlation1(peak)/M;
correlation(peak)=correlation1(peak);
correlation1=correlation;
end;
temp=sort(correlation1,'descend');
for i=1:M;
if correlation(i)>=temp(L);
index(i)=i;
else index(i)=-1;
%correlation(i)=0;
end;
end;
correlation=correlation./M;
number=max(index);
h_esti=[correlation(1:number)];
H_esti=fft(h_esti,3780);
H=fft(h,3780);
figure(1);
plot(abs(H),'b');
hold on;
plot(abs(H_esti),'r');
mse=sum((abs(H_esti-H)).^2)/3780;
disp('10*log10(mse)):')
10*log10(mse)
%不经过均衡时接收到的信号
signal1=(1/FS)*fft(carriers_receive(420+1:N),FS);
figure(2);
plot(signal1,'*b');
hold on;
plot(QAM,'+r');
axis([-15 15 -15 15]);
%Channel Equaliazation(TCCR)
G=conv(Frame_Sync,h_esti);
for m=1:L-1;
X1(m)=carriers_receive(m+420)-G(m+420);
X2(m)=carriers_receive(420+N+m)-G(m);
end;
X=[X1+X2,carriers_receive(420+L:420+N)];
signal=(1/FS)*fft(X,FS)./fft(h_esti,FS);
figure(3);
plot(signal,'*b');
hold on;
plot(QAM,'+r');
axis([-15 15 -15 15]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -