ps:我还没看内容。
空时分组编码和空分复用是LTE里主要的两种传输方式。由于在LTE中频域分配资源,因此空时编码在LTE变形为空频编码,主要用于提高可靠性和覆盖范围;空分复用主要用于提高传输效率。具体原理相信书上都讲了不少,网上的程序很多,这里提供一个简单的验证过的空时分组编码的仿真程序供大家学习基本原理。同时提出一堆待解决的问题,希望谁能慷慨解决一下。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CopyRight by flysmoke,
ltestudy.com, All Right Reserved
% Filename:
Alamouti_scheme_2x2.m
% Verision:
0.1
%
Description:
% --Space Time B Code
Simulation.
% Edit
History:
% --Create by
flysmoke---2013-09-01
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all;
clear all;
clc
%sim frame number and frame
bit length
L_frame=130;
N_frame=1e3;
%number of tx and rx antenna,
support MRC:1x1,1x2,1x4, and STBC: 2x1,2x2
NT=2; NR=2;
%modulation type, and
bitPerSym, only support bitPerSym=4
bitPerSym=4;
M=2^bitPerSym;
EbN0dBs=[0:2:20];
%constant to
cal
sq_NT=sqrt(NT);
sqb=sqrt(bitPerSym);
for
i_EbN0=1:length(EbN0dBs)
EbN0dB=EbN0dBs(i_EbN0);
sigma=sqrt(bitPerSym/2/(10^(EbN0dB/10)));
% simple H and
H =ones(NR,NT);
H_en = sum(sum(abs(H).^2));
numBitErr = 0;
for i_packet=1:N_frame
% Tx----
generate bits, modulation and STBC
msg_bits=randi([0 1],L_frame,bitPerSym*NT);
X =
[];
for
nT=1:NT
for
i=1:L_frame
X(nT,i) =
QAM16_mod(msg_bits(i,nT*bitPerSym+[-bitPerSym+1:0])');
end
end
X1=X;
if(NT==2)
X2=[-conj(X(2,:));
conj(X(1,:))];
end
% Channel
and Rx----
if(NT==2)
R1 = H*X1 +
sigma*(randn(NR,L_frame)+1i*randn(NR,L_frame));
R2 = H*X2 +
sigma*(randn(NR,L_frame)+1i*randn(NR,L_frame));
Z(1,:) = H(:,1)'*R1 +
H(:,2).'*conj(R2);
Z(2,:) = H(:,2)'*R1 -
H(:,1).'*conj(R2);
softbits0 =
QAM16_slicer_soft_ml(Z(1,:)./H_en);
softbits1 =
QAM16_slicer_soft_ml(Z(2,:)./H_en);
msg_hat_bits = [softbits0
softbits1]>0;
else
R1 = H*X1 +
sigma*(randn(NR,L_frame)+1i*randn(NR,L_frame));
Z = H'*R1;
softbits0 =
QAM16_slicer_soft_ml(Z./H_en);
msg_hat_bits = softbits0
>0;
end
numBitErr
= numBitErr + sum(sum(msg_bits~=msg_hat_bits));
if
numBitErr>10000, break;
end
end % End of FOR loop for
i_packet
BER(i_EbN0) =
numBitErr/(i_packet*L_frame*bitPerSym*NT);
disp(strcat(num2str(EbN0dBs(i_EbN0)),',simPackNum=',num2str(i_packet),',
BER=',num2str(BER(i_EbN0))));
end % End of FOR loop for i_EbN0
semilogy(EbN0dBs,BER,'r'),
axis([EbN0dBs([1 end]) 1e-6 1e0]);
grid on;
xlabel('EbN0[dB]'); ylabel('BER');
hold on
仿真结果如下:
有两个文件需要提供一下才能仿真,modulation 和
slice函数。这里将slice做成P文件了,原因是这个模块的实现可以琢磨琢磨。
为了让讨论积极些,这里先抛几块砖。
1.
信道的功率没有归一化,噪声的功率是否正确
2.
程序的信道相当的简单,如果是衰落信道,该程序是否适用
3.
软信息在这里基本无用,因为是硬判决,谁慷慨的补上viterbi或turbo功能
4.
软判决的程序缺少,谁慷慨的补一下,并且加上编解码后性能要能超越原程序
5.
目前是理想信道估计,实际信道估计的程序缺少。。。。。
6.
目前是支持1×1,1×2,1×4,2×2,谁慷慨的补上4×2等天线组合
7.
目前是支持QPSK,16QAM,谁慷慨的补上64QAM
8.
现有的程序架构并不是很好,谁慷慨的优化一下
9.
上面这些都有同学慷慨的做完后,我可以负责总结一下,再发一篇总结文章。呵呵