A list,
Simulation of MIMO_OFDM Communication based on space – time Block Coding
Ii. Source code
%main_STBC_MIMO_OFDM. M % This is a simulation design of MIMO_OFDM communication system based on space-time block coding. This system includes QPSK modulation and demodulation, IFFT modulation, space-time codec, channel estimation based on training symbol and other communication modules. Clear all the close all CLC % + + + + + + + + + + + + + + + + + + + + + + + + + + + a variable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I =sqrt(- 1);
IFFT_bin_length=512; % Number of Fourier transform sampling points carrier_count=100; % Number of subcarriers symbols_per_carrier=66; % Symbol number/carrier CP_length =10; % Loop prefix length addPrefix_length =IFFT_bin_length+cp_length; M_psk=4; bits_per_symbol=log2(M_psk); % digit/symbol %[x1 x2;-x2* x1*]1 2;2 -+j 1+j];
%[x1 -x2 -x3;x2* x1* 0; x3*0 x1*;0-x3* x2*]1 2 - - 3;2+j 1+j 0;3+j 0 1+j;0 - 3+j 2+j];
co_time=size(O,1);
Nt=size(O,2); % Number of transmitting antennas Nr=2; % % receiving antenna number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % + + + + + + + + + + + + + + + + + + + + + + + + + + + transmitter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + disp ('--------------start-------------------');
num_X=1;
for cc_ro=1:co_time
for cc_co=1:Nt
num_X=max(num_X,abs(real(O(cc_ro,cc_co))));
end
end
co_x=zeros(num_X,1);
for con_ro=1:co_time
for con_co=1:Nt % is used to determine the positions, symbols, and conjugation of elements in the matrix "O"if abs(real(O(con_ro,con_co)))~=0
delta(con_ro,abs(real(O(con_ro,con_co))))=sign(real(O(con_ro,con_co)));
epsilon(con_ro,abs(real(O(con_ro,con_co))))=con_co;
co_x(abs(real(O(con_ro,con_co))),1)=co_x(abs(real(O(con_ro,con_co))),1) +1;
eta(abs(real(O(con_ro,con_co))),co_x(abs(real(O(con_ro,con_co))),1))=con_ro;
coj_mt(con_ro,abs(real(O(con_ro,con_co))))=imag(O(con_ro,con_co));
end
end
end
eta=eta. ';
eta=sort(eta);
eta=eta. '; % coordinates: (1 to 100) + 14= (15:114)
carriers = (1: carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2)); % coordinates:256 - (15:114) + 1= 257 - (15:114) = (242:143)
conjugate_carriers=IFFT_bin_length-carriers+2;
tx_training_symbols=training_symbol(Nt,carrier_count);
baseband_out_length = carrier_count * symbols_per_carrier;
snr_min=3; % Minimum SNR snR_max =15; % Maximum SNR graph_inf_bit=zeros(SNr_max-snr_min +1.2,Nr); % Graph_inf_SYm =zeros(SNr_max-SNr_min +1.2,Nr);
for SNR=snr_min:snr_max
clc
disp('Wait until SNR='); disp(snr_max); SNR n_err_sym=zeros(1,Nr);
n_err_bit=zeros(1,Nr);
Perr_sym=zeros(1,Nr);
Perr_bit=zeros(1,Nr); re_met_sym_buf=zeros(carrier_count,symbols_per_carrier,Nr); re_met_bit=zeros(baseband_out_length,bits_per_symbol,Nr); % Generate random number for simulation baseband_out=round(rand(baseband_out_length,bits_per_symbol)); % Binary to decimal conversion de_data=bi2de(baseband_out); PSK modulation data_buf % = pskmod (de_data M_psk,0); carrier_matrix=reshape(data_buf,carrier_count,symbols_per_carrier); % to prepare for null - time coding, where two consecutive numbers on each subcarrier are taken at a timefor tt=1:Nt:symbols_per_carrier
data=[];
for ii=1:Nt
tx_buf_buf=carrier_matrix(:,tt+ii- 1);
data=[data;tx_buf_buf];
end
XX=zeros(co_time*carrier_count,Nt);
for con_r=1:co_time % space - time encodingfor con_c=1:Nt
if abs(real(O(con_r,con_c)))~=0
if imag(O(con_r,con_c))==0
XX((con_r- 1)*carrier_count+1:con_r*carrier_count,con_c)=data((abs(real(O(con_r,con_c)))- 1)*carrier_count+1:abs(real(O(con_r,con_c)))...
*carrier_count,1)*sign(real(O(con_r,con_c)));
else
XX((con_r- 1)*carrier_count+1:con_r*carrier_count,con_c)=conj(data((abs(real(O(con_r,con_c)))- 1)*carrier_count+1:abs(real(O(con_r,con_c)))...
*carrier_count,1))*sign(real(O(con_r,con_c))); XX=[tx_training_symbols;XX]; % add training sequence rx_buf=zeros(1,addprefix_length*(co_time+1),Nr);
for rev=1:Nr
for ii=1:Nt
tx_buf=reshape(XX(:,ii),carrier_count,co_time+1);
IFFT_tx_buf=zeros(IFFT_bin_length,co_time+1);
IFFT_tx_buf(carriers,:)=tx_buf(1:carrier_count,:);
IFFT_tx_buf(conjugate_carriers,:)=conj(tx_buf(1:carrier_count,:));
time_matrix=ifft(IFFT_tx_buf);
time_matrix=[time_matrix((IFFT_bin_length-cp_length+1):IFFT_bin_length,:); time_matrix]; tx=time_matrix(:)'; % + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % + + + + + + + + + + + + + + + + + + + + + + + + + + + channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % d = randint (1, 4, [1, 7]); %4 multichannel analog %a=randint(1,4,[2,7])/10; tx_tmp=tx; D = [4,5,6,2; 4,5,6,2; 4,5,6,2; 4,5,6,2]; A = [0.2, 0.3, 0.4, 0.5, 0.2, 0.3, 0.4, 0.5, 0.2, 0.3, 0.4, 0.5, 0.2, 0.3, 0.4, 0.5]. for jj=1:size(d,2) copy=zeros(size(tx)) ; for kk = 1 + d(ii,jj): length(tx) copy(kk) = a(ii,jj)*tx(kk - d(ii,jj)) ; end tx_tmp=tx_tmp+copy; end txch=awgn(tx_tmp,SNR,'measured'); % Add gaussian white noise rx_buf(1,:,rev)=rx_buf(1,:,rev)+txch; end %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % + + + + + + + + + + + + + + + + + + + + + + + + + + + receiver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rx_spectrum = reshape (rx_buf (1,:,rev),addprefix_length,co_time+1);
rx_spectrum=rx_spectrum(cp_length+1:addprefix_length,:);
FFT_tx_buf=zeros(IFFT_bin_length,co_time+1);
FFT_tx_buf=fft(rx_spectrum);
spectrum_matrix=FFT_tx_buf(carriers,:);
Y_buf=(spectrum_matrix(:,2:co_time+1));
Y_buf=conj(Y_buf');
spectrum_matrix1=spectrum_matrix(:,1);
Wk=exp((2 -*pi/carrier_count)*i);
L=10;
p=zeros(L*Nt,1);
for jj=1:Nt
for l=0:L- 1
for kk=0:carrier_count- 1
p(l+(jj- 1)*L+1.1)=p(l+(jj- 1)*L+1.1)+spectrum_matrix1(kk+1.1)*conj(tx_training_symbols(kk+1,jj))*Wk^(-(kk*l));
end
end
end
%q=zeros(L*Nt,L*Nt);
%for ii=1:Nt
% for jj=1:Nt
% for l1=0:L- 1
% for l2=0:L- 1
% for kk=0:carrier_count- 1
% q(l2+(ii- 1)*L+1,l1+(jj- 1)*L+1)= q(l2+(ii- 1)*L+1,l1+(jj- 1)*L+1)+tx_training_symbols(kk+1,ii)*conj(tx_training_symbols(kk+1,jj))*Wk^(-(kk*(-l1+l2)));
% end
% end
% end
% end
%end
%h=inv(q)*p;
h=p/carrier_count;
H_buf=zeros(carrier_count,Nt);
for ii=1:Nt
for kk=0:carrier_count- 1
for l=0:L- 1
H_buf(kk+1,ii)=H_buf(kk+1,ii)+h(l+(ii- 1)*L+1.1)*Wk^(kk*l);
end
end
end
Copy the code
3. Operation results
Fourth, note
Version: 2014 a