📄 aaa.asv
字号:
function BerSnrTable=AAA(maxsnr)
fprintf( 'AAA仿真\n') ;
BerSnrTable = zeros(maxsnr+1,3);
% --------------------------------------------- %
% 参数定义 %
% --------------------------------------------- %
% Initialize the parameters
NumLoop = 100;
NumSubc = 64;
NumCP = 16;
SyncDelay = 0;
% 子载波数 64
% 位数/ 符号 2
% 符号数/ 载波 100
% 训练符号数 0
% 循环前缀长度 16 (1/16)*T
% 调制方式 QPSK
% 多径信道数 3
% IFFT Size 64
% 信道最大时延 2
% --------------------------------------------- %
% QPSK MODULATION %
% --------------------------------------------- %
for snr=0:maxsnr
BerSnrTable(snr+1,1) = snr;
BitsTx = floor(rand(1,NumLoop*NumSubc)*2);
SymQpsk=QpskMapping(BitsTx);
%SymQAMtmp = reshape(BitsTx,2,NumLoop*NumSubc/2).';
%SymQAMtmptmp = bi2de(SymQAMtmp,2,'left-msb');
%QAMTable = [-1-i -1+i 1-i 1+i];
%SymQAM = QAMTable(SymQAMtmptmp+1);
SymQpskd=zeros(1,NumLoop*NumSubc/2);
for i= 1:2*NumSubc:NumLoop*NumSubc/2-2*NumSubc+1
c1=[];
c2=[];
x1=SymQpsk(1,i:i+63);
x2=SymQpsk(1,i+64:i+127);
% --------------------------------------------- %
% IFFT
% --------------------------------------------- %
SymIFFTtmp = reshape(x1,NumSubc,1);
SymIFFT = ifft(SymIFFTtmp,NumSubc);
% --------------------------------------------- %
% Add cyclic prefix %
% --------------------------------------------- %
NumAddPrefix = NumSubc + NumCP;
s1 = zeros(NumAddPrefix,1);
RowPrefix = (NumSubc - NumCP + 1):NumSubc;
s1 = [SymIFFT(RowPrefix,:);SymIFFT];
X1=reshape(s1,1,NumAddPrefix);
% --------------------------------------------- %
% FFT %
% --------------------------------------------- %
SymIFFTtmp1 = reshape(x2,NumSubc,1);
SymFFT = fft(SymIFFTtmp1,NumSubc,1);
% --------------------------------------------- %
% Add cyclic prefix %
% --------------------------------------------- %
NumAddPrefix = NumSubc + NumCP;
s2 = zeros(NumAddPrefix,1);
RowPrefix = (NumSubc - NumCP + 1):NumSubc;
s2 = [SymFFT(RowPrefix,:);SymFFT];
X2=reshape(s2,1,NumAddPrefix);
% --------------------------------------------- %
% channel cofficient %
% --------------------------------------------- %
h1=randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix);
H1=diag(h1,0);
h2=randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix);
H2=diag(h2,0);
h3=randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix);
H3=diag(h3,0);
h4=randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix);
H4=diag(h4,0);
%生成加性高斯白噪声%
zsnl=sqrt(1/(10^((snr)/10)));
N11=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
N12=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
N21=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
N22=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
%中继R1信号处理%
Y11=X1*H1+N11;
Y12=X2*H1+N12;
S11=sqrt(0.25/(1+0.5))*Y11;
t=zeros(1,NumAddPrefix-1);
t=Y12(1,2:NumAddPrefix);
tt=fliplr(t);
Y12(1,2:NumAddPrefix)=tt;
S12=sqrt(0.25/(0.5+1))*Y12;
%中继R2信号处理%
Y21=X1*H2+N21;
Y22=X2*H2+N22;
S21=-sqrt(0.25/(0.5+1))*conj(Y22);
q=conj(Y21);
t=zeros(1,NumAddPrefix-1);
t=q(1,2:NumAddPrefix);
tt=fliplr(t);
q(1,2:NumAddPrefix)=tt;
S22=sqrt(0.25/(0.5+1))*q;
% --------------------------------------------- %
% 接收端的信号处理 %
% --------------------------------------------- %
%生成加性高斯白噪声%
zsnl=sqrt(1/(10^((snr)/10)));
N1=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
N2=zsnl*(randn(1,NumAddPrefix)+j*randn(1,NumAddPrefix));
R1=S11*H3+S21*H4+N1;
R2=S12*H3+S22*H4+N2;
% --------------------------------------------- %
% Remove Guard Intervals %
% --------------------------------------------- %
K1=reshape(R1,NumAddPrefix,1 );
K2=reshape(R2,NumAddPrefix,1 );
SymDeCP1 = zeros(NumSubc,1);
SymDeCP1 = K1((NumCP+1+SyncDelay):NumAddPrefix+SyncDelay,:);
SymDeCP2 = zeros(NumSubc,1);
SymDeCP2 = K2((NumCP+1+SyncDelay):NumAddPrefix+SyncDelay,:);
F1=reshape(SymDeCP1,1,NumSubc);
F2=reshape(SymDeCP2,1,NumSubc);
% --------------------------------------------- %
% 对第二个ofdm信号的处理 %
% --------------------------------------------- %
o=F2(1,NumSubc-NumCP+1:NumSubc);
p=F2(1,1:NumSubc-NumCP);
F2(1,1:NumCP)=o;
F2(1,NumCP+1:NumSubc)=p;
% --------------------------------------------- %
% FFT %
% --------------------------------------------- %
FF1=reshape(F1,NumSubc,1);
FF2=reshape(F2,NumSubc,1);
ZZ1 = fft(FF1,NumSubc,1);
ZZ2 = fft(FF2,NumSubc,1);
% --------------------------------------------- %
% alamouti 合成信号估计值ss0和ss1 %
% --------------------------------------------- %
Z1=reshape(ZZ1,1,NumSubc);
Z2=reshape(ZZ2,1,NumSubc);
HH3=diag(h3(1,NumAddPrefix-NumSubc+1:NumAddPrefix),0);
HH4=diag(h4(1,NumAddPrefix-NumSubc+1:NumAddPrefix),0);
ss0=Z1*conj(HH3)+conj(Z2)*HH4;
ss1=Z1*conj(HH4)-conj(Z2)*HH3;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 最大似然译码 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:NumSubc
dh = [1+j -1+j -1-j 1-j]/sqrt(2);
D1=abs(ss0(k)*[1 1 1 1]-dh).^2;
[minScale positionmin]=min(D1);
c1=[c1 dh(positionmin)];
D2=abs(ss1(k)*[1 1 1 1]-dh).^2;
[minScale positionmin]=min(D2);
c2=[c2 dh(positionmin)];
end
SymQpskd(1,i:i+63)=c1;
SymQpskd(1,i+64:i+127)=c2;
end
BitRx=QpskInverseMapping(SymQpskd);
[Num,Ber]=symerr(BitsTx,BitRx);
BerSnrTable(snr+1,2) = Num ;
BerSnrTable(snr+1,3) = Ber ;
end
figure(1);
semilogy(BerSnrTable(1:3:maxsnr+1,1),BerSnrTable(1:3:maxsnr+1,3),'g*-');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -