对于SOMP算法的测试

2024-05-08 07:20
文章标签 算法 测试 somp

本文主要是介绍对于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 3for t = 1:s% 初始化原子投影proj=[];% 4for j=1:Nproj = [proj,norm(r'*PHI(:,j),1)];end% 选取最大投影对应的原子索引[~, index] = max(proj);Omega = [Omega, index];% 重构X的每行元素for k=1:KX_hat(Omega,k)=pinv(PHI(:,Omega))*Y(:,k);end%更新测量向量投影Y_tplus1 = PHI(:,Omega)*pinv(PHI(:,Omega))*Y;%更新残差r = Y - Y_tplus1;endend

本代码复现自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 boundx = zeros(N,L); % Initializing sparse vector to be recovereduset = randperm(N,k); x(uset,:) = sqrt(0.5)*(randn(k,L) + 1i*randn(k,L)); % Sparse vector initializednoise = sqrt(1/2)*(randn(M,L) + 1i*randn(M,L)); % zero mean, unit covariance complex noise vectorpower=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 boundx = zeros(N,L); % Initializing sparse vector to be recovereduset = randperm(N,sp); x(uset,:) = sqrt(0.5)*(randn(sp,L) + 1i*randn(sp,L)); % Sparse vector initializednoise = sqrt(1/2)*(randn(M,L) + 1i*randn(M,L)); % zero mean, unit covariance complex noise vectorpower=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里的信道估计。

这篇关于对于SOMP算法的测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969684

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1