基于LS和MMSE实现OFDM通信链路信道估计的仿真和分析

本文详细介绍了在OFDM通信系统中,使用最小二乘法(LS)和最小均方误差(MMSE)进行信道估计的原理和步骤,并提供了MATLAB仿真代码示例,包括发送端和接收端的操作,以及信道建模和信道估计的实现。通过比较不同方法的性能,展示了在不同SNR条件下的误码率(MSE)表现。
摘要由CSDN通过智能技术生成

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

OFDM通信链路中的信道估计是为了在接收端正确还原发送信号而对信道进行建模和估计的过程。常用的两种信道估计方法是最小二乘法(LS)和最小均方误差(MMSE)。下面是使用这两种方法实现OFDM通信链路信道估计的基本步骤:

  1. 发送端:

    • 将原始数据分为子载波,并应用傅里叶变换得到频域符号。

    • 插入导频符号,在OFDM符号中安排导频位置。

  2. 信号传输:

    • 将频域符号转换为时域信号并加上循环前缀。

    • 将待传输的信号通过信道传输。

  3. 接收端:

    • 接收并去除循环前缀。

    • 将接收到的信号进行傅里叶变换,转换为频域表示。

  4. 导频信号提取:

    • 从接收到的信号中提取出导频符,即已知的已发送符号。

  5. LS信道估计:

    • 使用导频符号计算信道的估计值。

    • 对于每个子载波,计算导频符号在频域上与接收到的导频符号的比率。

    • 根据信道估计的比率,得到各个子载波的信道估计。

  6. MMSE信道估计:

    • 使用导频符号和噪声方差计算信道的估计值。

    • 对于每个号以及噪声方差的比率。

    • 根据信道估计的比率,得到各个子载波的信道估计。

⛄ 运行结果

⛄ 部分代码

clc;

clear all;

close all;

Nfft=2048; 

Ng=512; 

Nofdm=2560; 

Nsym=100;

Nps=4; %Pilot Spacing

Np=Nfft/Nps; %Number of pilots per OFDM symbol

Nbps=4;

itr=10;

nn=11; %No. of SNR observations

%Initialising MSE arrays for different SNR observations:

z_linin=zeros(1,nn);

z_splin=zeros(1,nn);

z_lindft=zeros(1,nn);

z_spldft=zeros(1,nn);

zmmse=zeros(1,nn);

zmmse_dft=zeros(1,nn);

for t=1:itr

     z=[];

     z1=[];

     z2=[];

     z3=[];

     zm=[];

     zms=[];

     snr1=[];

    % 16 - QAM - Modulation Scheme 

     M=16;

     hmod = modem.qammod('M',M, 'SymbolOrder','gray');

     Es=1; 

     A=sqrt(3/2/(M-1)*Es); % Signal energy and QAM normalization factor

     for nsym=1:Nsym

        Xp = 2*(randn(1,Np)>0)-1; % Pilot sequence generation

        msgint=randi(1,Nfft-Np,M); % bit generation

        dat_ser = A*modulate(hmod,msgint);

     end

     % serial to parllel conversion

     dat_par=dat_ser.';

     % Pilot Insertion - Comb Type Arrangement

     counter = 0; 

     loc = [];

     for i=1:Nfft

         if mod(i,Nps)==1

             X(i)=Xp(floor(i/Nps)+1); 

             loc=[loc i]; 

             counter = counter+1;

         else

             X(i) = dat_par(i-counter);

         end

     end

     

     % inverse discret Fourier transform (IFFT)

     X_ifft=ifft(X,Nfft);

     

     % Adding Cyclic Prefix - Guard interval

     guard=X_ifft(:,end-511:end); % this is the Cyclic Prefix part to be appended.

     ofdm_par=[guard X_ifft];

     % parallel to serial - Generation of the OFDM Signal 

     ofdm=ofdm_par.';

     

     % Channel code

     dopjakes = doppler.jakes;

     dopgauss1 = doppler.bigaussian;

     dopgauss1.CenterFreqGaussian1 = -0.8;

     dopgauss1.CenterFreqGaussian2 = 0.4;

     dopgauss1.SigmaGaussian1 = 0.05;

     dopgauss1.SigmaGaussian2 = 0.1;

     dopgauss1.GainGaussian1 = sqrt(2*pi*(dopgauss1.SigmaGaussian1)^2);

     dopgauss1.GainGaussian2 = 1/10 * sqrt(2*pi*(dopgauss1.SigmaGaussian2)^2);

     dopgauss2 = doppler.bigaussian;

     dopgauss2.CenterFreqGaussian1 = 0.7;

     dopgauss2.CenterFreqGaussian2 = -0.4;

     dopgauss2.SigmaGaussian1 = 0.1;

     dopgauss2.SigmaGaussian2 = 0.15;

     dopgauss2.GainGaussian1 = sqrt(2*pi*(dopgauss1.SigmaGaussian1)^2);

     dopgauss2.GainGaussian2 = 1/10^1.5 * sqrt(2*pi*(dopgauss1.SigmaGaussian2)^2);

     

     fd=130; %Maximum Doppler Shift

     ts=(7/64)*10^-6; %Sampling Time

     chan = rayleighchan(ts, fd); %Rayleigh channel - Multifading Channel

     % Assign profile-specific properties to channel object.

     chan.PathDelays = [0.0 0.2 0.5 1.6 2.3 5.0] * 1e-6;

     chan.AvgPathGaindB = [-3 0 -2 -6 -8 -10];

     chan.DopplerSpectrum = [dopjakes dopjakes dopjakes dopgauss1 dopgauss2 dopgauss2];

     chan.StoreHistory = 1;

     chan.ResetBeforeFiltering = 0;

     chan.NormalizePathGains = 1;

     

     %Passing OFDM Signal through the created Channel 

     chan_op = filter(chan,ofdm);

     XFG=fft(chan_op);

     

     %Channel Covariance Matrix for MMSE estimation  

     x_test=randn(1,6);

     X_test=fft(x_test,Nfft);

     y_test=filter(chan,x_test);

     Y_test=fft(y_test,Nfft);

     H1=Y_test/X_test;

     h=ifft(H1,6);

     H=fft(h,Nfft);

     ch_length=length(h);

         

     %Reception at the receiver end for various SNR ranging from 5dB - 25dB:

     for SNR =5:2:25

         %AWGN Modelling

         snr1=[snr1 SNR];

         n1=ones(2560,1);

         n1=n1*0.000000000000000001i;%Just to ensure that the function awgn adds 'complex gaussian noise'..

         noise=awgn(n1,SNR);

         variance=var(noise);

         N=fft(noise);

         

         Y_rec=XFG+N;

         y_ser=ifft(Y_rec);

         

         % serial to parallel conversion

         y_par=y_ser.';

         

         % guard interval

         y = y_par(Ng+1:Nofdm);

         

         % FFT

         Y = fft(y);

         

         % channel estimation

         

         %LS Estimator with Linear Interpolator 

         H_est = LS_CE(Y,Xp,loc,Nfft,Nps,'linear');

         err=(H-H_est)*(H-H_est)';

         z=[z err/(Nfft*Nsym)];

         

         %LS Estimator with Linear Interpolator - DFT Based

         h_est = ifft(H_est);

         h_DFT = h_est(1:ch_length);

         H_DFT = fft(h_DFT,Nfft); 

         err=(H-H_DFT)*(H-H_DFT)';

         z3=[z3 err/(Nfft*Nsym)];

         

         %LS Estimator with Spline Cubic Interpolator

         H_est = LS_CE(Y,Xp,loc,Nfft,Nps,'spline');

         err=(H-H_est)*(H-H_est)';

         z1=[z1 err/(Nfft*Nsym)];

         

         %LS Estimator with Spline Cubic Interpolator - DFT Based

         h_est = ifft(H_est);

         h_DFT = h_est(1:ch_length);

         H_DFT = fft(h_DFT,Nfft); 

         err=(H-H_DFT)*(H-H_DFT)';

         z2=[z2 err/(Nfft*Nsym)];  

         

         % MMSE Estimator

         H_est = MMSE_CE(Y,Xp,loc,Nfft,Nps,h,SNR);

         err=(H-H_est)*(H-H_est)';

         zm=[zm err/(Nfft*Nsym)];

         

         % MMSE Estimator - DFT Based

         h_est = ifft(H_est);

         h_DFT = h_est(1:ch_length);

         H_DFT = fft(h_DFT,Nfft); 

         err=(H-H_DFT)*(H-H_DFT)';

         zms=[zms err/(Nfft*Nsym)];

     end

     

     z_linin=z_linin+z;

     z_splin=z_splin+z1;

     z_lindft=z_lindft+z2;

     z_spldft=z_spldft+z2;

     zmmse=zmmse+zm;

     zmmse_dft=zmmse_dft+zms;

end

figure(1)

 semilogy(snr1,(1/itr)*z_linin,'r+:', snr1,(1/itr)*z_splin,'bo:', snr1,(1/itr)*z_lindft,'--xg', snr1,(1/itr)*z_spldft,'--sc');

 legend('LS - Linear Interpolation','LS - Spline Cubic Interpolation','LS - Linear Interpolation(DFT)','LS - Spline Cubic Interpolation(DFT)');

 xlabel('SNR');

 ylabel('MSE');

 grid on

 hold on

figure(2)

 semilogy(snr1,(1/itr)*zmmse,'r+:',snr1,(1/itr)*zmmse_dft,'bo:');

 xlabel('SNR');

 ylabel('MSE');

 legend('MMSE','MMSE - DFT Based');

 hold on

 grid on

figure(3)

 semilogy(snr1,(1/itr)*z_linin,'r+:', snr1,(1/itr)*z_splin,'bo:', snr1, (1/itr)*zmmse,'--xg');

 xlabel('SNR');

 ylabel('MSE');

 legend('LS - Linear Interpolation','LS - Spline Cubic Interpolation','MMSE');

 hold on

 grid on 

⛄ 参考文献

[1] 童圣洁,李红信,邓晓燕.OFDM系统LS与MMSE信道估计算法仿真分析[J].微计算机信息, 2008, 24(34):2.DOI:10.3969/j.issn.1008-0570.2008.34.092.

[2] 曹文魁.基于OFDM协作通信系统中的信道估计技术研究[D].解放军信息工程大学[2023-06-22].DOI:CNKI:CDMD:2.1013.161304.

​🍅 仿真咨询

1.卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
2.图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
3.旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划
4.无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配
5.传感器部署优化、通信协议优化、路由优化、目标定位
6.信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号
7.生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化
8.微电网优化、无功优化、配电网重构、储能配置
9.元胞自动机交通流 人群疏散 病毒扩散 晶体生长

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料

这是一份论文,有关信道估计的.里面介绍了LS,MMSE算法,并且有LMMSE和SVD作为对MMSE算法的改进.Y()=DFT(y(n))-N2y(nje (7) n=0,1,…,N-1 Y(k)也可以表示为 Y(k)=x(k)H(k)+/(k)+W() (8) 其中,H(k)是信道的频域响应,I(κ)是多普勒频移带来的载波间干扰(ICI),W(k)是高撕白噪声的傅立 叶变换。 3基于最小均方误差(MMSE)的信道估计算法 31LS信道估计算法简介 IS准则的目标是使(Y-1)(Y-)最小,在频域高斯独立子信道的假定之下,IS估计就可以 简单的表示成除法,得到IS准则的信道估计为: ,=x-Y (9) 最小二乘估计,只需要知道观测方程的观测矩阵X,对于待定的参数h,观测的噪声,以及观测样本Y 的其他统计特性,都不需要其他的先验信息,这就是最小二乘估计最大的优势,也是它得到广泛应用最大 的原因。 32MMSE信道估计算法 假设表示信道估计值,H表示实际值。估计误差为 =H-a (10) 均方误差(MSE)为 P=E{eP}=B{H-}=E(-H)(H-H)"} MMSE准则的目标是使均方误差E(-B)(-H)}最小,其中 E(-H)(-H)"}=E[(-1)(-)} H=gh (12) 其中Q为DF变换矩阵。得到MMSE的估计值为 Humse =QhmMse=QFmse"Y Mmse=rlle"Xxoo+RT(QX X@) (13) MMSE可以实现理想的信道估计,此算法的均方误差和信噪比成反比,如果此种算法需要的统计参数 都是理想的,那么估计出来的性能就会非常的理想。缺点就是此算法非常复杂。 与LS估计相比,MMSE估计算法在信噪比上有10-15dB的增益。可以看到,MMSE估计算法需要对 矩形求逆,当OFDM系统的子信道数目N增大时,矩阵的运算量也就会变得十分巨大。因此,MMSE算法 的最大的缺点就是计算量太大,实现起来对硬件的要求比较高。如何在估计性能的下降不多的前提下,对 MMSE估计算法做适当的简化,是一个关键的研究方向 33对MMSE算法的改进 首先可以简化(Xx)的计算,用E{xx}代替x。于是,有 HH(HH (14) SNR ·1373 这里 SNR=EX()o β=E{X()}·E(1/X(k)}2。 对于给定的信号星座图为定值,当子信道相关矩阵Rm与信噪比SNR已知时,对Rm1(Rm+l) SNR 只计算一次。但是矩阵的运算量还是比较大,由于子信道频响的频谱能量主要集中在低频部分,即主 要集中在前G阶,这里G为信道最大多径时延对应的样值个数。因此,设子信道的自相关矩阵可表 示为Rm=UAU的形式,这样可以显著降低MMSE的计算复杂度。这里U为酉矩阵, A=dlag(2,3,…,2)为由Rm的特征值构成的对角阵。由此可得 MMSE U H (15) 这里△n为 +(B/M1),k=1…,m构成的对角阵,为A的前m个特征值,通常可以取m与 循环前缀的长度一致,相应地矩阵U可化简为N×L阶矩阵 4算法性能分析 仿真基于图2所示道频结构的OFDM系统,信道设定为时变信道,包含了多径和由于终端移动产 生的多普勒频移。具体参数为:载波频率2GHz,采样频率6MHz,子载波数N=1024,无符号间干扰。 本仿真与文献[6中的频域LE加线性插值的信道估计性能比较,同时有一条理想估计曲线作为参考。如 图3、图4所示 10 理想模型 须域线性值估计的线性插值 时域最小均方误差 ●。。。●。。●。o。●c 温 o●。。o鲁。。。●o。 o。●0o。●。。o●。 e●。。●。。。。。。 域 o。●D。。● o● ●●。。。●。。。●。 ●o●o●。O。 10 频域 ENNo/dB 图2仿真系统导频结构 图360km/h时LE插值和MMSE算法性能比较 亞 想模型 域线性值估计的线性插倒 域最小均方误差 10 ENNo/dB 图4120km/h时LE插值和MMSE算法性能比较 ·1374· 以上两图显示,在高信噪比情况下,MMSE算法与LE插值算法性能近似,但在低信噪比时,本文提 出的MMSE改进算法较LE插值算法约有2~3dB的性能提升,更接近于理想曲线。 参考文献 [1] Meng-Han Hsieh, Che-Ho Wei. Channel estimation for OFDM systems based on comb-type pilot arangement in frequency selective fading channels. IEEE Transactions on Consumer Electronics, 1998, 44(1 ): 217-225 [2]Tufvesson F Maseng T Pilot Assisted Channel Estimation for OFDM in Mobile Cellular Systems. Proceedings of iEEE Vehicular Technology Conference, Vol 3. Phoenix(AZ USA), 1997. Piscataway (J, USA): IEEE, 1997. 1639-1643 3] Louis L. Scharf, Statistical Signal Processing, Addison-Wesley, 1991 [4] I. J. van de Beek, O. Edfors, M. Sandell,S. K. Wilson, and P 0. Borjesson, "OFDM channel estimation by singular value decomposition", Proc. Of 46IEEE Veh Tech Conf. Pp. 923-927, April1996 [5] Li Y G, Cimini L J, Sollenberger N R. Robus Channel Estimation for OFDM Systems with Rapid Dispersive Fading Channels [J]. IEEE Transactions on Communications, 1998, 46(7): 902-915 [6] Jae Kyoung Moon, Song In Choi. Performance of channel estimation methods for OFDM systems in a multipath fading channels IEEE Transactions on Consumer Electronics, 2000 46(1): 161-170 7]尹长川.多载波宽带无线通信技术.北京:北京邮电大学出版社,200.7 作者简介 王东,男,1978年生,陕西西安人,解放军西安通信学院讲师,在读硕士,主要研究方向为多载波通信 栾英姿,女,1970年生,江苏盐城人,西安电子科技大学副教授,博士,主要研究领域为宽带无线通信和多载波技术。 1375 一种基于MMSE的OFDM系统信道估计改进算法 旧 WANFANG DATA文献链接 作者: 王东,栾英姿 作者单位: 王东(西安电子科技大学,西安,710071;解放军西安通信学院,西安,710106),栾英姿(西安 电子科技大学,西安,710071) 本文链接http://d.g.wanfangdata.comcn/confereNce6442807.aspx
以下是基于LSMMSE算法实现OFDM系统的信道估计的MATLAB代码: ```matlab % OFDM信道估计 % 基于LSMMSE算法 clc; clear all; close all; %% 定义系统参数 N = 64; % FFT大小 cp_len = 16; % 循环前缀长度 fs = 16000; % 采样率 Ts = 1/fs; % 采样时间 fc = 2000; % 载波频率 T = 1/fc; % 周期 fd = 100; % 多径延迟 K = 10; % 多径个数 SNR_dB = 30; % 信噪比 SNR = 10^(SNR_dB/10); % 信噪比(线性值) P = 1; % 发送功率 L = 10^4; % 发送数据长度 alpha = randn(1,K); % 多径衰落系数 tau = (0:K-1)*T; % 多径时延 h = zeros(1,N+K-1); % 多径信道冲激响应 %% 生成发送数据 x = randi([0,1],1,N*L); % 生成随机发送数据 X = reshape(x,N,L).'; % 分组 X_QPSK = 1/sqrt(2)*(2*X(:,1:2:end)-1+1i*(2*X(:,2:2:end)-1)); % QPSK调制 %% 信道模型 for k = 1:K h(k) = alpha(k)*exp(1i*2*pi*fc*tau(k)); % 多径信道冲激响应 end H = fft(h,N); % 多径信道频率响应 %% 发送和接收 y = zeros(L,N); % 接收信号 for l = 1:L % 发送信号加循环前缀 x_cp = [X_QPSK(l,N-cp_len+1:N),X_QPSK(l,:)]; % 通过多径信道 y_cp = conv(x_cp,h); % 加噪声 sigma2 = P/SNR/N; % 噪声方差 noise = sqrt(sigma2/2)*(randn(1,N+K-1)+1i*randn(1,N+K-1)); % 高斯白噪声 y_n = y_cp+noise; % 接收信号 % 去掉循环前缀并进行FFT y_fft = fft(y_n(K+1:N+K),N); y(l,:) = y_fft; end %% 信道估计 H_LS = zeros(L,N); % LS估计的多径信道频率响应 H_MMSE = zeros(L,N); % MMSE估计的多径信道频率响应 for l = 1:L % 发送信号加循环前缀 x_cp = [X_QPSK(l,N-cp_len+1:N),X_QPSK(l,:)]; % 通过多径信道 y_cp = conv(x_cp,h); % 加噪声 sigma2 = P/SNR/N; % 噪声方差 noise = sqrt(sigma2/2)*(randn(1,N+K-1)+1i*randn(1,N+K-1)); % 高斯白噪声 y_n = y_cp+noise; % 接收信号 % 去掉循环前缀并进行FFT y_fft = fft(y_n(K+1:N+K),N); % LS算法 H_LS(l,:) = y_fft./X_QPSK(l,:); % MMSE算法 H_MMSE(l,:) = conj(H)./(abs(H).^2+sigma2/P).*y_fft./X_QPSK(l,:); end %% 画图 % 信道频率响应 figure; subplot(2,1,1); plot((0:N-1)/N*fs/1000,20*log10(abs(H))); xlabel('频率/kHz'); ylabel('幅度/dB'); title('多径信道频率响应'); subplot(2,1,2); plot((0:N-1)/N*fs/1000,angle(H)/pi*180); xlabel('频率/kHz'); ylabel('相位/度'); title('多径信道频率响应'); % LS估计的信道频率响应 figure; subplot(2,1,1); plot((0:N-1)/N*fs/1000,20*log10(abs(H_LS))); xlabel('频率/kHz'); ylabel('幅度/dB'); title('LS估计的多径信道频率响应'); subplot(2,1,2); plot((0:N-1)/N*fs/1000,angle(H_LS)/pi*180); xlabel('频率/kHz'); ylabel('相位/度'); title('LS估计的多径信道频率响应'); % MMSE估计的信道频率响应 figure; subplot(2,1,1); plot((0:N-1)/N*fs/1000,20*log10(abs(H_MMSE))); xlabel('频率/kHz'); ylabel('幅度/dB'); title('MMSE估计的多径信道频率响应'); subplot(2,1,2); plot((0:N-1)/N*fs/1000,angle(H_MMSE)/pi*180); xlabel('频率/kHz'); ylabel('相位/度'); title('MMSE估计的多径信道频率响应'); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值