%%主函数
clear all;
clc;
L=6000; %数据长度
Nt=6; %发射天线数
Nr=8; %接收天线数
symb=randint(1,L); %产生由0、1构成的随机序列
x_bit=reshape(symb,Nt,L/Nt); %将序列变成Nt行L/Nt列的序列
x_map=(x_bit-0.5)*sqrt(2)*(1+1i); %1映射为sqrt(1/2)(1+i) 0映射为-sqrt(1/2)(1+i)
r=zeros(Nr,L/Nt); %初始化r
H=zeros(Nr,Nt); %初始化信道响应H
snr=-10:2:8;
for SNR=1:length(snr)
sigma_2=1/(2*10^((snr(SNR))/10)); %噪声方差(根据信噪比定义所求)
for k=1:L/Nt
H=(randn(Nr,Nt) + i*randn(Nr,Nt))/sqrt(2); %产生信道响应
noise=sqrt(sigma_2)*(randn(Nr,1)+i*randn(Nr,1));
r(:,k)=H*x_map(:,k)+noise;
r_ZF(:,k)=inv(H'*H)*H'*r(:,k); % ZF检测算法
r_MMSE(:,k)=inv(H'*H+sigma_2*eye(Nt))*H'*r(:,k); % MMSE检测算法
for n=1:Nt %判决:复信号恢复成实信号
if abs(r_ZF(n,k)+sqrt(1/2)*(1+1i))-abs(r_ZF(n,k)-sqrt(1/2)*(1+1i))>0
r_ZF_panjue(n,k)=1;
else
r_ZF_panjue(n,k)=0;
end
if abs(r_MMSE(n,k)+sqrt(1/2)*(1+1i))-abs(r_MMSE(n,k)-sqrt(1/2)*(1+1i))>0
r_MMSE_panjue(n,k)=1;
else
r_MMSE_panjue(n,k)=0;
end
end
% ZF_SIC算法
H1=H;
r1=r; %防止信号污染
G=pinv(H1); %G为H的伪逆,矩阵为Nt*Nr
rank=[1:Nt]; %实现信号按信噪比大小进行排序
%算法迭代
for n=1:Nt %调用minnorm,实现SIC算法
[wki,ki]=minnorm(G,rank); %ki为G范数最小的行下标,wki为G范数最小行的行元素
r_ZF_SIC(ki,k)=wki*r1(:,k); %估计的r
if abs(r_ZF_SIC(ki,k)+sqrt(1/2)*(1+1i))-abs(r_ZF_SIC(ki,k)-sqrt(1/2)*(1+1i))>0 %判决:估计的复信号恢复为实信号
r_ZF_SIC_panjue(ki,k)=1;
else
r_ZF_SIC_panjue(ki,k)=0;
end
r1(:,k)=r1(:,k)-(r_ZF_SIC_panjue(ki,k)-0.5)*sqrt(2)*(1+1i)*H(:,ki);%接收信号去掉已估计出的信号
H1(:,ki)=zeros(Nr,1); %消除已估计出的信号(变为0)
rank(ki)=0;
G=pinv(H1); %迭代
end
%MMSE_SIC算法
H2=H;
r2=r; %防止污染信号
G=pinv(H2);
rank=[1:Nt]; %实现信号按信噪比大小进行排序
%迭代运算
for n=1:Nt %调用minnorm,实现SIC算法
[wki,ki]=minnorm(G,rank); %ki为G范数最小的行下标,wki为G范数最小行的行元素
G1=inv(H2'*H2+sigma_2*eye(Nt))*H2'; %根据公式求MMSE算法中的G
r_MMSE_SIC(ki,k)=G1(ki,:)*r2(:,k); %估计r
if abs(r_MMSE_SIC(ki,k)+sqrt(1/2)*(1+1i))-abs(r_MMSE_SIC(ki,k)-sqrt(1/2)*(1+1i))>0 %复信号恢复成实信号
r_MMSE_SIC_panjue(ki,k)=1;
else
r_MMSE_SIC_panjue(ki,k)=0;
end
r2(:,k)=r2(:,k)-( r_MMSE_SIC_panjue(ki,k)-0.5)*sqrt(2)*(1+1i)*H(:,ki);%接收信号去掉已估计出的信号
H2(:,ki)=zeros( Nr,1); %消除已估计出的信号(变为0)
rank(ki)=0;
G=pinv(H2); %迭代
end
end
%将解调信号变成1行L列,目的是和symb进行对比
d_ZF=reshape(r_ZF_panjue,1,L);
d_MMSE=reshape(r_MMSE_panjue,1,L);
d_ZF_SIC=reshape(r_ZF_SIC_panjue,1,L);
d_MMSE_SIC=reshape(r_MMSE_SIC_panjue,1,L);
%通过求已解调信号与发送信号不等的个数来求各个算法的误码率
BER_ZF(SNR)=sum(d_ZF~=symb)/L;
BER_MMSE(SNR)=sum(d_MMSE~=symb)/L;
BER_ZF_SIC(SNR)=sum(d_ZF_SIC~=symb)/L;
BER_MMSE_SIC(SNR)=sum(d_MMSE_SIC~=symb)/L;
end
%作图
figure
plot(snr,BER_ZF,'-*b')
hold on
plot(snr,BER_MMSE,'-*r')
hold on
plot(snr,BER_ZF_SIC,'-*k')
hold on
plot(snr,BER_MMSE_SIC,'-*c')
set(gca,'YScale','log');
xlabel('(SNR)dB');
ylabel('BER');
title('检测算法性能比较')
grid on
legend('ZF','MMSE','ZF-SIC','MMSE-SIC');
wireless communication.rar_VBLAST Zf_vblast_串行干扰_串行干扰抵消_干扰抵消
版权申诉
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
![avatar](https://profile-avatar.csdnimg.cn/9d774e17dae94b1287526d89d7503a61_weixin_42659194.jpg!1)
刘良运
- 粉丝: 72
- 资源: 1万+
最新资源
- Java项目-基于Springboot+Vue的私人健身与教练预约设计与实现源码+数据库脚本+部署视频+代码讲解视频+全套软件
- Java项目-基于Springboot+Vue的乒乓球预约管理的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件
- 哆咪付在线换钱系统.zip
- pycharm的优缺点及适用场景.zip
- Java项目-基于Springboot+Vue的留守儿童爱心网站的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件
- 流行的前端框架都有哪些?详细讲解React前端框架
- JSP宠物医院信息管理系统源码.rar
- Java项目-基于Springboot+Vue的家政服务管理平台的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件
- 大数据可视化大屏页面-医院大数据展示+源代码+演示地址
- 人工智能-美国加利福尼亚州房价预测实战
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
评论1