基于OMP算法的MIMO-OFDM信道估计

RF/无线

1773人已加入

描述

我们知道,对于OFDM系统,只要不发生载波间扰(ICI),即能够保持子波之间的正交性,就能将每一个子载波看做独立的信道。

这种正交性使得接收信号的每个子载波分量可以被表示成发射信号与子载波的信道频率响应的乘积。因此,仅通过估计每个子载波的信道响应就可以恢复发射信号。

总的来说,可以使用发射机和接收机都已知的导频 (Pilot)符号进行信道估计,并且可以利用不同的插值技术来估计导频之间的子载波上的信道响应。

选择 OFDM 系统的信道估计技术时,必须考虑许多系统实现方面的问题,包括性能需求、计算复杂度和信道时变特性。

常用的信道估计方法有LS估计、LS-DFT估计、MMSE估计、OMP估计等。

在多输入多输出正交频分复用(MIMO-OFDM)系统中,相干检测和均衡需要接收端的信道状态信息(CSI)。然而,在真实的无线环境中,CSI是未知的。因此,信道估计在MIMO-OFDM系统中至关重要。

为简便起见,一般将导频辅助MIMO-OFDM信道估计分解为多个SISO-OFDM信道的同时估计。为了获得更好的信道估计性能,当第i个天线发送导频符号时,所有其他天线必须保持静默。

其中,

是导频位置的集合。

本文考虑了一个具有两个发射天线和两个接收天线的MIMO系统,并利用带有QR分解的OMP算法对MIMO-OFDM信道进行了估计。

OMP算法

设为信道系数的估计值。为非零信道系数的指示集合,为残差,并且,为是测量矩阵的列,是迭代次数。步骤如下。

算法1:OMP算法

Step1:初始化

Step2:通过选择与残差

Step3: 将新选择的索引与索引做并集

Step4:对做QR分解

Step5:计算新的残差

Step6:如果,回到Step2。

Step7: 用反代法求解,得到的k个非零系数。OMP以测量矩阵θ和测量向量y作为输入。在第一次迭代中,选择测量矩阵中与测量向量相关性最大的一列,对其进行QR分解。残差被更新并用于下一次迭代。从第二次迭代开始,选择与残差相关性最大的测量矩阵的列。最后经过K次迭代得到θ的正确列集。在θ上进行QR分解,得到最终的Q和R,然后使用Q, R和y作为反代入的输入得到。QR分解使用改进的Gram-Schmidt正交化进行。

算法2:QR分解

Step1:设

Step2:对,进行循环

Step3:对,进行循环

end for

end for

算法3:回代法

Step1:设,且

Step2:对,进行循环

MIMO-OFDM信道估计以2 × 2 MIMO-OFDM信道估计为例,该信道估计分解为4个SISO-OFDM信道,,,和,同时进行估计。

下列MIMO-OFDM系统的仿真参数为:

发射机数量(NT) = 2

接收器数量(NR) = 2

FFT点数量(N_fft) = 512;

每个发射天线导频数(N_P) = 128;

循环前缀长度(N_g) = 64;

信道抽头数(L) = 64;

非零信道系数数(S) = 16;

使用的调制方式:16-QAM

编写并执行下面的MATLAB程来估计2×2 MIMO-OFDM信道。2×2 MIMO-OFDM信道估计的Eb/N0与归一化均方误差(NMSE)如图所示。

ofdm

从图中可以看出,2 × 2 MIMO-OFDM信道估计,OMP算法性能上优于LS估计。当然若从硬件实现角度看,则OMP算法复杂度更高,耗时更长。

注意,在实际通信系统中,需要根据实际应用场景的信道环境,设计所需的波形,选择合适的信道估计方法。

部分示例代码:

 

 

% Program to compute BER performance of OFDM in sparse Rayleigh fading channel


close all; clear ;clc;




N_fft=512; N_g=64;%N_fft/8;
N_ofdm=N_fft+N_g;
N_sym=100;N_ps=8;
N_p=N_fft/N_ps; N_d=N_fft-N_p; % Pilot spacing, Numbers of pilots and data per OFDM symbol
N_bps=4; M=2^N_bps; % Number of bits per (modulated) symbol
Es=1; A=sqrt(3/2/(M-1)*Es); % Signal energy& QAM normalization factor
EbN0s = [-520];


for i=1:length(EbN0s)
    EbN0 = EbN0s(i); 
    % randn('seed',1)
    rng('default');
    NMSE_OMPi=0;
    NMSE_LSi=0;
    for nsym=1:N_sym
        X_p1= 2*(randn(1,N_p)>0)-1; % Pilot sequence generation
        msg_int=randi(1,N_fft-N_p,M); % bit generation
          Data = qammod(msg_int,M)*A; %QAM Modulated symbols
        ip1 = 0; pilot_loc1 = [];
            for k=1:N_fft
                if mod(k,N_ps)==1
                    X1(k) = X_p1(floor(k/N_ps)+1); 
                    pilot_loc1 = [pilot_loc1 k]; 


                    ip1 = ip1+1;
                else
                    X1(k) = Data(k-ip1);
                end
            end


            X_p2= 2*(randn(1,N_p)>0)-1; % Pilot sequence generation
            ip2 = 0;
            pilot_loc2 = [];
            for k=1:N_fft
                if mod(k,N_ps)==1
                    X2(k) = X_p2(floor(k/N_ps)+1);
                    pilot_loc2 = [pilot_loc2 k]; 
                    ip2 = ip2+1;
                else
                    X2(k) = Data(k-ip2);
                end
            end
        x1 = ifft(X1,N_fft); % IFFT
        xt1 = [x1(N_fft-N_g+1:N_fft) x1]; % Add CP
        x2 = ifft(X2,N_fft); % IFFT
        xt2 = [x2(N_fft-N_g+1:N_fft) x2]; % Add CP
        L = 64; %Total number of channel taps
        K =7; % non-zero channel taps
        T = randperm(L);T = T(1:K);
        h11 = zeros(L,1);
        h11(T) = randn(K,1) + 1i*randn(K,1);
        H11= fft(h11',N_fft); 
        channel_length = length(h11); 
        y_channel11 = conv(xt1, h11'); % Channel path (convolution) 
        h12 = zeros(L,1);
        T = randperm(L);T = T(1:K);
        h12(T) = randn(K,1) + 1i*randn(K,1);
        H12= fft(h12',N_fft); channel_length = length(h12); y_channel12= conv(xt1, h12'); % Channel path (convolution)
        h21 = zeros(L,1);T = randperm(L);T = T(1:K);h21(T) = randn(K,1) + 1i*randn(K,1);
        H21= fft(h21',N_fft); channel_length = length(h12); y_channel21 = conv(xt2, h21'); % Channel path (convolution)
        h22 = zeros(L,1);T = randperm(L);T = T(1:K);
        h22(T) = randn(K,1) + 1i*randn(K,1);
        H22= fft(h22',N_fft); channel_length = length(h22);


        y_channel22 = conv(xt2, h22'); % Channel path (convolution)
        yt11= awgn(y_channel11,EbN0,'measured'); %awgn noise added
        y11 = yt11(N_g+1:N_ofdm); % Remove CP
        Y11 = fft(y11); % FFT
        yt12= awgn(y_channel12,EbN0,'measured'); %awgn noise added 
        y12 = yt12(N_g+1:N_ofdm); % Remove CP
        Y12 = fft(y12); % FF
        yt21= awgn(y_channel21,EbN0,'measured'); %awgn noise added
        y21 = yt21(N_g+1:N_ofdm); % Remove CP
        Y21 = fft(y21); % FFT
        yt22= awgn(y_channel22,EbN0,'measured'); %awgn noise added
        y22 = yt22(N_g+1:N_ofdm); % Remove CP
        Y22 = fft(y22); % FFT


        k=1:N_p; Est_LSH11(k) = Y11(pilot_loc1(k))./X_p1(k);
        k=1:N_p; Est_LSH12(k) = Y12(pilot_loc1(k))./X_p1(k);
        k=1:N_p; Est_LSH21(k) = Y21(pilot_loc2(k))./X_p2(k);
        k=1:N_p; Est_LSH22(k) = Y22(pilot_loc2(k))./X_p2(k);
        Xp1=diag(X1(pilot_loc1));Xp2=diag(X2(pilot_loc2));
        yps11=Y11(pilot_loc1); yps12=Y12(pilot_loc1);
        yps21=Y21(pilot_loc2);
        yps22=Y22(pilot_loc2);


            for ii=1:N_p
                ypss11(ii,1)=yps11(ii); ypss12(ii,1)=yps12(ii); 
                ypss21(ii,1)=yps21(ii); ypss22(ii,1)=yps22(ii); 
            end
            xq=1:N_fft;
        % Est_HLS11 = interpolate(Est_LSH11,pilot_loc1,N_fft,'linear');
        Est_HLS11 = interp1(pilot_loc1,Est_LSH11,xq,'linear');
        h_estLS11 = ifft(Est_HLS11,L); 
        % Est_HLS12 = interpolate(Est_LSH12,pilot_loc1,N_fft,'linear');
        Est_HLS12 = interp1(pilot_loc1,Est_LSH12,xq,'linear');
        h_estLS12 = ifft(Est_HLS12,L); 
        % Est_HLS21 = interpolate(Est_LSH21,pilot_loc2,N_fft,'linear');
        Est_HLS21 = interp1(pilot_loc2,Est_LSH21,xq,'linear');
        h_estLS21 = ifft(Est_HLS21,L); 
        % Est_HLS22 = interpolate(Est_LSH22,pilot_loc2,N_fft,'linear');
        Est_HLS22 = interp1(pilot_loc2,Est_LSH22,xq,'linear');
        h_estLS22 = ifft(Est_HLS22,L); 


        W =exp(-1j*2*pi/N_fft*[0:N_fft-1]'*[0:N_fft-1]);
        WW=W(1N_fft,1:L); %sub dft matrix
        AA1=diag(X_p1)*WW; 
        AA2=diag(X_p2)*WW;


        homp11=ompgs(ypss11,AA1,K); homp12=ompgs(ypss12,AA1,K);
        homp21=ompgs(ypss21,AA2,K); homp22=ompgs(ypss22,AA2,K);
        H_org=[h11 h12 h21 h22];
        H_omp=[ homp11; homp12; homp21; homp22];
        H_LS=[h_estLS11;h_estLS12;h_estLS21;h_estLS22];
        NMSE_OMPi= NMSE_OMPi+ (norm(H_org-H_omp')/norm(H_org));
        NMSE_LSi= NMSE_LSi+ (norm(H_org-H_LS')/norm(H_org));
    end


    NMSE_OMP(i)=NMSE_OMPi;
    NMSE_LS(i)=NMSE_LSi;
end
NMSE_LS=NMSE_LS/(N_fft*N_sym);
NMSE_OMP=NMSE_OMP/(N_fft*N_sym);
figure, semilogy(EbN0s',NMSE_LS,'-x', EbN0s',NMSE_OMP,'-s')
xlabel ('Eb/N0 (dB)') ;ylabel ( 'NMSE');legend('LS','OMP');
title(' BER performance of OFDM ');
 编辑:黄飞

 

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分