【学习笔记】OFDM中信道估计技术分析与实现

目录

  • 一、信道估计概念
  • 二、信道估计作用
  • 三、相干检测与非相干检测
    • (一)非相干检测
    • (二)相干检测
    • (三)注意
  • 四、影响信道估计算法性能的重要因素
  • 五、信道估计方法的划分
    • (一)根据处理域的不同, OFDM 信道估计有时域和频域之分
    • (二)根据利用的信道估计资源不同, OFDM 信道估计又可以分成下面三类
  • 六、 PSAM 信道估计主要包括三方面的内容
    • (一) 导频图案的选择
    • (二)导频所处位置信道响应的估计
      • 1. 小二乘算法(Least Squares,LS)
      • 2. 离散傅里叶算法(Discrete Fourier Transform,DFT)
      • 3. 离散余弦变换算法(Discrete Cosine Transform,DCT)
      • 4. 最小均方算法(Least Mean Square Algorithm,LMS)
      • 5. 线性最小均方误差估计(Linear minimum mean square error,LMMSE)
    • (三) 基于内插的完整信道估计
  • 七、OFDM中的实现

学习资料:OFDM原理与应用信道估计与均衡.pdf

一、信道估计概念

  • 数字信号在实际信道上传输时, 由于信道传输特性的不理想以及信道噪声的影响,接收端接收到的信号不可避免地会发生错误。为了恢复发送的数据信息,接收端需要估计出信道的特性,并对接收到的数据进行校正
  • 如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。
    【学习笔记】OFDM中信道估计技术分析与实现_第1张图片
基于小二乘信道估计的OFDM结构图

二、信道估计作用

  • 信道估计的目的就是估计信道的时域或频域响应,对接收到的数据进行校正和恢复,以获得相干检测的性能增益(可达 3dB)
  • 相干OFDM系统的接收端使用相干检测技术,系统需要知道信道状态信息CSI(Channel State Information)以对接收信号进行信道均衡,从而信道估计成为系统接收端一个重要的环节。在具有多个发射天线的系统中,如果系统发射端使用了空时编码,接收端进行空时译码时,需要知道每一对发射天线与接收天线之间的CSI。而CSI可以通过信道估计获得。

三、相干检测与非相干检测

(一)非相干检测

  1. 非相干检测利用差分调制技术实现。差分检测比较相邻两个信号的相位和幅度的差值。
  2. 非相干OFDM:
    如果发射端使用差分编码,传输的信息调制到子载波间的变化中,接收端可以使用不需要信道状态信息CSI(Channel State Information)便能够完成解调的非相干差分解调技术,系统接收端可以得到一定的简化。
    这种方法的最大优点是接收端不需要知道CSI,因此接收机比较简单。其缺点是与相干OFDM系统相比,系统的传输性能要降低3-4dB。

(二)相干检测

  1. 相干检测通过信道估计得到 OFDM 符号子载波的绝对参考相位和幅度。
  2. 相干OFDM:
    相干OFDM系统发射端可以使用频谱效率更高的QAM技术。相干OFDM系统的接收端使用相干检测技术,系统需要知道CSI以对接收信号进行信道均衡,从而信道估计成为系统接收端一个重要的环节。
    虽然相干OFDM系统需要知道CSI才能解调而使接收机变得复杂,但获得了更好的系统传输效率和性能,所以,在无线通信应用中,通信系统还是使用相干OFDM系统。

(三)注意

  • 非相干检测不需要信道估计,因此也没有导频开销。
  • 相干检测的性能要优于非相干检测( 3dB),因为相干检测利用训练序列估计参考相位和幅度,不受(发送波形)相位改变的影响。
  • 差分检测方法比较适合于较低传输速率的 OFDM 系统,而对于要求更高的传输速率和频谱效率的 OFDM 系统,相干检测更合适。

四、影响信道估计算法性能的重要因素

  1. 信道的最大时延
  2. 用户的移动速度
  3. 接收机的噪声
  4. 导频插入方式

五、信道估计方法的划分

(一)根据处理域的不同, OFDM 信道估计有时域和频域之分

  1. 时域估计方法:在 FFT 之前进行,估计信道的冲激响应;
  2. 频域估计方法:在 FFT 之后进行,估计信道的频率响应;
  3. 时域和频域联合估计:充分挖掘信号时域处理和频域处理各自的优点。

(二)根据利用的信道估计资源不同, OFDM 信道估计又可以分成下面三类

  1. 基于判决的信道估计( decision direct)
  2. 导频辅助信道估计( pilot symbol assisted modulation, PSAM)信道估计。以下将会详细介绍此类。
  3. 盲/半盲信道估计。

六、 PSAM 信道估计主要包括三方面的内容

(一) 导频图案的选择

PSAM 信道估计主要依靠插入在数据流当中的导频信号来完成对信道响应的估计,所以导频信号设置方式的选择对于信道估计( 甚至整个系统)的性能将会有非常大的影响。
以下三种排布方式:梳状、块状、分散
【学习笔记】OFDM中信道估计技术分析与实现_第2张图片

(二)导频所处位置信道响应的估计

1. 小二乘算法(Least Squares,LS)

  • LS 算法是最简单的信道估计方法,它无法消除噪声的影响,误差较大。
  • 只需要知道发送的导频信号 XP 和接收到的导频符号 YP 即可 ,这种方法也是 OFDM 系统基于导频的信道估计算法的基础。

2. 离散傅里叶算法(Discrete Fourier Transform,DFT)

  • 基于 DFT的信道估计算法是在 LS 信道估计算法基础上进行的改进, 它将估计到的信道频域响应通过离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)变换到时域上进行去噪处理, 再变换回频域, 该算法性能好于LS 算法,运算复杂度较低。

  • 但基于 IDFT/DFT 的信道估计算法通常要求在所有载波和保护带中的导频都是均匀排列的,但在通常的 OFDM 系统中,保护带不会放置导频,且当信道同步定时不是很理想时,会出现采样不匹配的情况。

3. 离散余弦变换算法(Discrete Cosine Transform,DCT)

离散余弦变换(DCT)与 DFT 变换相比,将信号能量主要集中在低频部分,有效抑制能量泄漏;同时由于 DCT 变换只涉及到实数运算,它比 DFT 更加迅捷,因而本文将探讨把DCT 引入到信道估计中。

4. 最小均方算法(Least Mean Square Algorithm,LMS)

  • 概念:最小均方算法,简称LMS算法,是一种最陡下降算法的改进算法, 是在维纳滤波理论上运用速下降法后的优化延伸,最早是由 Widrow 和 Hoff 提出来的。 该算法不需要已知输入信号和期望信号的统计特征,“当前时刻”的权系数是通过“上一 时刻”权系数再加上一个负均方误差梯度的比例项求得。 其具有计算复杂程度低、在信号为平稳信号的环境中收敛性好、其期望值无偏地收敛到维纳解和利用有限精度实现算法时的平稳性等特性,使LMS算法成为自适应算法中稳定性最好、应用最广的算法。
  • 算法思想:主要在增加很少运算量的情况下能够加速其收敛速度,这样在自适应均衡的时候就可以很快的跟踪到信道的参数,减少了训练序列的发送时间,从而提高了信道的利用率

5. 线性最小均方误差估计(Linear minimum mean square error,LMMSE)

具体参考论文:OFDMA系统中基于LMMSE信道估计算法的改进及其性能分析

  • LMMSE 信道估计是最优的线性估计器[2~5] , 它本质是用信道的自相关矩阵对 LS 信道估计进行修正 , 抑制噪声对估计值的影响. 采用 LMMSE 算法精度高 ,估计性能好 ,但是需要利用每条子路径的功率及延迟等先验知识构造一个信道自相关矩阵 ,运算量较大且在实际系
    统中不易获得。
  • LMMSE 算法对于子载波间干扰和高斯白噪声有很好的抑制作用,其效果好于 LS 算法,但 LMMSE 算法需要知道信道的先验知识,且其运算复杂度较高。

(三) 基于内插的完整信道估计

  1. 维纳滤波方法
  2. 线性内插
  3. 高斯内插
  4. Cubic 内插
  5. 拉格朗日内插

七、OFDM中的实现

以下是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信道估计');

运行结果如下:

【学习笔记】OFDM中信道估计技术分析与实现_第3张图片

你可能感兴趣的:(信号处理,matlab,信道估计,通信,OFDM)