对于SOMP算法的测试

刚开始只上传了SOMP算法的代码,并没有过多介绍。

所以本篇文章对SOMP算法用法进行一个介绍

SOMP算法代码

function [X_hat] = MMV_SOMP(Y, PHI, s)
    % SOMP:同时正交匹配追踪 simultaneous orthogonal matching pursuit
    %         论文:J. Determe, J. Louveaux, L. Jacques and
    %         F. Horlin, \On the Noise Robustness of Simultaneous Orthogonal Matching Pursuit,"
    %         in IEEE Transactions on Signal Processing, vol. 65, no. 4, pp. 864-875, Feb. 15
    %         2017. doi: 10.1109/TSP.2016.2626244. http://ieeexplore.ieee.org/document/7738592/
    % write:zts
    % date:23,11,17
    % version:1.0
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 参数:
    % Y: 观测矩阵,每列是一个观测向量
    % PHI: 字典矩阵
    % s: 稀疏度
    
    % 获取矩阵大小 
  
    [~, N] = size(PHI);
    [~, K] = size(Y);
	% 1 初始化残差和索引
    r = Y;
	% 初始化索引集
    Omega = [];
    % 初始化重构矩阵
    X_hat=zeros(N,K);
	% 2 3
    for t = 1:s
	
		% 初始化原子投影
		proj=[];
		% 4
		for j=1:N
			proj = [proj,norm(r'*PHI(:,j),1)];
		end
        % 选取最大投影对应的原子索引
        [~, index] = max(proj);
        Omega = [Omega, index];
        % 重构X的每行元素
        for k=1:K
             X_hat(Omega,k)=pinv(PHI(:,Omega))*Y(:,k);
        end
		%更新测量向量投影
		Y_tplus1 = PHI(:,Omega)*pinv(PHI(:,Omega))*Y;
        %更新残差
        r = Y - Y_tplus1;
 
    end

end

本代码复现自SOMP论文。

SOMP算法解决的是具有公共稀疏集的压缩感知内稀疏信号恢复问题。

要求信号是行稀疏。最初的代码是要求已知稀疏度的,后面在各个场景里应用的代码是通过门限来判断的,一般的门限适合噪声方差有关的。

测试信噪比-NMSE

如果观测矩阵不是独立同分布的,可能算法就不会工作,当然很多算法对这点的要求都很高。

第一个先测试信噪比对算法影响

clc;
clear all;
N = 128; % length of vector to be recovered
M = 64; % number of measurement
L=16;% number of layer
k =13; % Sparsity level
niter = 50; % number of iteration
SNR_dB=0:5:25;
NMSE_dB = zeros(1,length(SNR_dB));
for n=1:length(SNR_dB)
    SNR_dB_now = SNR_dB(n);
    A = sqrt(1/2)*(randn(M,N) + 1i*randn(M,N)); % Sensing matrix construction for theroetical bound
    x = zeros(N,L); % Initializing sparse vector to be recovered
    
    uset = randperm(N,k); 
    x(uset,:) = sqrt(0.5)*(randn(k,L) + 1i*randn(k,L)); % Sparse vector initialized
    noise = sqrt(1/2)*(randn(M,L) + 1i*randn(M,L)); % zero mean, unit covariance complex noise vector
    power=sum(abs(A*x).^2,'all')/M/L;
    var = power/(10^(0.1*SNR_dB_now));
    noise = sqrt(var)*noise;
    y = A*x + noise; % create measurement
    %% 算法测试
    [X_hat] = MMV_SOMP(y, A, k);
     NMSE_dB(n) = 10*log10( norm(X_hat-x)^2/(norm(x)^2));
end
plot(SNR_dB,NMSE_dB,'r-o');
legend('SOMP');
xlabel('SNR\_dB'),ylabel('NMSE\_dB');
title('测试');

可以看出性能还不错,缺点就是复杂度过高。当然如果没有这个公共支撑集,我们看执行L次的单测量OMP。

OMP的算法在之前的博客里贴的也有,当然问GPT也能问出来,OMP应该是最容易复现的代码了,就不再次贴出来了。

可以看出OMP没有利用公共稀疏集,所以性能有些损失。当然这是单次实验,可能偶尔有重合的机会。

测试稀疏度-NMSE

clc;
clear all;
N = 128; % length of vector to be recovered
M = 64; % number of measurement
L=16;% number of layer
k =5:5:40; % Sparsity level
niter = 50; % number of iteration
SNR_dB=20;
NMSE_dB_SOMP = zeros(1,length(k));
NMSE_dB_OMP = zeros(1,length(k));
for n=1:length(k)
    sp = k(n);
    A = sqrt(1/2)*(randn(M,N) + 1i*randn(M,N)); % Sensing matrix construction for theroetical bound
    x = zeros(N,L); % Initializing sparse vector to be recovered
    
    uset = randperm(N,sp); 
    x(uset,:) = sqrt(0.5)*(randn(sp,L) + 1i*randn(sp,L)); % Sparse vector initialized
    noise = sqrt(1/2)*(randn(M,L) + 1i*randn(M,L)); % zero mean, unit covariance complex noise vector
    power=sum(abs(A*x).^2,'all')/M/L;
    var = power/(10^(0.1*SNR_dB));
    noise = sqrt(var)*noise;
    y = A*x + noise; % create measurement
    %% 算法测试
   [X_hat] = MMV_SOMP(y, A, sp);
   NMSE_dB_SOMP(n) = 10*log10( norm(X_hat-x)^2/(norm(x)^2));
    x_omp=	MMV_OMP(y,A,L,sp);
    NMSE_dB_OMP(n) = 10*log10( norm(x_omp-x)^2/(norm(x)^2));
end
plot(k,NMSE_dB_SOMP,'r-o',k,NMSE_dB_OMP,'g-+');
legend('SOMP','OMP');
xlabel('稀疏度'),ylabel('NMSE\_dB');
title('20dB测试');

可以看出来SOMP还是比较平滑的,最大稀疏度是40/128=0.3125.而到了OMP,效果就不是很好了。

当然咱们压缩感知贪婪算法是要满足RIP条件的,欠定度也很是影响算法的运行成效。

当然什么系统适合这个算法呢,我觉得像多天线系统,或者是OFDM里的信道估计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依plus 某些接口(用户信息等)响应突然变慢

今天一大早起来发现我的接口突然响应变慢了! 就什么都没动,啥也没改,但是一些接口又很快。 百度了很多,都说叫我改sql查询方式,又怀疑是过滤器的问题,很遗憾都不是! 一个响应40秒!…

[译文] 恶意代码分析:1.您记事本中的内容是什么?受感染的文本编辑器notepad++

这是作者新开的一个专栏,主要翻译国外知名安全厂商的技术报告和安全技术,了解它们的前沿技术,学习它们威胁溯源和恶意代码分析的方法,希望对您有所帮助。当然,由于作者英语有限,会借助LLM进行校验和润色&am…

IOT-9608I-L ADC端口的使用(连续采样ADC值)

目录 概述 1 硬件介绍 1.1 认识硬件 1.2 引脚信号定义 2 软件功能实现 2.1 查看iio:device0下的接口信息 2.2 实现连续采样ADC 2.2.1 功能描述 2.2.2 代码实现 2.2.3 详细代码 3 测试 概述 本文主要讲述IOT-9608I-L ADC端口的使用方便,其内容包括板卡上的…

密室逃脱游戏-第12届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第58讲。 密室逃脱游戏&…

2024年第九届数维杯数学建模B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章🔥:探索设计模式的魅力:分布式模…

Ubuntu添加网络映射路径

参考资料 linux挂在阿里云盘(webdav协议)给服务器扩容、备份数据等_davfs2-CSDN博客 Linux将WebDAV为本地磁盘 - 夏日冰菓 (lincloud.pro) systemd系统开机运行rc.local_rc-local.service: failed to execute command: exec -CSDN博客 系统版本&#xff…

word格式技巧

文章目录 论文格式技巧论文交叉引用怎么弄论文的页码怎么弄 论文格式技巧 论文交叉引用怎么弄 1.取消文献原有的编号 2.定义新编号 3.具体编号设置 4.在引用的地方插入,具体引用选项卡–>交叉引用–>选择后插入 2. 4. 论文的页码怎么弄 假设我们有这样一…

List的两种实现

前置知识: 数组 baseAddress:数组的首地址 dataTypeSize:数组中元素类型的大小,如int为4字节 为什么数组索引从0开始,假如从1开始不行吗? 在根据数组索引获取元素的时候,会用索引和寻址公式来计…

HBase 读写流程

HBase 读写流程 1. 读流程 Client先访问zookeeper,从zookeeper获取meta region的位置从meta region中读取meta表中的数据,meta中存储了用户表的region信息;根据namespace、表名和rowkey在meta表中找到对应的region信息;找到这个r…

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目: 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置,完成设置。 添加依赖: 如果你的库需要额外的依赖,可以在 build.gradle (Module: app…

文件各种上传,离不开的表单 [html5]

作为程序员的我们,经常会要用到文件的上传和下载功能。到了需要用的时候,各种查资料。有木有..有木有...。为了方便下次使用,这里来做个总结和备忘。 利用表单实现文件上传 最原始、最简单、最粗暴的文件上传。 前端代码: //方…

oracle 清理 trace 和 alert 日志文件

某天,发现磁盘空间被占满了,继续查询发现是 oracle 的日志文件占满了磁盘空间 其中: trace文件有35G, alert 有23G 目录地址是: diag/rdbms/orcl/orcl/trace, diag/rdbms/orcl/orcl/alert 都是在 oracle 目录下的 diag 目录内部 # 可以使用 以下命令对目录大小进行排…

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

视频剪辑图文实例:一键操作,轻松实现视频批量片头片尾减时

视频剪辑是现代媒体制作中不可或缺的一环,而批量处理视频更是许多专业人士和爱好者的常见需求。在剪辑过程中,调整视频的片头片尾时长可以显著提升视频的质量和观感。本文将通过图文实例的方式,向您展示如何一键操作,轻松实现视频…

借助Aspose.SVG图像控件,在线将 PNG 转换为 Base64 字符串

Aspose.SVG for .NET 是用于SVG文件处理的灵活库,并且与其规范完全兼容。API可以轻松加载,保存和转换SVG文件,以及通过其文档对象模型(DOM)读取和遍历文件的元素。API独立于任何其他软件,使开发人员无需使用…

jenkins+gitlab+ansible-tower实现发布

前提准备: gitlab中上传相应的jenkinsfile文件和源码。 安装和破解ansible-tower。 安装jenkins。 大致流程:从gitlab中拉取文件,存放到windows机器上,使用nuget等进行打包到windows中,使用sshPublisher语句传输到远程…

必应bing国内广告怎么做付费推广,提升产品曝光?

必应Bing作为微软旗下重要的搜索引擎平台,拥有着不可忽视的用户基础和市场潜力。对于寻求拓宽市场、提高品牌知名度的企业而言,利用必应Bing进行付费推广无疑是明智之选。通过必应Bing国内广告进行高效付费推广,助您轻松提升产品曝光度。 一…

windows vscode设置扩展和缓存目录

vscode的扩展和缓存占了很大的空间,而且默认在C盘,很烦。。。 修改vscode快捷方式的目标处:"C:\Users\Nv9\AppData\Local\Programs\Microsoft VS Code\Code.exe" --extensions-dir "D:\Program Cache\VScode\extensions"…

Ansible Playbook关键字 | 快速入门 | 案例教程

一、【写在前面】 1. 废话 笔者最近在规划写几篇连续的文章,想来想去还是Ansible最值得记录: 一来是此工具学习曲线比较平缓,不会一看文档就不想学了,早期学习性价比非常高; 其次、这个东西基本都要用到,…