close all;
clear all;
index = 1;
Nt = 2;
Nr = 2;
M = 16;
L = 1000;
SNRdB = zeros(1,11);
BER_zf = zeros(1,10000);
BER_mmse = zeros(1,10000);
BER_zfsic = zeros(1,10000);
BER_mmsesic = zeros(1,10000);
BER1_zf = zeros(1,11);
BER1_mmse = zeros(1,11);
BER1_zfsic = zeros(1,11);
BER1_mmsesic = zeros(1,11);
SNRdB = 0:2:20;
for index = 1:11
for index1 = 1:10000
SNR = 10.^(SNRdB(index)/10);
var = 1./(SNR * log2(M));
ALP = [-3+3i -3+i -3-i -3-3i -1+3i -1+i -1-i -1-3i 1+3i 1+i 1-i 1-3i 3+3i 3+i 3-i 3-3i]*sqrt(3/(2*(M-1)));
ALPbin = dec2bin([0:M-1],log2(M));
s = ALP(randint(Nt,L,[1 M]));
i = 0;
for u = 1:L
for v = 1:Nt
i = i + 1;
sbin(i,:) = ALPbin(find(ALP == s(v,u)),:);
end
end
H = (randn(Nr,Nt) + sqrt(-1) * randn(Nr,Nt)) / sqrt(2);
n = (randn(Nr,L) + sqrt(-1) * randn(Nr,L)) * sqrt(var) / sqrt(2);
y = H * s + n;
%%
%zf
dzf = zeros(M,Nt*L);
kset_zf = zeros(Nt,L);
tildes_zf = (pinv(H'*H) * H') * y;
for j = 1:length(ALP)
dzf(j,:) = reshape(abs(tildes_zf - ALP(j)).^2,1,size(y,1) * size(y,2));
end
[dmin,kset_zf] = min(dzf);
for q = 1:size(dzf,2)
hatsbin_zf(q,:) = ALPbin(kset_zf(q),:);
end
BER = mean(reshape(abs(sbin - hatsbin_zf),1,Nt * L * log2(M)));
BER_zf(index1) = BER;
%%
%mmse
dmmse = zeros(M,Nt*L);
kset_mmse = zeros(Nt,L);
tildes_mmse = (pinv(H'*H + var*eye(Nt))*H')* y;
for t = 1:length(ALP)
dmmse(t,:) = reshape(abs(tildes_mmse - ALP(t)).^2,1,size(y,1) * size(y,2));
end
[dmin,kset_mmse] = min(dmmse);
for q1 = 1:size(dmmse,2)
hatsbin_mmse(q1,:) = ALPbin(kset_mmse(q1),:);
end
BER = mean(reshape(abs(sbin - hatsbin_mmse),1,Nt * L * log2(M)));
BER_mmse(index1) = BER;
%%
%zf-sic
kset_zfsic = zeros(Nt,L);
ibin = 0;
[Q,R] = qr(H);
tildes_zfsic = Q' * y;
for u=1:L
for j =1:M
disc2(j) = (abs(ALP(j) - (tildes_zfsic(2,u)/R(2,2))))^2;
end
[dmin2,kset_zfsic(2,u)] = min(disc2);
hats(2,u) = ALP(kset_zfsic(2,u));
for q = 1:M
disc1(q) = (abs(ALP(q) - (tildes_zfsic(1,u) - hats(2,u)*R(1,2))/R(1,1)))^2;
end
[dmin1,kset_zfsic(1,u)] = min(disc1);
hats(1,u) = ALP(kset_zfsic(1,u));
hatsbin(ibin+1,:) = ALPbin(kset_zfsic(1,u),:);
hatsbin(ibin+2,:) = ALPbin(kset_zfsic(2,u),:);
ibin = ibin+2;
end
BER = mean(reshape(abs(sbin - hatsbin),1,Nt*L*log2(M)));
BER_zfsic(index1) = BER;
%%
%mmse-sic
kset_mmsesic = zeros(Nt,L);
ibin = 0;
Hex = [H;sqrt(var)*eye(Nt)];
yex = [y;zeros(Nt,L)];
[Q,R] = qr(Hex);
tildes_mmsesic = Q' * yex;
for u=1:L
for j =1:M
disc2(j) = (abs(ALP(j) - (tildes_mmsesic(2,u)/R(2,2))))^2;
end
[dmin2,kset_mmsesic(2,u)] = min(disc2);
hats(2,u) = ALP(kset_mmsesic(2,u));
for q = 1:M
disc1(q) = (abs(ALP(q) - (tildes_mmsesic(1,u) - hats(2,u)*R(1,2))/R(1,1)))^2;
end
[dmin1,kset_mmsesic(1,u)] = min(disc1);
hats(1,u) = ALP(kset_mmsesic(1,u));
hatsbin(ibin+1,:) = ALPbin(kset_mmsesic(1,u),:);
hatsbin(ibin+2,:) = ALPbin(kset_mmsesic(2,u),:);
ibin = ibin+2;
end
BER = mean(reshape(abs(sbin - hatsbin),1,Nt*L*log2(M)));
BER_mmsesic(index1) = BER;
save myfile BER_zf BER1_zf BER_mmse BER1_mmse BER_zfsic BER1_zfsic BER_mmsesic BER1_mmsesic SNRdB index index1 Nt Nr M L;
clear all;
load myfile;
[index index1]
end
BER1_zf(index) = mean(BER_zf);
BER1_mmse(index) = mean(BER_mmse);
BER1_zfsic(index) = mean(BER_zfsic);
BER1_mmsesic(index) = mean(BER_mmsesic);
save myfile BER1_zf BER1_mmse BER1_zfsic BER1_mmsesic SNRdB index Nt Nr M L ;
clear all;
load myfile;
end
semilogy(SNRdB,BER1_zf,'+-',SNRdB,BER1_mmse,'s-',SNRdB,BER1_zfsic,'o-',SNRdB,BER1_mmsesic,'^-');
legend('ZF','MMSE','ZF-SIC','MMSE-SIC');
set(gca,'XTick',[0:2:20]);
xlabel('SNRdB');
ylabel('BER');
grid on
matlab_2发射2接收天线_MIMO_瑞利信道_16QAM_ZF、MMSE、ZF-SIC、MMSE-SIC_误码率性能比较
版权申诉
5星 · 超过95%的资源 14 浏览量
2022-07-05
23:37:23
上传
评论 2
收藏 2KB ZIP 举报
wouderw
- 粉丝: 272
- 资源: 2960
- 1
- 2
前往页