Fakerzh 2021-07-20 16:03 采纳率: 100%
浏览 292
已采纳

根据ZF算法进行的MIMO检测,检测效果并不理想,问题出在哪里?

% 如下,根据ZF算法进行的MIMO检测,检测效果并不理想,很简单的代码结构,在matlab中可直接运行,实在不知问题出在哪里

%单小区中三个用户,一个基站
n_bits=16;   %bit数
M=4;%QPSK
Nt=16;%16个基站传输天线
Nr=8; %8个用户接收天线
SNR=20;

msg1 = randi( [0 1], [n_bits 1]);        %生成比特序列
msg2 = randi( [0 1], [n_bits 1]);
msg3 = randi( [0 1], [n_bits 1]);

%  QPSK
data_temp1= reshape(msg1,log2(M),[])';             %Grouped by 2 bits per group, M=4
data_temp2= reshape(msg2,log2(M),[])';             %Grouped by 2 bits per group, M=4
data_temp3= reshape(msg3,log2(M),[])';             %Grouped by 2 bits per group, M=4
data1= bi2de(data_temp1);                            %Binary to decimal
data2= bi2de(data_temp2);                            %Binary to decimal
data3= bi2de(data_temp3);                            %Binary to decimal
modu_data1=pskmod(data1,M,pi/M); 
modu_data2=pskmod(data2,M,pi/M);
modu_data3=pskmod(data3,M,pi/M);                 %生成三组随机数据,qpsk进行调制,之后发送

%为三个用户设置Rayleigh 衰落信道矩阵
h1 = randn(Nr,Nt)+1i*randn(Nr,Nt); %Rayleigh fading channel
h1 = h1./sqrt(2); %Normalization of channel coefficients

h2 = randn(Nr,Nt)+1i*randn(Nr,Nt); %Rayleigh fading channel
h2 = h2./sqrt(2); %Normalization of channel coefficients

h3 = randn(Nr,Nt)+1i*randn(Nr,Nt); %Rayleigh fading channel
h3 = h3./sqrt(2); %Normalization of channel coefficients

%生成联合信道矩阵H,并使用ZF预编码计算三个预编码矩阵w1,w2,w3
H=[h1;h2;h3];
w=H'*inv(H*H');
w1=w(:,1:8);
w2=w(:,9:16);
w3=w(:,17:24);


%根据SNR添加高斯白噪声
sigma1 = sqrt(1/(10.^(SNR/10))); %White Gaussian noise standard deviation of each receiving antenna
n = sigma1*(randn(8,1)+1i*randn(8,1)); %White Gaussian noise of each receiving antenna




%基站传输的信号
s=w1*modu_data1+w2*modu_data2+w3*modu_data3;

%用户1接收到的信号
y1=h1*s+n;
 
%解调
  demodulation_data=pskdemod(y1,M,pi/M);    
  De_data1 = reshape(demodulation_data,[],1);
  De_data2 = de2bi(De_data1,2);
  De_Bit = reshape(De_data2',1,[]);
  [NUMBER,Ratio] = biterr(De_Bit,msg1');%与用户1的比特序列对比计算误码率

  • 写回答

3条回答 默认 最新

  • 月半 月半 2021-07-20 17:20
    关注
    1. 你给出的代码流程,叫做ZF预编码,而不是ZF检测,具体区别可以自行搜索;
      此外,噪声加大了,正确加噪声方式如下:

      n = sigma1*(randn(Nr,1)+1i*randn(Nr,1)) / sqrt(2);
      
    2. 基站端天线数16,用户端总天线数3 * 8 = 24,信道矩阵H维度为24 * 16,因此矩阵(H * H')的秩小于等于16,即不可逆,所以直接运行程序matlab会给出警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。此时得出的预编码矩阵并不准确,即不是矩阵的伪逆,HW并不是单位阵,因此误码率性能很差。

    3. 改进方法1:减少用户端天线数,将Nr设为1-5均可(只要保证用户端总天线数小于基站天线数),可以正常进行解调,信噪比不需要20dB误码率就可以降到0。注意,发送比特数应改为

      Nr = 4;
      n_bits = Nr * log2(M);
      
    4. 改进方法2:使用RZF预编码(又称MMSE预编码),即在求逆之前加上单位阵使其可逆,但由于用户端天线数比基站天线数多,改善效果并不明显,不过随着信噪比增加,误码率仍会逐渐下降。以下两种写法等价:

      w = H' * inv(H * H' + sigma1^2 * eye( 3 * Nr));
      w = H' / (H * H' + sigma1^2 * eye( 3 * Nr));
      
    5. 你这个代码里面每个用户只发送了一个符号,比特数太少,结果不具有统计意义,一般需要发送10^8比特以上数据;另外,在代码开头加上clc; clear; 可以在每次运行代码时清除之前的变量,这个属于经验问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已采纳回答 7月21日
  • 创建了问题 7月20日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题