【MIMO OFDM LSE信道估计】考虑了MIMO OFDM系统的最小二乘误差信道估计研究(Matlab代码实现)

  💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

参考文献:

移动无线信道中MIMO OFDM系统的最佳训练设计

摘要:本文介绍了一种基于训练音的线性最小二乘(LS)信道估计算法,用于多输入多输出(MIMO)正交频分复用(OFDM)系统。首先,我们计算了LS信道估计的均方误差(MSE)。然后,我们推导出了针对该MSE的最优训练序列和训练音的放置位置。研究表明,最优的训练序列是等功率、等间隔和相位移正交的。为了减少训练开销,本文还讨论了跨多个OFDM符号的LS信道估计算法。此外,为了提高信道估计的精度,提出了一种递归最小二乘(RLS)算法,并推导出了最优的遗忘因子或跟踪因子。这个因子被发现是噪声方差和信道多普勒展宽的函数。通过仿真,我们证明了本文推导出的最优训练序列优于正交和随机训练序列。此外,还表明,特别是在缓慢变化的信道中,使用RLS算法可以获得显著的信号噪声比(SNR)增益。

关键词:信道估计,MIMO,多径衰落信道,OFDM。

通常用于基于训练来识别信道的典型步骤涉及利用完全由导频符号组成的多个OFDM符号。对于单输入单输出(SISO)系统,这种方法可以在文献[1]、[9]和[10]中找到,而对于多输入多输出(MIMO)系统,可以在文献[5]中找到。在这样的系统中,在传输任何数据之前会先估计信道状态信息(CSI)。当CSI发生显著变化时,会发送重新训练序列。在快速时变环境中,这些系统必须持续重新训练以重新估计CSI。在重新训练之间,由于其过时的信道估计,这些系统会遇到增加的误码率。基于已知信道相关函数(时间和/或频率)的维纳滤波可以用来改善信道估计。

在文献[7]中首次提出使用导频音来获取CSI,针对单输入单输出(SISO)OFDM系统,提出了关于最小二乘(LS)信道估计均方误差(MSE)的最优导频音放置方式。将这一思想扩展到MIMO OFDM系统并不直接,因为不仅必须优化导频音的放置方式,还必须优化导频序列本身以获得最小LS信道估计的MSE。值得注意的是,在文献[14]中讨论了针对SISO OFDM系统最优训练相对于LS信道估计的MSE,以及基于LS信道估计的零强制接收机输出的MSE的讨论。在文献[11]中,针对基于线性最小均方误差(LMMSE)信道估计的容量,提出了SISO OFDM系统的最佳训练。

MIMO OFDM LSE信道估计,在本文,我们考虑了MIMO OFDM系统的最小二乘误差信道估计。可以访问MIMO OFDM系统的设计参数和信道状态信息。在任意一对发射和接收天线之间考虑了L个时隙的瑞利衰落信道。通过仿真结果得到的LSE信道的均方误差与理论进行了比较。

MIMO(Multiple Input Multiple Output)OFDM(Orthogonal Frequency Division Multiplexing)系统是一种利用多个天线进行信号传输和接收的通信系统,通过对信道矩阵进行估计可以提高系统性能。在MIMO OFDM系统中,最小二乘误差(LSE)信道估计是一种常用的信道估计方法之一。

最小二乘误差信道估计是通过最小化传输过程中接收信号与已知发射信号之间的误差平方和,来估计信道矩阵。通过这种方法,可以有效地估计信道的参数,提高信号的接收质量和系统的性能。

在MIMO OFDM系统中,由于信道的复杂性和多径效应,信道估计是十分重要的一环。采用LSE信道估计方法可以帮助系统更准确地估计信道状况,进而进行信号处理和解调,提高系统的容错性和通信质量。

综上所述,考虑了MIMO OFDM系统的最小二乘误差信道估计研究可以帮助改善系统的性能和稳定性,是通信领域中的重要研究方向之一。希望这个解答能够帮助到你。如果有任何其他问题,欢迎提出。

📚2 运行结果

部分代码:

%% Parameters
    % system parameters (independent)
    ofdm.Nb      = 1e2;                 % number of blocks
    ofdm.Nt      = 2;                   % number of transmit antenna    
    ofdm.Nr      = 4;                   % number of receive antenna
    ofdm.K       = 128;                 % number of subcarriers    
    ofdm.G       = 1/4;                 % Guard interval percentage    
    ofdm.Mod     = 4;                   % QPSK Modulation    
    ofdm.PSpace  = 1;                   % pilot space between two pilots
    
    % channel parameters
    chan.SNR_dB  = 15;                  % signal to noise ratio
    chan.L       = 6;                   % number of channel taps between each transmit-receive antenna
    
    % control parameters
    ofdm.ifDemodulateData = 1;          % (1,0) if 1, the code demodulates the transmitted data via LS algorithm, and calculates the BER
    ofdm.ifDisplayResults = 1;          % (1,0) if 1, displays the results in the command window
    
    % inserting input data to the default data
    if nargin > 2
        error('Only two arguments can be set as inputs')
    elseif nargin == 2
        % updating the set parameters
        S = fieldnames(ofdmIn);
        for nS = 1:length(S)
             ofdm.(S{nS}) = ofdmIn.(S{nS});
        end
        S = fieldnames(chanIn);
        for nS = 1:length(S)
             chan.(S{nS}) = chanIn.(S{nS});
        end
    elseif nargin == 1
        S = fieldnames(ofdmIn);
        for nS = 1:length(S)
             ofdm.(S{nS}) = ofdmIn.(S{nS});
        end
    end
    % dependent parameters
    ofdm.PPos    = 1:(ofdm.PSpace+1):ofdm.K;    % OFDM pilot positionss
    ofdm.PL      = length(ofdm.PPos);           % Length of pilot subcarriers
    ofdm.DPos    = setxor(1:ofdm.K,ofdm.PPos);  % OFDM data positions
    ofdm.DL      = length(ofdm.DPos);           % Length of data subcarriers
    ofdm.BER     = 0;                           % set the BER to zero
    chan.sigma   = sqrt(10^(-0.1*chan.SNR_dB)); % noise power
    
    % normalization of the energy for the constelation        
        temp         = 0:ofdm.Mod-1;           % possible symbols
        temp         = qammod(temp,ofdm.Mod);  % modulated symbols
        temp         = abs(temp).^2;           % power of each point in the constellation
        temp         = mean(temp);             % average energy of the constellation
        ofdm.ModNorm = 1/sqrt(temp);           % normaliztion factor
    
%% Data generation
    % symbol generation
    ofdm.d      = randi(ofdm.Mod,ofdm.DL,ofdm.Nb,ofdm.Nt)-1;   % generation of a DL by nB by Nt matrix of data symbols
    
%% data Modulation
    ofdm.dMod   = zeros(ofdm.K,ofdm.Nb,ofdm.Nt);    % memory allocation for the ofdm blocks transmitted from each Tx antenna
    if ofdm.DL > 0
        for nt = 1 : ofdm.Nt
            ofdm.dMod(ofdm.DPos,:,nt) = ofdm.ModNorm*qammod(ofdm.d(:,:,nt),ofdm.Mod);
        end
    end
%% Pilot insertion
    for nt = 1 : ofdm.Nt
        ofdm.dMod(ofdm.PPos,:,nt) = repmat(exp(-sqrt(-1)*2*pi*(nt-1)*chan.L*(1:ofdm.PL).'/ofdm.PL),1,ofdm.Nb);
    end
    % checking the power of the transmit signal (it has to be 1 after normalization)
        ofdm.pow = var(ofdm.dMod(:))+abs(mean(ofdm.dMod(:)))^2;
%% IFFT operation    
    ofdm.ifft   = zeros(ofdm.K,ofdm.Nb,ofdm.Nt);    % memory allocation for the ofdm blocks transmitted from each Tx antenna after ifft
    for nt = 1 : ofdm.Nt
        ofdm.ifft(:,:,nt) = sqrt(ofdm.K)*ifft(ofdm.dMod(:,:,nt),ofdm.K);
    end
%% Cyclic perfix
    % copy the end of signal to the begining of signal
    ofdm.ifftG = [ofdm.ifft(ofdm.K*(1-ofdm.G)+1:ofdm.K,:,:);ofdm.ifft];
%% Channel
    % for each block we generate a rayleigh fading MIMO channel which is
    % fixed over a block
    chan.Coeff = 1/sqrt(2)*1/sqrt(chan.L)*(randn(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb)+sqrt(-1)*randn(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb));   
%% Channel pass and filter
    if ofdm.K*ofdm.G < chan.L+1
        error('Guard interval is shorter than channel length, and the system does not function properly')
    end
    ofdm.Y = zeros(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr);
    for nb = 1 : ofdm.Nb
        for nt=1:ofdm.Nt
            for nr=1:ofdm.Nr
                ofdm.Y(:,nb,nr) = ofdm.Y(:,nb,nr) + filter(squeeze(chan.Coeff(nt,nr,:,nb)),1,ofdm.ifftG(:,nb,nt));
            end
        end
    end
    % adding noise
    ofdm.Y = ofdm.Y + chan.sigma*1/sqrt(2)*(         randn(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr)+...
                                            sqrt(-1)*randn(ofdm.K*(1+ofdm.G),ofdm.Nb,ofdm.Nr)     );
%% Cyclic prefix removal
    ofdm.fftG = ofdm.Y(ofdm.K*ofdm.G+1:ofdm.K*(1+ofdm.G),:,:);
%% FFT operation
    ofdm.fft  = zeros(ofdm.K,ofdm.Nb,ofdm.Nr);
    for nr = 1 : ofdm.Nr
        ofdm.fft(:,:,nr)  = 1/sqrt(ofdm.K)*fft(ofdm.fftG(:,:,nr),ofdm.K);
    end
%% Channel estimation
    % building the first L columns of the fft matrix
    F = dftmtx(ofdm.K);
    F = F(:,1:chan.L);
    % Memory allocation for the estimated channel coefficients
    chan.CoeffEst = zeros(ofdm.Nt,ofdm.Nr,chan.L,ofdm.Nb);
    for nb = 1 : ofdm.Nb
        for nr = 1 : ofdm.Nr
            % Building matrix A (see the paper)
            chan.A = zeros(ofdm.PL,chan.L*ofdm.Nt);
            for nt = 1 : ofdm.Nt
                chan.A(:,(1:chan.L)+(nt-1)*chan.L) = diag(ofdm.dMod(ofdm.PPos,nb,nt))*F(ofdm.PPos,:);
            end
            ChanEst = pinv(chan.A)*ofdm.fft(ofdm.PPos,nb,nr);
            for nt = 1 : ofdm.Nt
                chan.CoeffEst(nt,nr,:,nb) = ChanEst((1:chan.L)+(nt-1)*chan.L);
            end
        end        
    end
%% MSE (Mean Square error calculation)
    chan.MSE_Simulation = var(chan.Coeff(:)-chan.CoeffEst(:));
    chan.MSE_Theory     = chan.sigma^2/ofdm.PL;
    if ofdm.ifDisplayResults
        disp(['MSE of channel estimation (theory)     is : ',num2str(chan.MSE_Theory)])
        disp(['MSE of channel estimation (simulation) is : ',num2str(chan.MSE_Simulation)])
    end
%% Demodulation
    if ofdm.ifDemodulateData == 1 && ofdm.DL > 0
        % Building channel coefficients in frequency domain
        chan.CoeffEstFreq = zeros(ofdm.K,ofdm.Nt,ofdm.Nr,ofdm.Nb);
        for nb = 1 : ofdm.Nb
            for nr = 1 : ofdm.Nr
                for nt = 1 : ofdm.Nt
                    chan.CoeffEstFreq(:,nt,nr,nb) = F*squeeze(chan.CoeffEst(nt,nr,:,nb));
                end
            end
        end
        % demodulation
        ofdm.dDemod = zeros(ofdm.DL,ofdm.Nb,ofdm.Nt);
        for nb = 1 : ofdm.Nb
            for dl = 1 : ofdm.DL
                ofdm.dDemod(dl,nb,:) = pinv(reshape(chan.CoeffEstFreq(ofdm.DPos(dl),:,:,nb),ofdm.Nt,ofdm.Nr).')...
                                       *squeeze(ofdm.fft(ofdm.DPos(dl),nb,:));
            end
        end
        % detection
        ofdm.dEst = zeros(ofdm.DL,ofdm.Nb,ofdm.Nt);

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]谭萍.基于最优导频序列的MIMO-OFDM系统信道估计研究[D].哈尔滨工业大学,2014.

[2]张帅,白成林,罗清龙,等.相干光OFDM系统中MMSE信道估计研究[J].光电子.激光, 2013(3):508-513.

[3]刘殷卉.OFDM系统分段最小均方误差信道估计与多层专用导频设计的研究[D].北京邮电大学,2010.

[4]李景玉.MIMO-OFDM系统中的信道估计研究[D].北京邮电大学[2024-05-24].DOI:CNKI:CDMD:2.2006.135304.

[5]李景玉.MIMO-OFDM系统中的信道估计研究[D].北京邮电大学[2024-05-24].DOI:CNKI:CDMD:2.2006.135304.

🌈4 Matlab代码实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值