📄 stbc_mimo_ofdm_test.m
字号:
% 16 QAM 调制,采用Hadamard变换 N=128
%OFDM Channel Estimation Based on Comb Pilot
%IFFT_bin_length: IFFT和FFT的点数
%carrier_count: 子载波个数
%bits_per_symbol: 每符号上的比特数
%symbols_per_carrier: 每桢的OFDM符号数
%X:欲发送的二进制比特流
clear all;
close all;
N0=32;
IFFT_bin_length0=N0;%ifft长度 prev 128
carrier_count0=N0;%子载波数 prev 128
bits_per_symbol=1;%每符号比特数 prev 2
symbols_per_carrier=100;%一帧符号数
N_number0=carrier_count0*symbols_per_carrier*bits_per_symbol;%2400一帧比特数
M=4;
L=4; %过采样率
NN=4:.1:12; %CCDF的门限值
GI=8; % guard interval length
N_snr=100; % 每比特信噪比
snr=8; %信噪比间隔
%------------------------------------------------------------
% vector initialization
Xa=zeros(1,N_number0);%2400个bit
X1=[];
X2=[];
X3=[];
X4=[];
X5=[];
X6=[];
X7=[];
X8=[];
Y1=[];
Y2=[];
Y3=[];
Y4=[];
Y5=[];
Y6=[];
Y7=[];
ccdf0=zeros(1,81);
ccdf1=ccdf0;
ccdf2=ccdf0;
ccdf3=ccdf0;
ccdf4=ccdf0;
ccdf5=ccdf0;
ccdf6=ccdf0;
Xa=randsrc(1,N_number0,[0:3]);%产生二进制随即序列(非0即1)3072
%--------------------------------------------------------
%QAM调制
X1a=pskmod(Xa,4);
%---------------------------------------------------------
%串并转换
X2a=reshape(X1a,carrier_count0,symbols_per_carrier);%12*128,12个复信号符号,128列载波
%---------------------------------------------------------
%进行空时分组编码
N=symbols_per_carrier;
%s1a=s1;
%s1b=[-s1(1:N0/M,:);s1(N0/M+1:N0,:)];
%s1c=[s2(1:N0/M,:);s1(N0/M+1:N0,:)];
%s1d=[-s2(1:N0/M,:);s1(N0/M+1:N0,:)];
%s2a=s2;
%s2b=[-s2(1:N0/M,:);s2(N0/M+1:N0,:)];
%s2c=[s1(1:N0/M,:);s2(N0/M+1:N0,:)];
%s2d=[-s1(1:N0/M,:);s2(N0/M+1:N0,:)];
%S1a=[s1a;s1b;s1c;s1d];
%S2a=[s2a;s2b;s2c;s2d];
s1=zeros(carrier_count0,symbols_per_carrier);
s2=zeros(carrier_count0,symbols_per_carrier);
s1(:,1:2:symbols_per_carrier)=X2a(:,1:2:symbols_per_carrier);
s1(:,2:2:symbols_per_carrier)=-conj(X2a(:,2:2:symbols_per_carrier));
s2(:,1:2:symbols_per_carrier)=X2a(:,2:2:symbols_per_carrier);
s2(:,2:2:symbols_per_carrier)=conj(X2a(:,1:2:symbols_per_carrier));
%---------------------------------------------------------
% oversample L=4
X3a=[s1(1:carrier_count0/2,:);zeros((L-1)*IFFT_bin_length0,symbols_per_carrier);s1(carrier_count0/2+1:carrier_count0,:)];
X3b=[s2(1:carrier_count0/2,:);zeros((L-1)*IFFT_bin_length0,symbols_per_carrier);s2(carrier_count0/2+1:carrier_count0,:)];
%---------------------------------------------------------
% PAPR0 calculation
X4a=ifft(X3a,L*IFFT_bin_length0); % IFFT Matrix
w0=X4a*carrier_count0 ;
x0=(abs(w0)).^2;
x=x0;
m0=mean(x);
v0=max(x);
papra=10*log10(v0./m0);
X4b=ifft(X3b,L*IFFT_bin_length0); % IFFT Transformation
w1=X4b*carrier_count0;
x1=(abs(w1)).^2;
xa=x1;
m1=mean(xa);
v1=max(xa);
paprb=10*log10(v1./m1);
papr0=max(papra,paprb);
%---------------------------------------------------------
% CARI
for k=1:symbols_per_carrier;
for p=1:M;
s1a=s1(:,k);
s1b=s1(:,k)+[zeros((p-1)*N0/M,1);-2*s1((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
s1c=s1(:,k)+[zeros((p-1)*N0/M,1);-s1((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)]+...
[zeros((p-1)*N0/M,1);s2((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
s1d=s1(:,k)+[zeros((p-1)*N0/M,1);-s1((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)]-...
[zeros((p-1)*N0/M,1);s2((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
s2a=s2(:,k);
s2b=s2(:,k)+[zeros((p-1)*N0/M,1);-2*s2((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
s2c=s2(:,k)+[zeros((p-1)*N0/M,1);-s2((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)]+...
[zeros((p-1)*N0/M,1);s1((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
s2d=s2(:,k)+[zeros((p-1)*N0/M,1);-s2((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)]-...
[zeros((p-1)*N0/M,1);s1((p-1)*N0/M+1:p*N0/M,k);zeros((M-p)*N0/M,1)];
S1a=[s1a;s1b;s1c;s1d];
S2a=[s2a;s2b;s2c;s2d];
for u=1:4; % 自由度为4
Ta(:,k)=S1a([(u-1)*N0+1:u*N0],1); % wrong only to one symbol
%Ta(:,k)=S1a([(u-1)*N0+1:u*N0],k); % wrong only to one symbol
X5a(:,k)=ifft(Ta(:,k),L*IFFT_bin_length0);
w1a(:,k)=X5a(:,k)*carrier_count0;
x1a(:,k)=(abs(w1a(:,k))).^2;
xaa(:,k)=x1a(:,k);
m1a(:,k)=mean(xaa(:,k));
v1a(:,k)=max(xaa(:,k));
%papr3a(u,k)=10*log10(v1a(:,k)./m1a(:,k));
papr1a(u)=10*log10(v1a(:,k)./m1a(:,k));
%Tb=S2a([(u-1)*N0+1:u*N0],k);
Tb(:,k)=S2a([(u-1)*N0+1:u*N0],1);
X5b(:,k)=ifft(Tb(:,k),L*IFFT_bin_length0);
w1b(:,k)=X5b(:,k)*carrier_count0;
x1b(:,k)=(abs(w1b(:,k))).^2;
xab(:,k)=x1b(:,k);
m1b(:,k)=mean(xab(:,k));
v1b(:,k)=max(xab(:,k));
%papr3b(u,k)=10*log10(v1b(:,k)./m1b(:,k));
papr1b(u)=10*log10(v1b(:,k)./m1b(:,k));
papr1(u)=max(papr1a(u),papr1b(u));
end
[papr2(p),I(p)]=min(papr1);
%s1(:,k)=S1a([(I(p)-1)*N0+1:I(p)*N0],k);
%s2(:,k)=S2a([(I(p)-1)*N0+1:I(p)*N0],k);
s1(:,k)=S1a([(I(p)-1)*N0+1:I(p)*N0],1);
s2(:,k)=S2a([(I(p)-1)*N0+1:I(p)*N0],1);
end
[papr3(k),Ix(k)]=min(papr2);
%---------------------------------------------------------
%for k=1:symbols_per_carrier;
for l=1:81;
if papr0(k)>NN(l);
ccdf0(l)=ccdf0(l)+1;
end
if papr3(k)>NN(l);
ccdf6(l)=ccdf6(l)+1;
end
end
end
ccdf8=ccdf0./symbols_per_carrier; %N=32
ccdf12=ccdf6./symbols_per_carrier; %N=128,Jacket变换后
NN=4:.1:12;
semilogy(NN,ccdf8,'k',NN,ccdf12,'k--')
title('不同子载波数的CCDF曲线')
xlabel('papr(dB)'),ylabel('ccdf')
%legend('原来','SLM后',2)
grid on
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -