草庐IT

基于导频的信道估计实现

通信汪的美好生活 2024-02-26 原文

目录

零、前言

一、为什么要信道估计

二、导频的概念

(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移动多普勒效应
图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块长”才是正确答案,这涉及到的是未知数和方程个数之间的关系。

代码:

function Y=OFDM(x,h)

x_ifft=ifft(x);
x_cir=[x_ifft(length(x_ifft)-length(h):length(x_ifft));x_ifft;];

y_cir=conv(x_cir,h);

y_nocir=y_cir(length(h)+2:length(h)+2+length(x)-1);

Y=fft(y_nocir);
clc
clear all;
close all;
NBlock=50;
WN=exp(-j*2*pi/NBlock);    %DFT 离散傅里叶变换

for n=1:NBlock
    for k=1:NBlock
        DFTMatrix(k,n)=WN^((n-1)*(k-1)); %傅里叶变换矩阵构造
    end
end
for i=1:7
 X(:,i)=randn(NBlock,1);
end


%%用户数为7,并根据信道参数构造A
h1=[0.7;0.5;0.3;];
h2=[0.7;0.5;0.3;];
h3=[0.4;0.6;0.1;];
h4=[0.3;0.4;];
h5=[0.3;0.5;0.7;];
h6=[0.1;0.6;0.1;];
h7=[0.7;0.4;0.2;];
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))];
XMse(:,1)=zeros(NBlock,1)+1;
for K=1:NBlock
 XMse(K,2)=exp(-j*2*pi*(length(h1))*(K-1)/NBlock);
end
for K=1:NBlock
 XMse(K,3)=exp(-j*2*pi*(length(h1)+length(h2))*(K-1)/NBlock);
end
for K=1:NBlock
 XMse(K,4)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3))*(K-1)/NBlock);
end
for K=1:NBlock
 XMse(K,5)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4))*(K-1)/NBlock);
end
for K=1:NBlock
 
 XMse(K,6)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4)+length(h5))*(K-1)/NBlock);
end
for K=1:NBlock
    XMse(K,7)=exp(-j*2*pi*(length(h1)+length(h2)+length(h3)+length(h4)+length(h5)+length(6))*(K-1)/NBlock);
end
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))  ];


%%随机导频
h=[h1;h2;h3;h4;h5;h6;h7];
for i=1:800
for snr=0:20
    Y=A*h;
    Y=awgn(Y,snr,'measured');
    hEst=pinv(A)*Y;  %信道估计
  % LS_MSE(snr+1)= norm(hEst-mean(hEst*(1:length(hEst))))./21; 
    LS_MSE(snr+1,i)= norm((hEst)-h',2)/100; 
end
end
LS_MSE800=mean( LS_MSE,2);


%%正交导频
 for i=1:800
for snr=0:20
YMse=AMse*h;
YMse=awgn(YMse,snr,'measured');
hEstMse=pinv(AMse)*YMse;%信道估计h 
%MMSE_MSE(snr+1)= norm(hEstMse-mean(hEstMse*(1:length(hEstMse))))./21; 
 MMSE_MSE(snr+1,i)= norm((hEstMse)-h',2)/100; 
end
%MMSE_MSE()
 end
MMSE_MSE800=mean( MMSE_MSE,2);
figure(1);
semilogy(0:20,LS_MSE800,'b-o',0:20,MMSE_MSE800,'r-*');
legend('随机导频','正交导频');
title('Mse与snr的关系图');
xlabel('snr');
ylabel('Mse');

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

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

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

代码:

clc
clear all;
close all;

num=8000; 
x_int=randi(8,num,1)-1; % 随机产生800个8进制整数
plot(x_int,'*');
for m=1:8
    psk(m,1)=cos(11*pi/8-(m-1)*pi/4)+i*sin(11*pi/8-(m-1)*pi/4);
end
x=psk(x_int+1);% 8psk调制 x是x_int调制后的信号
BlockLength=8;
NBlock=8;


WN=exp(-j*2*pi/NBlock);    %DFT 离散傅里叶变换

for n=1:NBlock
    for k=1:NBlock
        DFTMatrix(k,n)=WN^((n-1)*(k-1)); %傅里叶变换矩阵构造
    end
end

h=[0.8;0.5;0.3;0.15;0.1;0.05];
BER_R=[];
%%随机导频信道估计
 for i=1:100
for snr=0:30
   
    X(:,1)=randn(NBlock,1);
    A=[diag(X(:,1))*DFTMatrix(:,1:length(h))];
    Y=A*h;
    Y=awgn(Y,snr,'measured');
    hEst=pinv(A)*Y;  %信道估计h
    y_awgn=awgn(x,snr,'measured');
    y_multipath=conv(x,h);
    for n=1:num/BlockLength
    y_ofdm((n-1)*BlockLength+1:n*BlockLength,1)=OFDM(x((n-1)*BlockLength+1:n*BlockLength),h);
    % 经过ofdm调制
    end
    y_ofdm=awgn(y_ofdm,snr,'measured');
    HEst=fft([hEst;zeros(BlockLength-length(hEst),1)]);
    for n=1:num/BlockLength
    y_demod((n-1)*BlockLength+1:n*BlockLength)=y_ofdm((n-1)*BlockLength+1:n*BlockLength)./HEst;
    end

   
%%系统判决
s=[0:BlockLength-1];
wholey_demod=[]; 
for mn=1:num
    wholeD=[];
    for m=1:BlockLength       
    D=norm((y_demod(mn)-psk(m)),2); 
    wholeD=[wholeD,D];
   end
    dom=min(wholeD);
    w=find(wholeD==min(wholeD));
    y_demod(mn)=s(w);
    wholey_demod=[wholey_demod,y_demod(mn)];
end
wholey_demod1=wholey_demod';
symble_error=sum(not(wholey_demod1==x_int));
SER1=symble_error/num;
BER_R(i,snr+1)=SER1;%[BER_R,SER1];

end

 end
 BER_R800=mean(BER_R,1);

%%正交导频信道估计
BER_Q=[];
for i=1:100
for snr=0:30
        XMse(:,1)=zeros(NBlock,1)+1;

AMse=[diag(XMse(:,1))*DFTMatrix(:,1:length(h))];
YMse=AMse*h;
YMse=awgn(YMse,snr,'measured');
hEstMse=pinv(AMse)*YMse;%信道估计h
    y_awgn=awgn(x,snr,'measured');
    y_multipath=conv(x,h);
    for n=1:num/BlockLength
    y_ofdm((n-1)*BlockLength+1:n*BlockLength,1)=OFDM(x((n-1)*BlockLength+1:n*BlockLength),h);
    % 经过ofdm调制
    end
    y_ofdm=awgn(y_ofdm,snr,'measured');
    HEstMse=fft([hEstMse;zeros(BlockLength-length(hEstMse),1)]);
    for n=1:num/BlockLength
    y_demod((n-1)*BlockLength+1:n*BlockLength)=y_ofdm((n-1)*BlockLength+1:n*BlockLength)./HEstMse;
    end

%%系统判决
s=[0:BlockLength-1];
wholey_demod=[]; 
for mn=1:num
    wholeD=[];
    for m=1:BlockLength       
    D=norm((y_demod(mn)-psk(m)),2); 
    wholeD=[wholeD,D];
   end
    dom=min(wholeD);
    w=find(wholeD==min(wholeD));
    y_demod(mn)=s(w);
    wholey_demod=[wholey_demod,y_demod(mn)];
end
wholey_demod1=wholey_demod';
symble_error=sum(not(wholey_demod1==x_int));
SER1=symble_error/num;
BER_Q(i,snr+1)=SER1;
end
end
 BER_Q800=mean(BER_Q,1);
snr=0:30;

figure(1);
semilogy(snr,BER_R800,'b-o',snr,BER_Q800,'r-*');
legend('随机导频','正交导频');
title('BER与snr的关系图');
xlabel('snr');
ylabel('BER');

六、结果分析

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

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

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

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

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

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

 七、结尾

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

有关基于导频的信道估计实现的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  9. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  10. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

随机推荐