📄 dft_ofdm.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 + -