⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dft_ofdm.m

📁 OFDM+信道估计(DFT)单一文档
💻 M
字号:
%基于DFT的OFDM系统的信道估计
clear all;
close all;
tic;
%------------参数估计------------------%
carrier_count=200;        %子载波数是200个
bits_per_symbol=4;        %每符号有4个比特,采用的是16QAM调制方式
symbols_per_carrier=50;   %每个子载波有50个符号
loop=5;                   %循环次数为5次
num=5;                    %训练符号数
SNR=0:2:30;               %输入信噪比参数
for m=1:length(SNR)
    for t=1:loop
baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;

%-----------发射信号------------------%
baseband_out=round(rand(1,baseband_out_length));     %发射1*length的伪随机序列


%----------QAM调制--------------------%
convert_matrix=reshape(baseband_out,bits_per_symbol,length(baseband_out)/bits_per_symbol);   %矩阵的转化
for k=1:length(baseband_out)/bits_per_symbol
    modulo_baseband(k)=0;
  for i=1:bits_per_symbol
      modulo_baseband(k)=modulo_baseband(k)+convert_matrix(i,k)*2^(bits_per_symbol - i);
     end
end
complex_carrier_matrix=qammod(modulo_baseband,2^bits_per_symbol);
complex_carrier_matrix=reshape(complex_carrier_matrix,carrier_count,symbols_per_carrier);

%---添加训练序列,块状加入导频,每隔10列加一个导频块-------%
training_symbol=[1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1  -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ...
    1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ...
    1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ...
    1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 ...
    1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1 1 j j 1 -1 -j -j -1]';
complex_carrier=zeros(carrier_count,num+symbols_per_carrier);
for i=1:num
    complex_carrier(:,10*(i-1)+i)=training_symbol;
    complex_carrier(:,10*(i-1)+i+1:10*(i-1)+i+1+9)=complex_carrier_matrix(:,10*(i-1)+1:10*i);
end

%------------过采样,每个符号插入200个0-----------------%
IFFT_modulation=zeros(2*carrier_count,num+symbols_per_carrier);
f_num=1:carrier_count/2;
b_num=2*carrier_count-carrier_count/2+1:2*carrier_count;
IFFT_modulation(f_num,:)=complex_carrier(f_num,:);
IFFT_modulation(b_num,:)=complex_carrier(f_num+carrier_count/2,:);

%-----------IFFT变化------------------------------%
time_wave_matrix=ifft(IFFT_modulation);

%----------加CP-----------------------------------%
time_wave_matrix_cp=zeros(2*carrier_count+carrier_count/2,num+symbols_per_carrier);
f_num_cp=1:carrier_count/2;
b_num_cp=carrier_count/2+1:2*carrier_count+carrier_count/2;
time_wave_matrix_cp(f_num_cp,:)=time_wave_matrix((2*carrier_count-carrier_count/2+1):2*carrier_count,:);
time_wave_matrix_cp(b_num_cp,:)=time_wave_matrix(1:2*carrier_count,:);

%-----------并串转化--------------%
ofdm_modulation=reshape(time_wave_matrix_cp,1,(2*carrier_count+carrier_count/2)*(num+symbols_per_carrier));
tx_data=ofdm_modulation;
figure(1);
xlabel('SNR/db');
ylabel('ber');
title('发射信号的频谱图');
freqz(tx_data);

%----------信道模拟(多径瑞利信道)---------%
num=5;
    %假设功率延迟谱服从负指数分布~exp(-t/trms),trms=(1/4)*cp时长;
    %t在0~cp时长上均匀分布
    %若cp时长为16e-6s,可以取5径延迟如下
    delay=[0 2e-6 4e-6 8e-6 12e-6];
    trms=4e-6;
    var_pow=10*log10(exp(-delay/trms));
    fd=132;%最大doppler频率为132Hz
    t_interval=1e-6;%采样间隔为1us
    counter=200000;%各径信道的采样点间隔,应该大于信道采样点数。由以上条件现在信道采样点数
    count_begin=(t-1)*(5*counter);%每次仿真信道采样的开始位置
    trms_1=trms/t_interval;
    t_max=16e-6/t_interval;
    %信道采样点数,每个调制符号采一个点
    passchan_ofdm_symbol=multipath_chann(tx_data,num,var_pow,delay,fd,t_interval,counter,count_begin);
    
  %----------以上是经过多径频率选择性信道---------%
  
  
  %---------------信号接收-----------------%
  Rx_data=passchan_ofdm_symbol;
  
  
  %-------------串并转化-----------------%
  Rx_data_matrix=reshape(Rx_data,2*carrier_count+carrier_count/2,num+symbols_per_carrier);
  
    %-------------去CP---------------------%
    Rx_data_cp=zeros(2*carrier_count,num + symbols_per_carrier);
    Rx_data_cp(1:2*carrier_count,:)=Rx_data_matrix(carrier_count/2+1:carrier_count/2+2*carrier_count,:);
  
  %---------------FFT变化----------------%
  fft_Rx_data_cp=fft(Rx_data_cp);
  
  %-------------去零(把过采样加进去的0去掉)-----------%
  Rx_data1=zeros(carrier_count,num+symbols_per_carrier);
  Rx_data1(f_num,:)=fft_Rx_data_cp(f_num,:);
  Rx_data1(carrier_count/2+1:carrier_count,:)=fft_Rx_data_cp(b_num,:);
  
  %-----------信道估计(DFT)-------------%
  Rx_carrier_dft=zeros(carrier_count,symbols_per_carrier);
  for i=1:num;
     Rx_training_symbol_dft=Rx_data1(:,10*(i-1)+i);
     Rx_training_symbol_dft=Rx_training_symbol_dft./training_symbol;
     Rx_symbols_dft=ifft(Rx_training_symbol_dft);
     Rx_symbols_ifft_dft=zeros(carrier_count,1);
    Rx_symbols_ifft_dft(1:carrier_count/2,:)=Rx_symbols_dft(1:carrier_count/2,:);% 只保留循环前缀长度以内的信道估计值,将循环前缀长度以为的信道估计值置为0
    Rx_training_symbols_dft=fft(Rx_symbols_ifft_dft);
    %---------------------------------------------%
    
    
    Rx_training_symbols_2_dft=cat(2,Rx_training_symbols_dft,Rx_training_symbols_dft);
    Rx_training_symbols_4_dft=cat(2,Rx_training_symbols_2_dft,Rx_training_symbols_2_dft);
    Rx_training_symbols_8_dft=cat(2,Rx_training_symbols_4_dft,Rx_training_symbols_4_dft);
   Rx_training_symbols_10_dft=cat(2,Rx_training_symbols_8_dft,Rx_training_symbols_2_dft);
    
   Rx_data1(:,10*(i-1)+i+1:10*(i-1)+i+1+9)=Rx_data1(:,10*(i-1)+i+1:10*(i-1)+i+1+9)./Rx_training_symbols_10_dft;
   Rx_carriers_dft(:,10*(i-1)+1:10*i)=Rx_data1(:,10*(i-1)+i+1:10*(i-1)+i+1+9);   
end
Rx_dft=reshape(Rx_carriers_dft,1,carrier_count*symbols_per_carrier);
  
 
    %------------QAM解调-----------------%
  Rx_decoded_symbols =qamdemod(Rx_dft,2^bits_per_symbol) ;
for i = bits_per_symbol: -1: 1
    if i ~= 1
      Rx_binary_matrix(i, : ) = rem(Rx_decoded_symbols, 2) ;
      Rx_decoded_symbols = floor(Rx_decoded_symbols/2) ;
    else
      Rx_binary_matrix( i, : ) = Rx_decoded_symbols;
    end
end
baseband_in_dft = reshape(Rx_binary_matrix, 1,size(Rx_binary_matrix, 1)*size(Rx_binary_matrix, 2) ) ;
  
 bit_errors_dft = find(baseband_in_dft ~= baseband_out) ;
bit_error_count_dft(t,m) = size(bit_errors_dft, 2) ;
  end;
total_bits = size( baseband_out, 2)*loop ;
bit_error_rate(m) = sum(bit_error_count_dft(:,m))/ total_bits;
end;
figure(2);
semilogy(SNR,bit_error_rate,'g*-');
%semilogy(SNR,bit_error_rate,'*-',SNR,bit_error_rate_dft,'.-',SNR,bit_error_rate_dft1,'^-',SNR,bit_error_rate2,'+-');
xlabel('SNR/dB');ylabel('ber');
title('多径信道下采用不同信道估计时的误比特率曲线');
legend('DFT信道估计');
%legend('LS信道估计','基于DFT的信道估计','改进的基于DFT的信道估计','不进行信道估计');
grid on;
toc;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -