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