学习资料:OFDM原理与应用信道估计与均衡.pdf
PSAM 信道估计主要依靠插入在数据流当中的导频信号来完成对信道响应的估计,所以导频信号设置方式的选择对于信道估计( 甚至整个系统)的性能将会有非常大的影响。
以下三种排布方式:梳状、块状、分散
基于 DFT的信道估计算法是在 LS 信道估计算法基础上进行的改进, 它将估计到的信道频域响应通过离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)变换到时域上进行去噪处理, 再变换回频域, 该算法性能好于LS 算法,运算复杂度较低。
但基于 IDFT/DFT 的信道估计算法通常要求在所有载波和保护带中的导频都是均匀排列的,但在通常的 OFDM 系统中,保护带不会放置导频,且当信道同步定时不是很理想时,会出现采样不匹配的情况。
离散余弦变换(DCT)与 DFT 变换相比,将信号能量主要集中在低频部分,有效抑制能量泄漏;同时由于 DCT 变换只涉及到实数运算,它比 DFT 更加迅捷,因而本文将探讨把DCT 引入到信道估计中。
具体参考论文:OFDMA系统中基于LMMSE信道估计算法的改进及其性能分析
以下是OFDM中使用LS算法和DFT算法进行信道估计的实现
clear all;
close all;
fprintf('OFDM信道估计仿真\n\n');
carrier_count=64;%-----------载波数目
num_symbol=50;%--------------OFDM符号个数
Guard=8;%--------------------循环前缀
pilot_Inter=8;%--------------导频间隔
modulation_mode=16;%---------调制方式
SNR=[0:2:20];%-------------信噪比取值
NumLoop=15;%-----------------循环次数
num_bit_err=zeros(length(SNR),NumLoop);
num_bit_err_dft=zeros(length(SNR),NumLoop);
num_bit_err_ls=zeros(length(SNR),NumLoop);
MSE=zeros(length(SNR),NumLoop);
MSE1=zeros(length(SNR),NumLoop);
MSE2=zeros(length(SNR),NumLoop);
%%%%%%%%%%%%%%%%%%%%%%%主程序循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for c1=1:length(SNR)
fprintf('\n\n\n仿真信噪比为%f\n\n',SNR(c1));
for num1=1:NumLoop
%---------------产生发送的随机序列——————————————-
BitsLen=carrier_count*num_symbol;
BitsTx=randi([0 1],1,BitsLen);
%---------------符号调制---------------------------------------
Modulated_Sequence=qammod(BitsTx,modulation_mode);
%---------------导频格式---------------------------------------
pilot_len=carrier_count;
pilot_symbols=round(rand(1,pilot_len));
for i=1:pilot_len
if pilot_symbols(1,i)==0
pilot_symbols(1,i)=pilot_symbols(1,i)-1;
else
pilot_symbols(1,i)=pilot_symbols(1,i);
end
end
pilot_symbols=pilot_symbols';
%----------------计算导频和数据数目----------------------------
num_pilot=ceil(num_symbol/pilot_Inter);
if rem(num_symbol,pilot_Inter)==0
num_pilot=num_pilot+1;
end
num_data=num_symbol+num_pilot;
%----------------导频位置计算----------------------------------
pilot_Indx=zeros(1,num_pilot);
Data_Indx=zeros(1,num_pilot*(pilot_Inter+1));
for i=1:num_pilot-1
pilot_Indx(1,i)=(i-1)*(pilot_Inter+1)+1;
end
pilot_Indx(1,num_pilot)=num_data;
for j=0:num_pilot
Data_Indx(1,(1+j*pilot_Inter):(j+1)*pilot_Inter)=(2+j*(pilot_Inter+1)):((j+1)*(pilot_Inter+1));
end
Data_Indx=Data_Indx(1,1:num_symbol);
%----------------导频插入-------------------------------------
piloted_ofdm_syms=zeros(carrier_count,num_data);
piloted_ofdm_syms(:,Data_Indx)=reshape(Modulated_Sequence,carrier_count,num_symbol);
piloted_ofdm_syms(:,pilot_Indx)=repmat(pilot_symbols,1,num_pilot);
%----------------IFFT变换———————————————————
time_signal=sqrt(carrier_count)*ifft(piloted_ofdm_syms);
%----------------加循环前缀------------------------------------
add_cyclic_signal=[time_signal((carrier_count-Guard+1:carrier_count),:);time_signal];
Tx_data_trans=reshape(add_cyclic_signal,1,(carrier_count+Guard)*num_data);
%----------------信道处理--------------------------------------
Tx_signal_power=sum(abs(Tx_data_trans(:)).^2)/length(Tx_data_trans(:));
noise_var=Tx_signal_power/(10^(SNR(c1)/10));
Rx_data=awgn(Tx_data_trans,SNR(c1),'measured');
%----------------信号接收、去循环前缀、FFT变换-----------------
Rx_signal=reshape(Rx_data,(carrier_count+Guard),num_data);
Rx_signal_matrix=zeros(carrier_count,num_data);
Rx_signal_matrix=Rx_signal(Guard+1:end,:);
Rx_carriers=fft(Rx_signal_matrix)/sqrt(carrier_count);
%----------------导频和数据提取--------------------------------
Rx_pilot=Rx_carriers(:,pilot_Indx);
Rx_fre_data=Rx_carriers(:,Data_Indx);
%----------------导频位置信道响应LS估计------------------------
pilot_patt=repmat(pilot_symbols,1,num_pilot);
pilot_esti=Rx_pilot./pilot_patt;
%----------------LS估计的线性插值———————————————
int_len=pilot_Indx;
len=1:num_data;
for ii=1:carrier_count
channel_H_ls(ii,:)=interp1(int_len,pilot_esti(ii,1:(num_pilot)),len,'linear');
end
channel_H_data_ls=channel_H_ls(:,Data_Indx);
%----------------LS估计中发送数据的估计值----------------------
Tx_data_estimate_ls=Rx_fre_data.*conj(channel_H_data_ls)./(abs(channel_H_data_ls).^2);
%----------------DFT估计--------------------------------------
Tx_pilot_estimate_ifft=ifft(pilot_esti);
padding_zero=zeros(1024,7);
Tx_pilot_estimate_ifft_padding_zero=[Tx_pilot_estimate_ifft;padding_zero];
Tx_pilot_estimate_dft=fft(Tx_pilot_estimate_ifft_padding_zero);
%----------------DFT估计的线性插值———————————————
int_len=pilot_Indx;
len=1:num_data;
for ii=1:carrier_count
channel_H_dft(ii,:)=interp1(int_len,Tx_pilot_estimate_dft(ii,1:(num_pilot)),len,'linear');
end
channel_H_data_dft=channel_H_dft(:,Data_Indx);
%----------------DFT估计中发送数据的估计值----------------------
Tx_data_estimate_dft=Rx_fre_data.*conj(channel_H_data_dft)./(abs(channel_H_data_dft).^2);
%----------------DFT符号解调------------------------------------
demod_in_dft=Tx_data_estimate_dft(:).';
demod_out_dft=qamdemod(demod_in_dft,modulation_mode);
%----------------LS符号解调------------------------------------
demod_in_ls=Tx_data_estimate_ls(:).';
demod_out_ls=qamdemod(demod_in_ls,modulation_mode);
%----------------误码率的计算----------------------------------
for i=1:length(BitsTx)
if demod_out_dft(i)~=BitsTx(i)
num_bit_err_dft(c1,num1)=num_bit_err_dft(c1,num1)+1;
end
if demod_out_ls(i)~=BitsTx(i)
num_bit_err_ls(c1,num1)=num_bit_err_ls(c1,num1)+1;
end
end
end
end
BER_dft=mean(num_bit_err_dft.')/length(BitsTx);
BER_ls=mean(num_bit_err_ls.')/length(BitsTx);
%%%%%%%%%%%%%%%%%%%a%%%%%%%%主程序循环换结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
semilogy(SNR,BER_dft,'-mp',SNR,BER_ls,'-k+');
title('OFDM系统的LS和DFT信道估计');
xlabel('SNR'),ylabel('BER')
legend('LS信道估计','DFT信道估计');
运行结果如下: