% 如下,根据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的比特序列对比计算误码率
根据ZF算法进行的MIMO检测,检测效果并不理想,问题出在哪里?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 月半 月半 2021-07-20 17:20关注
你给出的代码流程,叫做ZF预编码,而不是ZF检测,具体区别可以自行搜索;
此外,噪声加大了,正确加噪声方式如下:n = sigma1*(randn(Nr,1)+1i*randn(Nr,1)) / sqrt(2);
基站端天线数16,用户端总天线数3 * 8 = 24,信道矩阵H维度为24 * 16,因此矩阵(H * H')的秩小于等于16,即不可逆,所以直接运行程序matlab会给出警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。此时得出的预编码矩阵并不准确,即不是矩阵的伪逆,HW并不是单位阵,因此误码率性能很差。
改进方法1:减少用户端天线数,将Nr设为1-5均可(只要保证用户端总天线数小于基站天线数),可以正常进行解调,信噪比不需要20dB误码率就可以降到0。注意,发送比特数应改为
Nr = 4; n_bits = Nr * log2(M);
改进方法2:使用RZF预编码(又称MMSE预编码),即在求逆之前加上单位阵使其可逆,但由于用户端天线数比基站天线数多,改善效果并不明显,不过随着信噪比增加,误码率仍会逐渐下降。以下两种写法等价:
w = H' * inv(H * H' + sigma1^2 * eye( 3 * Nr)); w = H' / (H * H' + sigma1^2 * eye( 3 * Nr));
你这个代码里面每个用户只发送了一个符号,比特数太少,结果不具有统计意义,一般需要发送10^8比特以上数据;另外,在代码开头加上
clc; clear;
可以在每次运行代码时清除之前的变量,这个属于经验问题。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 3无用
悬赏问题
- ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
- ¥15 对于squad数据集的基于bert模型的微调
- ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
- ¥20 steam下载游戏占用内存
- ¥15 CST保存项目时失败
- ¥15 树莓派5怎么用camera module 3啊
- ¥20 java在应用程序里获取不到扬声器设备
- ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
- ¥15 Attention is all you need 的代码运行
- ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗