📄 twoto11.m
字号:
%%*********************************************************************
%%%% M.1225 信道下,MIMO,2transmitters and 1receivers ,进行ml估计、
%%%********************************************************************
function [Dem1,Dem2]=twoto11(out1,out2,SNR)
%=================
% common settings
%=================
wordsize=2; % represent the mode of modulation, wordsize=2:QPSK, wordsize=4:16QAM, wordsize=6:64QAM;
NumCarr=256; % Number of transmission carriers
Lcp=64; % Guard Interval(length of cyclic extension)=12.5% of NumCarr
FrameGuard=NumCarr+Lcp/2; % Guard Time between successive frames (one symbol period)
Numsymb=100; % the number of symbols
seed=1234;
rand('seed',seed); % Set to new seed
Wk=[1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 1];
Pilot1_number=24;
Pilot2_number=24;
PilotIndex1=[37:8:221]; % pilot interval=24
PilotIndex2=[40:8:224];
fc=3.5e9; % operation frequency
V=75; % moving speed, V km/h
fdmax=V*fc/3e8/3.6; % maximum frequency shift: fmax=V*fc/C
%generate s0
%Generate the pattern of data and pilots
Pattern=ones(NumCarr,Numsymb); % the position of data is set as 1.
Pattern([1:28,230:256],:)=2; % guard band=0
Pattern([37:8:221],:)=4; % the position of pilot1 is set as 4.
Pattern([40:8:224],:)=5; % the position of pilot5 is set as 5.
Pattern(129,:)=3; % DC=0
% Generate data and pilots
Data0=zeros(size(Pattern));
for n=1:Numsymb
Data0([37:8:221],n)=2*(1-2*Wk).';
end;
Data_Pattern=find(Pattern==1); %the pattern of data
Baohu_Pattern=find(Pattern==2);
Dc_Pattern=find(Pattern==3);
Pilot1_Pattern=find(Pattern==4);
Pilot2_Pattern=find(Pattern==5);
clear Pattern
Datatx0=floor(rand(1,length(Data_Pattern))*(2^wordsize));% Generate the data
bbb=zeros(1,500*30);
for i=1:500*30
aaa=num2str(out1(2*i-1:i*2)');
bbb(i)=bin2dec(aaa');
end;
Datatx0(1:500*30)=bbb;
Baohutx0=floor(rand(1,length(Baohu_Pattern))*(2^wordsize));
Tx0=dec2bin(Datatx0,wordsize)-48;
% Mapping to the signal constellation follow
mapping=get80216map(2^wordsize);% 调用.p文件。
for k=1:length(Datatx0)
ModSignal0(k)=mapping(1+Datatx0(k));
end;
Data0(Data_Pattern)=ModSignal0;
for k=1:length(Baohutx0)
BaohuSignal0(k)=mapping(1+Baohutx0(k));
end;
Data0(Baohu_Pattern)=BaohuSignal0;
Data0(Dc_Pattern)=1;
clear ModSignal0;
clear BaohuSigna0;
%===================================
% Find the time waveform using IFFT
%===================================
BaseSig0=ifft(Data0); % Generating baseband signal s0 using IFFT
BaseSig3=ifft(conj(Data0));
%generate s1
%Generate the pattern of data and pilots
Pattern=ones(NumCarr,Numsymb); % the position of data is set as 1.
Pattern([1:28,230:256],:)=2; % guard band=0
Pattern([37:8:221],:)=4; % the position of pilot1 is set as 4.
Pattern([40:8:224],:)=5; % the position of pilot5 is set as 5.
Pattern(129,:)=3; % DC=0
% Generate data and pilots
Data1=zeros(size(Pattern));
for n=1:Numsymb
Data1([40:8:224],n)=2*(1-2*Wk).';
end;
Data_Pattern=find(Pattern==1); %the pattern of data
Baohu_Pattern=find(Pattern==2);
Dc_Pattern=find(Pattern==3);
Pilot1_Pattern=find(Pattern==4);
Pilot2_Pattern=find(Pattern==5);
clear Pattern
Datatx1=floor(rand(1,length(Data_Pattern))*(2^wordsize));
bbb=zeros(1,500*30);
for i=1:500*30
aaa=num2str(out2(2*i-1:i*2)');
bbb(i)=bin2dec(aaa');
end;
Datatx1(1:500*30)=bbb;% Generate the data
Baohutx1=floor(rand(1,length(Baohu_Pattern))*(2^wordsize));
Tx1=dec2bin(Datatx1,wordsize)-48;
% Mapping to the signal constellation follow
mapping=get80216map(2^wordsize);% 调用.p文件。
for k=1:length(Datatx1)
ModSignal1(k)=mapping(1+Datatx1(k));
end;
Data1(Data_Pattern)=ModSignal1;
for k=1:length(Baohutx1)
BaohuSignal1(k)=mapping(1+Baohutx1(k));
end;
Data1(Baohu_Pattern)=BaohuSignal1;
Data1(Dc_Pattern)=1;
clear ModSignal
clear BaohuSignal
%===================================
% Find the time waveform using IFFT
%===================================
BaseSig1=ifft(Data1); % Generating baseband signal s1 using IFFT
BaseSig2=ifft(-conj(Data1));
%=======================
% Adding Guard Interval
%=======================
BaseSignal0=[BaseSig0((end-(Lcp/2)+1):end,:); BaseSig0];
BaseSignal1=[BaseSig1((end-(Lcp/2)+1):end,:); BaseSig1];
BaseSignal2=[BaseSig2((end-(Lcp/2)+1):end,:); BaseSig2];
BaseSignal3=[BaseSig3((end-(Lcp/2)+1):end,:); BaseSig3];
% =======================
% M.1225 channel
% =======================
fade=Rayleigh(fdmax);
%1st transmitter to 1st receiver H11*BaseSignal0
path11_1=ones(FrameGuard,1)*fade(1,[1:Numsymb]).*BaseSignal0;
path11_2=ones(FrameGuard,1)*fade(2,[1:Numsymb]).*BaseSignal0;
path11_3=ones(FrameGuard,1)*fade(3,[1:Numsymb]).*BaseSignal0;
path11_4=ones(FrameGuard,1)*fade(4,[1:Numsymb]).*BaseSignal0;
path11_5=ones(FrameGuard,1)*fade(5,[1:Numsymb]).*BaseSignal0;
path11_6=ones(FrameGuard,1)*fade(6,[1:Numsymb]).*BaseSignal0;
path11_1=reshape(path11_1,1,size(path11_1,1)*size(path11_1,2));
path11_2=reshape(path11_2,1,size(path11_2,1)*size(path11_2,2));
path11_3=reshape(path11_3,1,size(path11_3,1)*size(path11_3,2));
path11_4=reshape(path11_4,1,size(path11_4,1)*size(path11_4,2));
path11_5=reshape(path11_5,1,size(path11_5,1)*size(path11_5,2));
path11_6=reshape(path11_6,1,size(path11_6,1)*size(path11_6,2));
%the delay is [0 0.31 0.71 1.09 1.73 2.51] us
path11_1=[path11_1 zeros(1,10)]; % the largest delay is 10 sample
path11_2=[zeros(1,1) path11_2 zeros(1,9)];
path11_3=[zeros(1,3) path11_3 zeros(1,7)];
path11_4=[zeros(1,4) path11_4 zeros(1,6)];
path11_5=[zeros(1,7) path11_5 zeros(1,3)];
path11_6=[zeros(1,10) path11_6];
RxSignal00=path11_1+path11_2+path11_3+path11_4+path11_5+path11_6;
RxSignal00=RxSignal00(1:FrameGuard*Numsymb);
%2st transmitter to 1st receiver H21*BaseSignal1
path21_1=ones(FrameGuard,1)*fade(1,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_2=ones(FrameGuard,1)*fade(2,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_3=ones(FrameGuard,1)*fade(3,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_4=ones(FrameGuard,1)*fade(4,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_5=ones(FrameGuard,1)*fade(5,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_6=ones(FrameGuard,1)*fade(6,[1+1000:Numsymb+1000]).*BaseSignal1;
path21_1=reshape(path21_1,1,size(path21_1,1)*size(path21_1,2));
path21_2=reshape(path21_2,1,size(path21_2,1)*size(path21_2,2));
path21_3=reshape(path21_3,1,size(path21_3,1)*size(path21_3,2));
path21_4=reshape(path21_4,1,size(path21_4,1)*size(path21_4,2));
path21_5=reshape(path21_5,1,size(path21_5,1)*size(path21_5,2));
path21_6=reshape(path21_6,1,size(path21_6,1)*size(path21_6,2));
path21_1=[path21_1 zeros(1,10)]; % the largest delay is 10 sample
path21_2=[zeros(1,1) path21_2 zeros(1,9)];
path21_3=[zeros(1,3) path21_3 zeros(1,7)];
path21_4=[zeros(1,4) path21_4 zeros(1,6)];
path21_5=[zeros(1,7) path21_5 zeros(1,3)];
path21_6=[zeros(1,10) path21_6];
RxSignal11=path21_1+path21_2+path21_3+path21_4+path21_5+path21_6;
RxSignal11=RxSignal11(1:FrameGuard*Numsymb);
%1st transmitter to 1st receiver H11*BaseSignal2
path11_1=ones(FrameGuard,1)*fade(1,[1:Numsymb]).*BaseSignal2;
path11_2=ones(FrameGuard,1)*fade(2,[1:Numsymb]).*BaseSignal2;
path11_3=ones(FrameGuard,1)*fade(3,[1:Numsymb]).*BaseSignal2;
path11_4=ones(FrameGuard,1)*fade(4,[1:Numsymb]).*BaseSignal2;
path11_5=ones(FrameGuard,1)*fade(5,[1:Numsymb]).*BaseSignal2;
path11_6=ones(FrameGuard,1)*fade(6,[1:Numsymb]).*BaseSignal2;
path11_1=reshape(path11_1,1,size(path11_1,1)*size(path11_1,2));
path11_2=reshape(path11_2,1,size(path11_2,1)*size(path11_2,2));
path11_3=reshape(path11_3,1,size(path11_3,1)*size(path11_3,2));
path11_4=reshape(path11_4,1,size(path11_4,1)*size(path11_4,2));
path11_5=reshape(path11_5,1,size(path11_5,1)*size(path11_5,2));
path11_6=reshape(path11_6,1,size(path11_6,1)*size(path11_6,2));
path11_1=[path11_1 zeros(1,10)]; % the largest delay is 10 sample
path11_2=[zeros(1,1) path11_2 zeros(1,9)];
path11_3=[zeros(1,3) path11_3 zeros(1,7)];
path11_4=[zeros(1,4) path11_4 zeros(1,6)];
path11_5=[zeros(1,7) path11_5 zeros(1,3)];
path11_6=[zeros(1,10) path11_6];
RxSignal01=path11_1+path11_2+path11_3+path11_4+path11_5+path11_6;
RxSignal01=RxSignal01(1:FrameGuard*Numsymb);
%2st transmitter to 1st receiver H21*BaseSignal3
path21_1=ones(FrameGuard,1)*fade(1,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_2=ones(FrameGuard,1)*fade(2,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_3=ones(FrameGuard,1)*fade(3,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_4=ones(FrameGuard,1)*fade(4,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_5=ones(FrameGuard,1)*fade(5,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_6=ones(FrameGuard,1)*fade(6,[1+1000:Numsymb+1000]).*BaseSignal3;
path21_1=reshape(path21_1,1,size(path21_1,1)*size(path21_1,2));
path21_2=reshape(path21_2,1,size(path21_2,1)*size(path21_2,2));
path21_3=reshape(path21_3,1,size(path21_3,1)*size(path21_3,2));
path21_4=reshape(path21_4,1,size(path21_4,1)*size(path21_4,2));
path21_5=reshape(path21_5,1,size(path21_5,1)*size(path21_5,2));
path21_6=reshape(path21_6,1,size(path21_6,1)*size(path21_6,2));
path21_1=[path21_1 zeros(1,10)]; % the largest delay is 10 sample
path21_2=[zeros(1,1) path21_2 zeros(1,9)];
path21_3=[zeros(1,3) path21_3 zeros(1,7)];
path21_4=[zeros(1,4) path21_4 zeros(1,6)];
path21_5=[zeros(1,7) path21_5 zeros(1,3)];
path21_6=[zeros(1,10) path21_6];
RxSignal10=path21_1+path21_2+path21_3+path21_4+path21_5+path21_6;
RxSignal10=RxSignal10(1:FrameGuard*Numsymb);
% ==============================
% the ideal channel response
% ==============================
H11_real=zeros(NumCarr,Numsymb); % the real channel impulse response
for k=1:NumCarr
H11_real(k,:)=H11_real(k,:)+fade(1,[1:Numsymb])*exp(-j*2*pi*(k-1)*0/NumCarr)+fade(2,[1:Numsymb])*exp(-j*2*pi*(k-1)*1/NumCarr)+...
fade(3,[1:Numsymb])*exp(-j*2*pi*(k-1)*3/NumCarr)+fade(4,[1:Numsymb])*exp(-j*2*pi*(k-1)*4/NumCarr)+...
fade(5,[1:Numsymb])*exp(-j*2*pi*(k-1)*7/NumCarr)+fade(6,[1:Numsymb])*exp(-j*2*pi*(k-1)*10/NumCarr);
end
H11_re= H11_real([29:229],:);
H21_real=zeros(NumCarr,Numsymb); % the real channel impulse response
for k=1:NumCarr
H21_real(k,:)=H21_real(k,:)+fade(1,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*0/NumCarr)+fade(2,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*1/NumCarr)+...
fade(3,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*3/NumCarr)+fade(4,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*4/NumCarr)+...
fade(5,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*7/NumCarr)+fade(6,[1+1000:Numsymb+1000])*exp(-j*2*pi*(k-1)*10/NumCarr);
end
H21_re= H21_real([29:229],:);
a0_re=abs(H11_re);
a1_re=abs(H21_re);
A_re=a0_re.^2+a1_re.^2-1;
B_re=zeros(NumCarr,Numsymb);
B_re([29:229],:)=A_re;
C_re=B_re(Data_Pattern);
Lc=Lcp/2;
RxSigna00=RxSignal00;
RxSigna11=RxSignal11;
RxSigna01=RxSignal01;
RxSigna10=RxSignal10;
% Strip off the guard interval
symb00= reshape(RxSigna00,NumCarr+Lc,Numsymb);
symb00= symb00(Lc+1:NumCarr+Lc,:);
symb11= reshape(RxSigna11,NumCarr+Lc,Numsymb);
symb11= symb11(Lc+1:NumCarr+Lc,:);
symb01= reshape(RxSigna01,NumCarr+Lc,Numsymb);
symb01= symb01(Lc+1:NumCarr+Lc,:);
symb10= reshape(RxSigna10,NumCarr+Lc,Numsymb);
symb10= symb10(Lc+1:NumCarr+Lc,:);
R00=fft(symb00);
R11=fft(symb11);
R01=fft(symb01);
R10=fft(symb10);
R0=R00+R11;
R1=R01+R10;
R0=awgn(R0,10^(SNR/10),'measured',1234,'linear');
R1=awgn(R1,10^(SNR/10),'measured',1234,'linear');
%提取导频数据
Rec_Pilot11=R0(Pilot1_Pattern);
Rec_Pilot21=R0(Pilot2_Pattern);
%估计导频处的信道频域响应
H11_Pilot=Rec_Pilot11./Data0(Pilot1_Pattern);
H21_Pilot=Rec_Pilot21./Data1(Pilot2_Pattern);
H11_Pilot=reshape(H11_Pilot,Pilot1_number,Numsymb);
H21_Pilot=reshape(H21_Pilot,Pilot2_number,Numsymb);
% ===========================================
% ls estimation
% ===========================================
%Pilot1=[37:8:221]-28; % pilot interval=24
%Pilot2=[40:8:224]-28;
% XI=1:201;
% H11= INTERP1(Pilot1,H11_Pilot,XI,'linear','extrap');
% H21= INTERP1(Pilot2,H21_Pilot,XI,'linear','extrap');
% H12= INTERP1(Pilot1,H12_Pilot,XI,'linear','extrap');
% H22= INTERP1(Pilot2,H22_Pilot,XI,'linear','extrap');
% ===========================================
% LMMSE estimation
% ===========================================
% L1=10;
% for m=1:NumCarr
% for n=1:NumCarr
% if m==n
% Rhh(m,n)=1;
% else
% Rhh(m,n)=(1-exp(-j*2*pi*(m-n)*L1/NumCarr))/(j*2*pi*(m-n)*L1/NumCarr);
% end
% end
% end
% M=[29:229];
% N1=[37:8:221];
% R1_h_hls=Rhh(M,N1);
% R1_hls_hls=Rhh(N1,N1)+1/10^(SNR/10)*eye(length(N1));
% RR1=R1_h_hls*inv(R1_hls_hls);
% N2=[40:8:224];
% R2_h_hls=Rhh(M,N2);
% R2_hls_hls=Rhh(N2,N2)+1/10^(SNR/10)*eye(length(N2));
% RR2=R2_h_hls*inv(R2_hls_hls);
% H11=RR1*H11_Pilot;
% H21=RR2*H21_Pilot;
% H12=RR1*H12_Pilot;
% H22=RR2*H22_Pilot;
% ===========================================
% ML esitmation
% ===========================================
F=dftmtx(NumCarr);
L=11;
Fh1=F([37:8:221],[1:L]);
Fh2=F([40:8:224],[1:L]);
Fu=F([29:229],[1:L]);
H11=Fu*inv(Fh1'*Fh1)*Fh1'*H11_Pilot;
H21=Fu*inv(Fh2'*Fh2)*Fh2'*H21_Pilot;
a0=abs(H11);
a1=abs(H21);
A=a0.^2+a1.^2-1;
B=zeros(NumCarr,Numsymb);
B([29:229],:)=A;
C=B(Data_Pattern);
%combinea s0,s1
Rx0=R0([29:229],:);
Rx1=R1([29:229],:);
s0=conj(H11).*Rx0+H21.*conj(Rx1);
s1=conj(H21).*Rx0-H11.*conj(Rx1);
s0=s0;
s1=s1;
%combinea s0,s1 using ideal channel estimation
s0_idea=conj(H11_re).*Rx0+H21_re.*conj(Rx1);
s1_idea=conj(H21_re).*Rx0-H11_re.*conj(Rx1);
s0_idea=s0_idea;
s1_idea=s1_idea;
%ml estimation demodulated
Rxx0=zeros(NumCarr,Numsymb);
Rxx1=zeros(NumCarr,Numsymb);
Rxx0([29:229],:)=s0;
Rxx1([29:229],:)=s1;
% extract data
DemSignal0=Rxx0(Data_Pattern);
DemSignal1=Rxx1(Data_Pattern);
%ideal estimation demodulated
Rxx0_idea=zeros(NumCarr,Numsymb);
Rxx1_idea=zeros(NumCarr,Numsymb);
Rxx0_idea([29:229],:)=s0_idea;
Rxx1_idea([29:229],:)=s1_idea;
% extract data
DemSignal0_idea=Rxx0_idea(Data_Pattern);
DemSignal1_idea=Rxx1_idea(Data_Pattern);
Dem1=DemSignal0_idea;
Dem2=DemSignal1_idea;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -