%***************************************************************************************%
%程序名称:vblast.m
%功能描述:vblast的各种检测算法
%输入信息:数据帧长度L
% 信噪比范围 [0:2:20]
%输出变量:BER随SNR变化曲线
%子函数 : modulation(input_frame, index) 调制信号产生
% demodulation(input_modu, index) 解调
% SIC(tx,Q,r_sic,R1, index) SIC检测算法
% MMSE_SIC (tx,G1,r, h_mmse_sic,rx,sigma,index) MMSE_SIC检测算法
% ZF_SIC(tx,G,r_zf_sic,h_zf_sic,rx,index) ZF_SIC检测算法
% OSIC(tx,r_osic, h_osic,p0,g1,index,sigma) OSIC检测算法
% SQRD(h,tx,r_sqrd,index) SQRD检测算法
%创建日期:2010-12-17
%创建作者:方会妮
%修改信息:按照编程规范修改
%修改日期:2010-12-17
%***************************************************************************************%
clc %清除命令窗口
clear %清空寄存器
tic %与toc配对,统计程序运行时间
tx=4;rx=4;L=400; %发射天线数,接收天线数,帧长
SNRindB=[0:2:20]; %定义信噪比的范围
Meantimes=50; %每个SNR的统计平均次数
index=1; %选择调制解调的方式(bpsk)
for i=1:length (SNRindB)
SNR(i)=10^(SNRindB(i)/10);
sigma =1/sqrt(SNR(i));
for times=1:Meantimes,
A=randint(1,L); % 信源A
a=modulation(A,index); % 调制
X=reshape(a,tx,L/tx); % 经过BPSK调制的V-Blast发射矩阵X
n=1/sqrt(2)*sigma*(randn(rx,L/tx)+sqrt(-1)*randn(rx,L/tx));%产生均值为0,方差为1的复高斯噪声
dec1= zeros(L,1);
dec2= zeros(L,1);
dec3= zeros(L,1);
dec4= zeros(L,1);
dec5= zeros(L,1);
dec6= zeros(L,1);
dec7= zeros(L,1);
% 检测
for col_idx = 1:L/tx
H=sqrt(1/2)*(randn(rx,tx)+sqrt(-1)*randn(rx,tx)); % 快衰落Rayleigh信道H
h_mmse_sic=H; % H在运行过程中会改变,保证每种算法的H相同
h_zf_sic=H;
h_osic=H;
h=H;
R(:,col_idx)=H*X(:,col_idx)+n(:,col_idx); %接收信号R
r_sic=R(:,col_idx);
r_zf_sic=R(:,col_idx);
r_osic=R(:,col_idx);
r_sqrd=R(:,col_idx);
r=R(:,col_idx);
G=pinv(H); %ZF中用的H1
G1=inv(H'*H+sigma.^2*eye(tx))*H'; %MMSE中用的w'
g1=G1;
[gk p0]=min(sum(abs(g1).^2,2)); %OSIC算法中第一次检测的符号
[Q,R1]=qr(H);
% ZF 检测*************
det_zf = G*R(:, col_idx);
dec1((col_idx-1)*tx+[1:tx],:) =demodulation(det_zf.',index).';
% MMSE 检测*************
det_MMSE=G1*R(:, col_idx);
dec2((col_idx-1)*tx+[1:tx],:) = demodulation(det_MMSE.',index).';
% SIC 检测***************
dec3((col_idx-1)*tx+[1:tx],:) =SIC(tx,Q,r_sic,R1, index);
% MMSE-SIC 检测**********
dec4((col_idx-1)*tx+[1:tx],:) =MMSE_SIC (tx,G1,r, h_mmse_sic,rx,sigma,index);
% ZF_SIC 检测*************
dec5((col_idx-1)*tx+[1:tx],:)=ZF_SIC(tx,G,r_zf_sic,h_zf_sic,rx,index);
% OSIC 检测**************
dec6((col_idx-1)*tx+[1:tx],:) =OSIC(tx,r_osic, h_osic,p0,g1,index,sigma);
% SQRD检测 **************
dec7((col_idx-1)*tx+[1:tx],:)=SQRD(h,tx,r_sqrd,index);
end
NumErr1(i,times)=sum(abs(dec1.'~=A)); %每个信噪比下第times循环的误码个数
NumErr2(i,times)=sum(abs(dec2.'~=A));
NumErr3(i,times)=sum(abs(dec3.'~=A));
NumErr4(i,times)=sum(abs(dec4.'~=A));
NumErr5(i,times)=sum(abs(dec5.'~=A));
NumErr6(i,times)=sum(abs(dec6.'~=A));
NumErr7(i,times)=sum(abs(dec7.'~=A));
end
end
Ber1=mean(NumErr1.')/L; %每个信噪比下平均的误码率
Ber2=mean(NumErr2.')/L;
Ber3=mean(NumErr3.')/L;
Ber4=mean(NumErr4.')/L;
Ber5=mean(NumErr5.')/L;
Ber6=mean(NumErr6.')/L;
Ber7=mean(NumErr7.')/L;
semilogy (SNRindB,Ber1,'-bd')
hold on
semilogy (SNRindB,Ber2,'-mx')
hold on
semilogy (SNRindB,Ber3,'-g>')
hold on
semilogy (SNRindB,Ber4,'-b*')
hold on
semilogy (SNRindB,Ber5,'-ro')
hold on
semilogy (SNRindB,Ber6,'-gd')
hold on
semilogy (SNRindB,Ber7,'-k*')
xlabel('Eb/No in dB');
ylabel('error probability');
legend('zf','mmse','sic','mmse-sic','zf-sic','osic','sqrd');
toc
评论2