• 基于导频的信道估计实现


    目录

    零、前言

    一、为什么要信道估计

    二、导频的概念

    (1)为什么要有导频

    (2)导频在信道估计中作用

    (3)关于导频序列的补充

    三、最小二乘法估计

    (1)LS信道估计算法分析

    (2)LS信道估计的特点

    四、最小均方误差估计

    (1)MMSE信道估计算法分析

     (2)MMSE信道估计特点

    (3)关于公式的推导

    五、简单运用

    (一)MIMO_OFDM系统导频估计的MSE曲线图

    (二)画出信噪比0:20下的误码率曲线

    六、结果分析

    (1)为啥要进行蒙特卡洛?

    (2)五里面题目第一问:

    (3)五里面题目第二问: 

     七、结尾


    零、前言

         这是我研一通信系统仿真的专题答辩内容,就是当做笔记记录的,如果有内容上的错误请及时私信我,我会做出修改的,本文代码是可以用的,自己要多调试调试。

    一、为什么要信道估计

           定义:用导频获取信道状态信息的这个过程就叫做信道估计。

           从上图可知,与单纯的OFDM模型相比在里面的OFDM信道模型明显多出了插入导频和信道估计这两个过程,所以我们现在要解决的问题是为什么要进行信道估计。以及导频是干啥的。

           信号在传输过程中会经历 1. 时间轴上的随机衰落(由于移动多普勒效应引起)见图2 2. 频率轴上的衰落(由于多径效应引起)。见图3

    图2移动多普勒效应
    图2移动多普勒效应
    图3多径效应

          所以信道估计的目的,就是在于尽可能利用较少的,在时间方向和频率方向分布的pilot信号,对时间变化和频率变化进行抽样,然后利用这种对衰落已完备描述的抽样信息,经过滤波降噪和内插,恢复全频率(数据载波)的频率响应。信道估计基本的两种方法,一种是盲估计,一种是基于训练的估计,导频一般就应用在后者。

    二、导频的概念

    (1)为什么要有导频

           在正式发送数据之前,先给系统训练训练,让它知道周围的通讯环境是怎样的,然后在正式发送数据时,发射端就可以根据这些信息(称为信道状态信息)做出相应的调整,从而达到较好的通信性能。

    (2)导频在信道估计中作用

           信道估计目前理解应该就是估计信道系数h,即如果发送信号已知,比如说x,理论上的接收信号应该是y=h*x+n,假设n=0,即不考虑噪声,那么信道系数就可以等于h=y/x。如果这个时候我们可以测量接收信号y^,那么就可以获得信道系数h^=y^/x。同时在一般使用中,我们强调导频都是一个序列,即一个已知序列,然后我们是采用相关的方法来进行上述的操作的。主要好处在于,首先相当于多个时刻的值做叠加,更稳定一些,同时由于噪声与设置的序列一般是无关的,那么其相关值即趋近与0,所以也能够避免噪声的干扰,增加准确性。

    (3)关于导频序列的补充

           在802.11协议中,基本都是固定子载波作为导频,并且用其作为信道估计。同时除了导频,802.11协议中也会采用LTF(长训练字段)做一个粗估计,方法也是同样采用固定的序列。 在LTE中,导频貌似和参考信号RS是一样的,尤其是小区专用参考信号CRS。 同时有关导频的内容在5G里面也比较被关注,其主要在于导频污染这个话题上。由于解调信号我们需要知道信道系数,同时信道系数就是利用导频所获得,如果导频互相干扰,那么就会严重通信质量。导频污染主要是由于不同的导频序列不正交导致(学术点可以认为序列间的汉明距离比较小),从而不同的序列做相关互相干扰,从而不能够很好估计信道。

    三、最小二乘法估计

    (1)LS信道估计算法分析

            LS算法就是在不考虑噪声的条件下,估计信道的冲击响应向量hLS=[h0,h1,…,hN-1]T,使其代价函数最小。LS估计器的代价函数定义如下:

    (2)LS信道估计的特点

            LS信道估计的特点是简单,但是从其代价函数可以看出,在找最优解时没有考虑接收信号中的噪声及子载波间的干扰,因为这种算法估计出的信道对接收信号进行抽头复系数均衡时,输出信号的均方误差较大,准确度受到限制。

    四、最小均方误差估计

    (1)MMSE信道估计算法分析

             MMSE信道估计算法对于ICI(子载波间干扰)和高斯白噪声有很好的抑制作用,它是在LS估计的基础上进行的:

     (2)MMSE信道估计特点

               MMSE算法的运算量要比LS算法大的多,随子载波数N呈指数增长,并需随导频信号X的变化实时进行矩阵的逆运算((XXH)一1),导致系统效率很低。

    (3)关于公式的推导

            关于最小均方误差的公式推导,下面评论区链接提供了两种方法,感兴趣的可以自己去看。

    五、简单运用

    (一)MIMO_OFDM系统导频估计的MSE曲线图

             请画出在信噪比从0-20dB下,MIMO_OFDM系统中随机导频序列设计的导频估计的MSE(Mean Square Error)曲线图。

    要求:

    1.MSE:h的估计值与h的期望值间差值的二范数,在循环多次下的均值(随着信噪比变化,求出误差,画出来)

    2. OFDM块长(傅里叶变换长度)与各用户信道的多径数之和应存在什么关系?(ppt上回答,与最小二乘有关,看有没有唯一解)答:“各用户的多径数之和<=OFDM块长”才是正确答案,这涉及到的是未知数和方程个数之间的关系。

    代码:

    1. function Y=OFDM(x,h)
    2. x_ifft=ifft(x);
    3. x_cir=[x_ifft(length(x_ifft)-length(h):length(x_ifft));x_ifft;];
    4. y_cir=conv(x_cir,h);
    5. y_nocir=y_cir(length(h)+2:length(h)+2+length(x)-1);
    6. Y=fft(y_nocir);
    1. clc
    2. clear all;
    3. close all;
    4. NBlock=50;
    5. WN=exp(-j*2*pi/NBlock); %DFT 离散傅里叶变换
    6. for n=1:NBlock
    7. for k=1:NBlock
    8. DFTMatrix(k,n)=WN^((n-1)*(k-1)); %傅里叶变换矩阵构造
    9. end
    10. end
    11. for i=1:7
    12. X(:,i)=randn(NBlock,1);
    13. end
    14. %%用户数为7,并根据信道参数构造A
    15. h1=[0.7;0.5;0.3;];
    16. h2=[0.7;0.5;0.3;];
    17. h3=[0.4;0.6;0.1;];
    18. h4=[0.3;0.4;];
    19. h5=[0.3;0.5;0.7;];
    20. h6=[0.1;0.6;0.1;];
    21. h7=[0.7;0.4;0.2;];
    22. A=[diag(X(:,1))*DFTMatrix(:,1:length(h1)) diag(X(:,2))*DFTMatrix(:,1:length(h2)) diag(X(:,3))*DFTMatrix(:,1:length(h3)) diag(X(:,4))*DFTMatrix(:,1:length(h4)) diag(X(:,5))*DFTMatrix(:,1:length(h5)) diag(X(:,6))*DFTMatrix(:,1:length(h6)) diag(X(:,7))*DFTMatrix(:,1:length(h7))];
    23. XMse(:,1)=zeros(NBlock,1)+1;
    24. for K=1:NBlock
    25. XMse(K,2)=exp(-j*2*pi*(length(h1))*(K-1)/NBlock);
    26. end
    27. for K=1:NBlock
    28. XMse(K,3)=exp(-j*2*pi*(length(h1)+length(h2))*(K-1)/NBlock);
    29. end
    30. for K=1:NBlock
    31. XMse(K,4)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3))*(K-1)/NBlock);
    32. end
    33. for K=1:NBlock
    34. XMse(K,5)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4))*(K-1)/NBlock);
    35. end
    36. for K=1:NBlock
    37. XMse(K,6)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4)+length(h5))*(K-1)/NBlock);
    38. end
    39. for K=1:NBlock
    40. XMse(K,7)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4)+length(h5)+length(6))*(K-1)/NBlock);
    41. end
    42. AMse=[diag(XMse(:,1))*DFTMatrix(:,1:length(h1)) diag(XMse(:,2))*DFTMatrix(:,1:length(h2)) diag(XMse(:,3))*DFTMatrix(:,1:length(h3)) diag(XMse(:,4))*DFTMatrix(:,1:length(h4)) diag(XMse(:,5))*DFTMatrix(:,1:length(h5)) diag(XMse(:,6))*DFTMatrix(:,1:length(h6)) diag(XMse(:,7))*DFTMatrix(:,1:length(h7)) ];
    43. %%随机导频
    44. h=[h1;h2;h3;h4;h5;h6;h7];
    45. for i=1:800
    46. for snr=0:20
    47. Y=A*h;
    48. Y=awgn(Y,snr,'measured');
    49. hEst=pinv(A)*Y; %信道估计
    50. % LS_MSE(snr+1)= norm(hEst-mean(hEst*(1:length(hEst))))./21;
    51. LS_MSE(snr+1,i)= norm((hEst)-h',2)/100;
    52. end
    53. end
    54. LS_MSE800=mean( LS_MSE,2);
    55. %%正交导频
    56. for i=1:800
    57. for snr=0:20
    58. YMse=AMse*h;
    59. YMse=awgn(YMse,snr,'measured');
    60. hEstMse=pinv(AMse)*YMse;%信道估计h
    61. %MMSE_MSE(snr+1)= norm(hEstMse-mean(hEstMse*(1:length(hEstMse))))./21;
    62. MMSE_MSE(snr+1,i)= norm((hEstMse)-h',2)/100;
    63. end
    64. %MMSE_MSE()
    65. end
    66. MMSE_MSE800=mean( MMSE_MSE,2);
    67. figure(1);
    68. semilogy(0:20,LS_MSE800,'b-o',0:20,MMSE_MSE800,'r-*');
    69. legend('随机导频','正交导频');
    70. title('Mse与snr的关系图');
    71. xlabel('snr');
    72. ylabel('Mse');

    (二)画出信噪比0:20下的误码率曲线

    根据估计出的信道,将信号进行解调,画出信噪比0:20下的误码率曲线。(仅限于SISO_ofdm系统下的随机导频和正交导频)(注:在单输入单输出下)

    要求:不能用if或case语句判决。

    代码:

    1. clc
    2. clear all;
    3. close all;
    4. num=8000;
    5. x_int=randi(8,num,1)-1; % 随机产生8008进制整数
    6. plot(x_int,'*');
    7. for m=1:8
    8. psk(m,1)=cos(11*pi/8-(m-1)*pi/4)+i*sin(11*pi/8-(m-1)*pi/4);
    9. end
    10. x=psk(x_int+1);% 8psk调制 x是x_int调制后的信号
    11. BlockLength=8;
    12. NBlock=8;
    13. WN=exp(-j*2*pi/NBlock); %DFT 离散傅里叶变换
    14. for n=1:NBlock
    15. for k=1:NBlock
    16. DFTMatrix(k,n)=WN^((n-1)*(k-1)); %傅里叶变换矩阵构造
    17. end
    18. end
    19. h=[0.8;0.5;0.3;0.15;0.1;0.05];
    20. BER_R=[];
    21. %%随机导频信道估计
    22. for i=1:100
    23. for snr=0:30
    24. X(:,1)=randn(NBlock,1);
    25. A=[diag(X(:,1))*DFTMatrix(:,1:length(h))];
    26. Y=A*h;
    27. Y=awgn(Y,snr,'measured');
    28. hEst=pinv(A)*Y; %信道估计h
    29. y_awgn=awgn(x,snr,'measured');
    30. y_multipath=conv(x,h);
    31. for n=1:num/BlockLength
    32. y_ofdm((n-1)*BlockLength+1:n*BlockLength,1)=OFDM(x((n-1)*BlockLength+1:n*BlockLength),h);
    33. % 经过ofdm调制
    34. end
    35. y_ofdm=awgn(y_ofdm,snr,'measured');
    36. HEst=fft([hEst;zeros(BlockLength-length(hEst),1)]);
    37. for n=1:num/BlockLength
    38. y_demod((n-1)*BlockLength+1:n*BlockLength)=y_ofdm((n-1)*BlockLength+1:n*BlockLength)./HEst;
    39. end
    40. %%系统判决
    41. s=[0:BlockLength-1];
    42. wholey_demod=[];
    43. for mn=1:num
    44. wholeD=[];
    45. for m=1:BlockLength
    46. D=norm((y_demod(mn)-psk(m)),2);
    47. wholeD=[wholeD,D];
    48. end
    49. dom=min(wholeD);
    50. w=find(wholeD==min(wholeD));
    51. y_demod(mn)=s(w);
    52. wholey_demod=[wholey_demod,y_demod(mn)];
    53. end
    54. wholey_demod1=wholey_demod';
    55. symble_error=sum(not(wholey_demod1==x_int));
    56. SER1=symble_error/num;
    57. BER_R(i,snr+1)=SER1;%[BER_R,SER1];
    58. end
    59. end
    60. BER_R800=mean(BER_R,1);
    61. %%正交导频信道估计
    62. BER_Q=[];
    63. for i=1:100
    64. for snr=0:30
    65. XMse(:,1)=zeros(NBlock,1)+1;
    66. AMse=[diag(XMse(:,1))*DFTMatrix(:,1:length(h))];
    67. YMse=AMse*h;
    68. YMse=awgn(YMse,snr,'measured');
    69. hEstMse=pinv(AMse)*YMse;%信道估计h
    70. y_awgn=awgn(x,snr,'measured');
    71. y_multipath=conv(x,h);
    72. for n=1:num/BlockLength
    73. y_ofdm((n-1)*BlockLength+1:n*BlockLength,1)=OFDM(x((n-1)*BlockLength+1:n*BlockLength),h);
    74. % 经过ofdm调制
    75. end
    76. y_ofdm=awgn(y_ofdm,snr,'measured');
    77. HEstMse=fft([hEstMse;zeros(BlockLength-length(hEstMse),1)]);
    78. for n=1:num/BlockLength
    79. y_demod((n-1)*BlockLength+1:n*BlockLength)=y_ofdm((n-1)*BlockLength+1:n*BlockLength)./HEstMse;
    80. end
    81. %%系统判决
    82. s=[0:BlockLength-1];
    83. wholey_demod=[];
    84. for mn=1:num
    85. wholeD=[];
    86. for m=1:BlockLength
    87. D=norm((y_demod(mn)-psk(m)),2);
    88. wholeD=[wholeD,D];
    89. end
    90. dom=min(wholeD);
    91. w=find(wholeD==min(wholeD));
    92. y_demod(mn)=s(w);
    93. wholey_demod=[wholey_demod,y_demod(mn)];
    94. end
    95. wholey_demod1=wholey_demod';
    96. symble_error=sum(not(wholey_demod1==x_int));
    97. SER1=symble_error/num;
    98. BER_Q(i,snr+1)=SER1;
    99. end
    100. end
    101. BER_Q800=mean(BER_Q,1);
    102. snr=0:30;
    103. figure(1);
    104. semilogy(snr,BER_R800,'b-o',snr,BER_Q800,'r-*');
    105. legend('随机导频','正交导频');
    106. title('BER与snr的关系图');
    107. xlabel('snr');
    108. ylabel('BER');

    六、结果分析

    (1)为啥要进行蒙特卡洛?

         通过大量的重复实验把某一件事情发生的频率当作概率。 如果重复次数少得到的结论是非常不可靠的。

    (2)五里面题目第一问:

    信噪比0:20,用户数7,多径数20,蒙特卡洛100次

    (3)五里面题目第二问: 

    信噪比0:20,用户数1,多径数6,蒙特卡洛100次

     七、结尾

           利用MATLAB程序仿真实现了LS以及MMSE两种分别基于随机导频和正交导频的信道估计方法,  给出了两者的MSE及BER随信噪比变化的曲线。通过上面图片分析效果很明显,也不用多解释了,有什么疑问可以加我好友。我是一名热爱生活的通信汪,虽然生活很苦但是知识很甜,一起加油吧各位通信汪!!!

  • 相关阅读:
    Python控制流简介(条件语句、循环语句、异常处理语句)
    RedHat8升级GLIBC_2.29,解决ImportError: /lib64/libm.so.6: version `GLIBC_2.29
    jQuery 选择器
    C# IEnumerable<T>介绍
    Flink的状态后端(State Backends)
    Docker系列第03部分:列出镜像+搜索镜像+拉取镜像+删除镜像
    springboot监控
    计算机毕业设计(附源码)python学生宿舍管理系统
    初识Spring(一)
    39、一篇文章弄懂 Java 正则表达式中的量词、贪婪、勉强、独占和 String 的 matches 方法的底层【个人感觉非常值得学习】
  • 原文地址:https://blog.csdn.net/qq_45049500/article/details/127325967