?? xixi.m
字號:
%OFDM Channel Estimation
%IFFT_bin_length: IFFT和FFT的點數
%carrier_count: 子載波個數
%bits_per_symbol: 每符號上的比特數
%symbols_per_carrier: 每載波的OFDM符號數
%X:欲發送的二進制比特流
clear all;
clc;
IFFT_bin_length=512; %ifft長度
carrier_count=100; %子載波數
bits_per_symbol=2; %每符號比特數,采用4進制調制
symbols_per_carrier=12; %一楨符號數
LI=7; %導頻之間的間隔
Np=ceil(carrier_count/LI)+1; %導頻數加1的原因:使最后一列也是導頻
N_number=carrier_count*symbols_per_carrier*bits_per_symbol; %一禎比特數
carriers=1:carrier_count+Np; %子載波加導頻
GI=8; % guard interval length
N_snr=40; % 每比特信噪比
snr=8; % 信噪比間隔
%------------------------------------------------------------
% vector initialization
X=zeros(1,N_number); %2400個bit
X1=[];
X2=[];
X3=[];
X4=[];
X5=[];
X6=[];
X7=[];
Y1=[];
Y2=[];
Y3=[];
Y4=[];
Y5=[];
Y6=[];
Y7=[];
XX=zeros(1,N_number); %2400
dif_bit=zeros(1,N_number); %2400
dif_bit1=zeros(1,N_number); %2400
dif_bit2=zeros(1,N_number); %2400
dif_bit3=zeros(1,N_number); %2400
X=randint(1,N_number); %產生二進制隨即序列(非0即1)2400,產生2400個二進制隨即序列
%--------------------------------------------------------
%QPSK調制:(1 1)->pi/4;(0 1)->3*pi/4;(0 0)->-3*pi/4;(1,0)->-pi/4;
s=(X.*2-1)/sqrt(2);
sreal=s(1:2:N_number);
simage=s(2:2:N_number);
X1=sreal+j.*simage; %已調信號bit流,共有1200個已調制隨即序列的輸出。
%---------------------------------------------------------
%產生隨機導頻信號
%--------------------------------------------------------
train_sym=randint(1,2*symbols_per_carrier); %24個隨機數
t=(train_sym.*2-1)/sqrt(2);
treal=t(1:2:2*symbols_per_carrier);
timage=t(2:2:2*symbols_per_carrier);
training_symbols1=treal+j.*timage; % 0.7071 - 0.7071i -0.7071 - 0.7071i -0.7071 - 0.7071i。。。1*12
training_symbols2=training_symbols1.';
training_symbols=repmat(training_symbols2,1,Np); %12*16 復制第一列變成16列
%disp(training_symbols)
pilot=1:LI+1:carrier_count+Np; %導頻插入位置序號1 9 17 25 33 41 49 57 65 73 81 89 97 105 113
if length(pilot)~=Np
pilot=[pilot,carrier_count+Np]; %最后一列變成導頻1 9 17 25 33 41 49 57 65 73 81 89 97 105 113 116
% pilot=[1 9 17 25 33 41 49 57 65 73 81 89 97 105 113 116]
end
%--------------------------------------------------------
%串并轉換
X2=reshape(X1,carrier_count,symbols_per_carrier).'; %12個復信號符號,100列載波
%---------------------------------------------------------
%插入導頻
signal=1:carrier_count+Np; % 1:116
signal(pilot)=[]; % 從1:116中挖去了pilot部分
X3(:,pilot)=training_symbols;
% 將training_symbols的第1列賦給X3矩陣的第1列,把training_symbols的第2列賦給X3矩陣的第9列,依此類推
X3(:,signal)=X2; % 再放入12*100,100列子載波,共12*116
% 所得到的X3就是插入了導頻之后的并且經過串并轉換了的已調制序列。
% X3=cat(1,training_symbols,X2);
FFT_modulation=zeros(symbols_per_carrier,128); %12*128的全0矩陣
FFT_modulation(:,carriers)=X3; %12*128列的矩陣,其中的前116列安放了之前的12*116個數據
FFT_X3=fft(FFT_modulation,128,2);
for i=1:12
inputSamples_ifdma(i,1:4:IFFT_bin_length) = FFT_X3(i,:); % 子載波映射
end
X4=ifft(inputSamples_ifdma,IFFT_bin_length,2); %每個符號512點ifft,最后形成了X4是12*512的經過IFFT之后的矩陣
%加保護間隔(循環前綴)
for k=1:symbols_per_carrier; % 一共有12行,所以要做12次循環
for i=1:IFFT_bin_length;
X6(k,i+GI)=X4(k,i);
end
for i=1:GI;
X6(k,i)=X4(k,i+IFFT_bin_length-GI);
end
end
%---------------------------------------------------------
%并串轉換
X7=reshape(X6.',1,symbols_per_carrier*(IFFT_bin_length+GI));
%12*520先轉置,再變成1*6240復信號流
%---------------------------------------------------------
%信道模型:帶多普勒頻移的瑞利衰落信道
fd=300; %多普勒頻移
r=6; %多徑數
a=[0.123 0.3 0.4 0.5 0.7 0.8]; %多徑的幅度
d=[2 3 4 5 9 13]; %各徑的延遲
T=1; %系統采樣周期
th=[90 0 72 144 216 288]*pi./180; %相移
h=zeros(1,carrier_count); %1*100
hh=[];
for k=1:r %1:6
%deta=[zeros(1,d(k)-1),1,zeros(1,carrier_count-d(k))];
h1=a(k)*exp(j*((2*pi*T*fd*d(k)/carrier_count)));
%h1=a(k)*exp(j*((2*pi*T*fd*d(k)/carrier_count)));
hh=[hh,h1];
end
h(d+1)=hh; % 3 4 5 6 10 14 處有多徑效應
%noise=randn(1,length(X7))+j.*randn(1,length(X7));
%--------------------------------------------------------
channel1=zeros(size(X7)); % 1*1632
channel1(1+d(1):length(X7))=hh(1)*X7(1:length(X7)-d(1));
channel2=zeros(size(X7));
channel2(1+d(2):length(X7))=hh(2)*X7(1:length(X7)-d(2));
channel3=zeros(size(X7));
channel3(1+d(3):length(X7))=hh(3)*X7(1:length(X7)-d(3));
channel4=zeros(size(X7));
channel4(1+d(4):length(X7))=hh(4)*X7(1:length(X7)-d(4));
channel5=zeros(size(X7));
channel5(1+d(5):length(X7))=hh(5)*X7(1:length(X7)-d(5));
channel6=zeros(size(X7));
channel6(1+d(6):length(X7))=hh(6)*X7(1:length(X7)-d(6));
%---------------------------------------------------------------
Tx_data=X7+channel1+channel2+channel3+channel4; %4徑干擾后的數據流1*1632
%---------------------------------------------------------------
%---------------------------------------------------------------
%----------------------------------------------------------------
%加高斯白噪聲
Error_ber=[]; %誤比特率
Error_ber1=[];
Error_ber2=[]; %誤比特率
Error_ber3=[];
%Error_ser=[]; %誤符號率
for snr_db=0:snr:N_snr %0:8:40共6個數
code_power=0;
code_power=[norm(Tx_data)]^2/(length(Tx_data)); %信號的符號功率
%bit_power=var(Tx_data);
bit_power=code_power/bits_per_symbol; %比特功率
noise_power=10*log10((bit_power/(10^(snr_db/10)))); %噪聲功率
noise=wgn(1,length(Tx_data),noise_power,'complex'); %產生GAUSS白噪聲信號
Y7=Tx_data+noise;
%-------------------------------------------------------
%串并變換
Y6=reshape(Y7,IFFT_bin_length+GI,symbols_per_carrier).';%先變成520*12,再轉置成12*520,恢復成行為符號,列為載波
%去保護間隔
for k=1:symbols_per_carrier;
for i=1:IFFT_bin_length;
Y5(k,i)=Y6(k,i+GI);
end
end
Y4 = fft(Y5,IFFT_bin_length,2); % 每行的符號進行512點fft 12*512
for j=1:12
Y4_1(j,:) = Y4(j,1:4:IFFT_bin_length); % 恢復子載波映射 Y3是12*128的矩陣
end
Y3_1 = ifft(Y4_1,128,2); % 對12*128的矩陣對每行的IFFT
Y3 = Y3_1(:,1:116);
%-------------------------------------------------------------
%LS信道估計
%H=[];
Y2=Y3(:,signal); % 將全部的數據列取出來,一共是12行100列
Rx_training_symbols=Y3(:,pilot);
length(Rx_training_symbols)
%上述兩條語句就是將信息序列的位置和訓練導頻序列的位置進行了分離
Rx_training_symbols0=reshape(Rx_training_symbols,symbols_per_carrier*Np,1);
training_symbol0=reshape(training_symbols,1,symbols_per_carrier*Np);
training_symbol1=diag(training_symbol0);
%disp(training_symbols)
training_symbol2=inv(training_symbol1); % 求逆矩陣
Hls=training_symbol2*Rx_training_symbols0;
Hls1=reshape(Hls,symbols_per_carrier,Np); % 12行16列
% 生成的導頻的個數是12個,然后復制了16份,總共為12*16個
% 所以估計出的信道的長度就是12*16,但是總共的數據長度是12*100
% 所以如果從受到干擾的數據中恢復出原始數據,需要把信道矩陣的數據數量擴大
%------------------------------------------------------------------------
%基于DFT信道估計
Hls2=ifftn(Hls1); % 對剛才已經生成的12*16的信道估計矩陣做IFFT變換
for i=1:100 % 將信道估計矩陣擴展到12行100列
if((i>=1)&&(i<=16))
Hls3(:,i)=Hls2(:,i);
else
Hls3(:,i)=0;
end
end
Hls4=fftn(Hls3); % 對這個信道估計矩陣的擴展重新做FFT變換,變成了12行100列的信道估計矩陣
Y13=Y2./Hls4; % 用接受到的數據矩陣除以12*100的信道估計矩陣得到數據
%-----------------------------
HLs00=[];
HLs01=[];
HLs1=[];
HLs6=[];
if ceil(carrier_count/LI)==carrier_count/LI
for k=1:Np-1
HLs2=[];
HLs7=[];
for t=1:LI
HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);
HLs2=[HLs2,HLs1];
HLs6(:,1)=Hls1(:,k);
HLs7=[HLs7,HLs6];
end
HLs00=[HLs00,HLs2];
HLs01=[HLs01,HLs7];
end
else
for k=1:Np-2 % k=1:14
HLs2=[];
HLs7=[];
for t=1:LI % t=1:7
HLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);
HLs2=[HLs2,HLs1];
HLs6(:,1)=Hls1(:,k);
HLs7=[HLs7,HLs6];
end
HLs00=[HLs00,HLs2];
HLs01=[HLs01,HLs7]
end
HLs3=[];
HLs8=[];
for t=1:mod(carrier_count,LI)
HLs1(:,1)=(Hls1(:,Np)-Hls1(:,Np-1))*(t-1)./LI+Hls1(:,Np-1);
HLs3=[HLs3,HLs1];
HLs6(:,1)=Hls1(:,Np-1);
HLs8=[HLs8,HLs6];
end;
HLs00=[HLs00,HLs3];
HLs01=[HLs01,HLs8];
end
%Hls1=Hls.';
%H=repmat(Hls1,symbols_per_carrier,1);%將導頻擴展成symbols_per_carrier*carrier_count矩陣
Y11=Y2./HLs00;
Y12=Y2./HLs01;
%-------------------------------------------------------------
%并串變換
YY=reshape(Y13.',1,N_number/bits_per_symbol);
YY1=reshape(Y11.',1,N_number/bits_per_symbol);
YY2=reshape(Y12.',1,N_number/bits_per_symbol);
%------------------------------------------------------------
%QPSK解調
y_real=sign(real(YY));
y_image=sign(imag(YY));
y_re=y_real./sqrt(2);
y_im=y_image./sqrt(2);
y_real1=sign(real(YY1));
y_image1=sign(imag(YY1));
y_re1=y_real1./sqrt(2);
y_im1=y_image1./sqrt(2);
y_real2=sign(real(YY2));
y_image2=sign(imag(YY2));
y_re2=y_real2./sqrt(2);
y_im2=y_image2./sqrt(2);
r000=[];
r001=[];
r010=[];
r011=[];
r100=[];
r101=[];
for k=1:length(y_real);
r000=[r000,[y_real(k),y_image(k)]];
end;
for k=1:length(y_real1);
r001=[r001,[y_real1(k),y_image1(k)]];
end;
for k=1:length(y_real2);
r010=[r010,[y_real2(k),y_image2(k)]];
end;
for k=1:length(y_re);
r011=[r011,[y_re(k),y_im(k)]];
end;
for k=1:length(y_re1);
r100=[r100,[y_re1(k),y_im1(k)]];
end;
for k=1:length(y_re2);
r101=[r101,[y_re2(k),y_im2(k)]];
end
XX(find(r011>0))=1;
%-------------------------------------------------------------
%計算在不同信噪比下的誤比特率并作圖
dif_bit=s-r011;
dif_bit1=s-r100;
dif_bit2=s-r101;
ber_snr=0; %紀錄誤比特數
for k=1:N_number;
if dif_bit(k)~=0;
ber_snr=ber_snr+1;
end
end;
ber_snr1=0; %紀錄誤比特數
for k=1:N_number;
if dif_bit1(k)~=0;
ber_snr1=ber_snr1+1;
end
end
ber_snr2=0;
for k=1:N_number;
if dif_bit2(k)~=0;
ber_snr2=ber_snr2+1;
end
end
Error_ber=[Error_ber,ber_snr];
Error_ber1=[Error_ber1,ber_snr1];
Error_ber2=[Error_ber2,ber_snr2];
end
BER=zeros(1,length(0:snr:N_snr));
BER1=zeros(1,length(0:snr:N_snr));
BER2=zeros(1,length(0:snr:N_snr));
BER=Error_ber./N_number;
BER1=Error_ber1./N_number;
BER2=Error_ber2./N_number;
%-------------------------------------------------------------
%-------------------------------------------------------------
i=0:snr:N_snr;
semilogy(i,BER,'-*r');
hold on;
semilogy(i,BER1,'-^b');
hold on;
semilogy(i,BER2,'-ok');
grid on;
ylabel('BER');xlabel('信噪比/dB');
legend('DFT','線性內插','常值內插');
hold
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -