自从开始研究毫米波通信之后,读了几篇经典论文,这其中就包括2014年这篇《Spatially Sparse Precoding in Millimeter wave MIMO Systems》。在把文章读的差不多之后,导师建议我自己尝试写一下这篇文章中的OMP算法。于是我在知乎、博客、书籍等渠道搜集了一下OMP算法的讲解,其中知乎上有一篇OMP讲解的十分透彻,用具体的数值将MP和OMP按照计算步骤进行对比,深入浅出,很适合新手入门,网址如下:https://zhuanlan.zhihu.com/p/52276805

虽说论文中已经给出了OMP算法的伪代码,但是到自己上手的时候就犯了难:开始时会疑惑字典集如何选取,Fbb和Frf还有Fopt的矩阵维度未知等问题。搜集资料时发现matlab自带的OMP函数正是根据2014这篇论文来写的。在看matlab自带的OMP函数时恍然大悟:封装成函数后这些只需外部输入参数就好,而字典集选取是根据不同场景进行。读懂matlab自带的OMP函数也费了一番功夫,故通过本文记录学习代码的问题。

OMP算法就是简单来说就是给定压缩信号y和压缩矩阵A求解重构矩阵x。

论文中给出的OMP算法:

论文的优化目标是下式(1)

    (1)

算法可以分为以下几步:

1. 将信号Fopt赋值给压缩信号Fres

2.在字典集At中寻找对Fres贡献值最大的原子(可以通过矩阵相乘得出Φ=At’*Fres)。

3.根据Φ选出贡献值最大的原子,并将它放入新的压缩矩阵Frf,通过最小二乘法式(3)计算新压缩矩阵Frf对Fres的贡献值。

4.最小二乘法得到的贡献值将赋给重构信号矩阵Fbb。

5.删除所选矢量的贡献值,更新压缩信号Fres。

6.重复步骤1234,直到原压缩矩阵的所有列都被选完。

(2)

(2)的解为式(3)

(3)

其中

注:上式(2)和(2)的解式都摘自知乎文章https://zhuanlan.zhihu.com/p/52276805(可以把Fopt看做是y,Frf看做新的压缩矩阵Anew,Fbb看做λ。)

下面是matlab2019b版本工具箱中的OMP函数,博主给每句代码都加了中文注释,如有异见请在评论中写出,可以共同讨论一下。

function [Fbb,Frf] = helperOMPTransmitWeights(H,NtRF,Ns,At)
% helperOMPTransmitWeights is in support of
% MassiveMIMOHybridBeamformingExample. It may change in a future release.

%   Copyright 2017 The MathWorks, Inc.

%   Reference:
%   [1] Oma El Ayach, et al.,"Spatially Sparse Precoding in Millimeter wave
%   MIMO Systems", IEEE Transactions on Wireless Communications, Vol. 13,
%   No. 3, March 2014.

% use Comms convention
[~,~,v] = svd(H.');%正常的svd分解得到的是v',要得到v只需求H'的svd分解,故此处是对H'进行svd分解。
Fopt = v(:,1:Ns);%最初发射信号维度是Ns*1,由于是转置后的v赋值给Fopt,所以是Ns列
Nt = size(H,1);%返回信道H的行数

% Algorithm 1: Spatially sparse precoding via Orthogonal Matching Pursuit
Frf = complex(zeros(Nt,NtRF));%生成Nt*NtRF维复数矩阵
Fres = Fopt;                  %将理想信号赋值给恢复矩阵
for m = 1:NtRF              
    Psi = At'*Fres;          %所有的原子贡献度,得到的Psi是一个列向量
    [~,k] = max(diag(Psi*Psi'));          %Psi*Psi'得到的对角线值是各个原子贡献值的平方,max输出列向量最大值的行号
    Frf(:,m) = At(:,k);                                % 将最大贡献值对应原子赋值给新的压缩矩阵
    Fbb = (Frf(:,1:m)'*Frf(:,1:m))\(Frf(:,1:m)'*Fopt); % 计算新压缩矩阵的最小二乘解
    temp = Fopt-Frf(:,1:m)*Fbb;
    Fres = temp/norm(temp,'fro');           %更新压缩信号
end
Fbb = sqrt(Ns)*Fbb/norm(Frf*Fbb,'fro');  %功率约束

% match H.'*Frf*Fbb*X.' to X*Fbb*Frf*H
Fbb = Fbb.';    %矩阵转置
Frf = Frf.';

% [EOF]

学习笔记:OMP算法(Spatially Sparse Precoding in Millimeter wave MIMO Systems)相关推荐

  1. 论文笔记《Spatially Sparse Precoding in Millimeter Wave MIMO Systems》

    论文笔记<Spatially Sparse Precoding in Millimeter Wave MIMO Systems> 背景 增加商业无线系统可用的频谱,通过探索新的不那么受限的 ...

  2. 【统计学习方法】学习笔记——EM算法及其推广

    统计学习方法学习笔记--EM算法及其推广 1. EM算法的引入 1.1 EM算法 1.2 EM算法的导出 1.3 EM算法在非监督学习中的应用 2. EM算法的收敛性 3. EM算法在高斯混合模型学习 ...

  3. 混合波束成形| 部分连接系统 :Hybrid Precoding for mmWave Massive MIMO Systems With Partially-Connected Structure

    文章目录 问题背景 系统模型 PCS-HP设计的分析 PCS-HP的分阶段设计 模拟precoding的设计 情况一 情况二 结论 相关阅读 <Hybrid Precoding for mmWa ...

  4. c语言算法有效性,BerForest—C语言学习笔记-《算法》

    这是我学习C语言的笔记,也可以算是回忆录,反正有利于我的学习,也可以让C语言的新手借鉴. 许多人都在盲目的学习编程,其实学习编程无为就是学习一些编程语法.即使学会了,也不一定能够自己独立的编写出程序了 ...

  5. 目标检测学习笔记--DSSD算法

    1. 论文笔记 1.1 YOLO网络结构 论文链接:http://cn.arxiv.org/pdf/1506.02640 1.2 SSD网络结构 论文链接:http://cn.arxiv.org/pd ...

  6. 吴恩达神经网络和深度学习-学习笔记-12-RMSprop算法

    全称是root mean square prop算法 我们假设纵轴方向为b,横轴方向为W.我么希望纵轴slow,横轴fast. 对于第t次迭代,公式如上图. 我们希望W方向fast,B方向slow,所 ...

  7. 【学习笔记】算法101--数学(二)2.3篇

    前言: 学习<算法101>,每天进步一点点,加油

  8. 视频插帧—学习笔记(算法+配置+云服务+Google-Colab)

    恰好碰到同学项目需要,了解了一下关于利用深度学习视频插帧的相关知识,在这里做一个简单的记录. 目录 一.方法+论文 1.DAIN (Depth-Aware Video Frame Interpolat ...

  9. (JAVA学习笔记) 冒泡排序算法

    public class Demo06 {public static void main(String[] args) {int[] arr = {51,512,12,53,415,852,631,8 ...

  10. Fabric学习笔记-PBFT算法

    本文介绍了实用拜占庭容错算法(PBFT). Fabric在v0.6中采用的是PBFT算法,在v1.0.0-preview中是SBFT算法,在v1.0.0-release中文档上说PBFT还在开发中,项 ...

最新文章

  1. layui 横向表单_对layui中表单元素的使用详解
  2. Django基础知识
  3. Java compiler level does not match解决方法
  4. c++设置单元格填充色_更改数据后单元格自动填充颜色,从此以后再也不用核对数据了...
  5. 新手学逆向,调试abexcm1过程
  6. iis同时运行asp和php,服务器IIS同时支持ASP和PHP
  7. Java技术:Optional 相关用法介绍笔记
  8. SQL语句大全,所有的SQL都在这里 !极度建议收藏...
  9. 正则匹配不包含某字符串_如何替换JS字符串中匹配到多处中某一指定节点?
  10. c#仿照qq登录界面编辑框内容操作
  11. leetcode 397 整数替换
  12. iTunes Connect(一) —— iOS应用上架到AppStore
  13. 数字表达_英语数字表达方法大全,内含数字/分数/时间/序数词/日期/小数等
  14. random.choice与random.choices
  15. JDE 系统表(标准表)
  16. 汇川AM系列Modbus通信设置
  17. softmax 激活函数
  18. Windows下编译apr、apr-util
  19. matplotlib用Times New Roman且不加粗
  20. 浅析直播间海量聊天消息的架构设计难点

热门文章

  1. 睿智的seq2seq模型4——往英文到法文的翻译里加上注意力机制
  2. 服务器双硬盘系统安装系统安装,固态机械混合安装教程!双硬盘安装系统的方法...
  3. 安装FileFormatConverters,出现错误“无法使用此产品的安装源。请确认安装源存在,并且您可以访问它”
  4. 土豆视频ipad 5.0 客户端
  5. 我为什么要写《OpenCV Android 开发实战》这本书
  6. Stanford CS224N: PyTorch Tutorial (Winter ‘21) —— 斯坦福CS224N PyTorch教程 (第三部分)
  7. (转)开源的大文件上传组件NeatUpload
  8. mysql修改数据sql语句_sql语句修改数据
  9. 官网下载STM32系列芯片的产品选型手册
  10. 编译原理初学者入门指南