压缩感知(Compressed Sensing)的MATLAB仿真实现

在前一篇文章:正交匹配追踪(Orthogonal Matching Pursuit, OMP)的MATLAB实现中,我们介绍了针对稀疏信号进行压缩感知的MATLAB仿真。
本篇我们介绍一下针对的是原始的非稀疏信号,看看如何进行处理。
本文中,我们直接进行了采样处理。

程序仿真

我们使用MATLAB,构造了omp函数实现。

MATLAB程序

clc;
clearvars;%% 参数设定
lam = 0.37;          % 正则化参数
itrs = 400;          % 最大迭代次数
m = 380;             % 采样数量
sig = 0.5;           % 噪声标准差
n = 1024;            % 原始信号长度
samplingRate = 1/2000; % 采样率
T = (n-1)*samplingRate; % 信号持续时间
t = (0:samplingRate:T)'; % 时间向量% 1. 构造 (cos+sin) 序列
origSignal = sin(123*pi*t) + cos(456*pi*t)*7;% 2. 使用 DCT 矩阵作为稀疏基
DCTMatrix = dctmtx(n);%% ------- 采样过程 开始 -------
% 根据给定随机种子生成测量矩阵
rng(10,'twister'); % 设置随机种子
indices = randperm(n)';
measurementMatrix = DCTMatrix(indices(1:m),:);% 采样
sampledSignal = origSignal(indices(1:m));% 生成噪声并加到采样信号上
rng(20); % 设置随机种子
noise = sig * randn(m,1);
sampledNoisySignal = sampledSignal + noise;% ------- 采样过程 结束 -------%% ------- 恢复过程 开始 -------
% 使用 OMP 算法进行信号恢复
K=100;
recoveredCoeffs= orthogonal_matching_pursuit(sampledNoisySignal, measurementMatrix, K);% 将稀疏域中的系数转换回信号空间
recoveredSignal = DCTMatrix' * recoveredCoeffs';
% ------- 恢复过程 结束 -------%%  ------- 结果可视化 -------% 可视化原始信号和恢复信号
figure;
plot(t, origSignal, 'b', t, recoveredSignal, 'r');
title('原始与恢复信号对比');
legend('原始 (cos+sin) 信号', 'OMP 重构信号');% 局部可视化信号对比
timeWinStart = 50 * samplingRate;
timeWinEnd = 100 * samplingRate;
timeWindow = (timeWinStart:samplingRate:timeWinEnd)';
figure;
plot(timeWindow, origSignal(50:100), 'b', timeWindow, recoveredSignal(50:100), 'r', 'linewidth', 1.5);
title('原始与恢复信号对比(局部)');
legend('原始 (cos+sin) 信号', 'OMP 重构信号');%% 正交匹配追踪(Orthogonal Matching Pursuit, OMP)的MATLAB实现
function reconstructed_signal = orthogonal_matching_pursuit(input_signal, measurementMatrix, items)
% OMP算法实现
% 输入参数:
%   input_signal: 输入信号(实测信号)
%   measurementMatrix: 测量矩阵(恢复矩阵)
%   items: 迭代次数
% 输出参数:
%   reconstructed_signal: 重构信号signal_length = max(size(measurementMatrix));
atom_num = min(size(measurementMatrix));
reconstructed_signal = zeros(1, signal_length); % 待重构的向量
selected_atoms = []; % 记录选择的原子
residual_signal = input_signal; % 残差信号for iter = 1:items % 迭代次数for idx = 1:signal_length % 遍历字典中的原子inner_product(idx) = abs(measurementMatrix(:, idx)' * residual_signal); % 计算投影系数end[max_val, max_pos] = max(inner_product); % 最大投影系数及位置selected_atoms = [selected_atoms, measurementMatrix(:, max_pos)]; % 更新选择的原子measurementMatrix(:, max_pos) = zeros(atom_num, 1); % 选中的原子置零least_squares_coeff = (selected_atoms' * selected_atoms)^(-1) * selected_atoms' * input_signal; % 最小二乘法,拟合残差residual_signal = input_signal - selected_atoms * least_squares_coeff; % 更新残差iteration_error(iter) = norm(residual_signal, 2); % 记录迭代误差pos_array(iter) = max_pos; % 记录最大投影系数的位置if iteration_error(iter) < 1e-6break; % 达到误差要求时跳出循环end
endreconstructed_signal(pos_array) = least_squares_coeff; % 重构信号
end

输出图像

输出的图像如下,可以看到,原始信号和恢复信号非常接近。
在这里插入图片描述

放大局部看一下:

在这里插入图片描述

知识点回顾

压缩感知(Compressed Sensing,CS)是一种信号处理技术,它利用信号的稀疏性,可以在远低于奈奎斯特率的采样频率下对信号进行采样和重构。稀疏性是指信号在某个变换域(如傅里叶变换、小波变换等)下的表示只有少数几个非零元素。

OMP算法是压缩感知中用来从少量测量中恢复稀疏信号的一种贪婪算法。简单来说,OMP的工作流程可以通过以下几个步骤描述:

  1. 初始化:首先设置残差为观测到的信号,因为一开始没有任何信号被重构,所以残差就是原始信号。同时设定一个空集合来保存选中的基向量。

  2. 迭代寻找:在每一次迭代中,算法会在字典(一组基向量的集合,可以理解为一本能表示各种信号的“字典”)中寻找与当前残差最相关(即内积最大)的基向量,并将这个基向量添加到选中的集合中。

  3. 更新信号与残差:一旦选中了基向量,算法会使用选中的所有基向量通过最小二乘法求解出当前最好的信号近似,再根据这个近似更新残差。更新残差的过程就是用当前的信号近似去逼近观测信号,并将两者的差值设为新的残差。

  4. 终止条件:这个过程会重复进行,直到达到一定的迭代次数(稀疏度)或者残差足够小为止。

  5. 信号重构:最终,算法将使用选中的基向量及对应系数来重构出原信号的一个近似,完成信号的恢复过程。

通过OMP算法,即使在只有非常少量观测数据的情况下,也可以恢复出原始的高维稀疏信号,这是压缩感知的核心优势。

相关博文

理解并实现OpenCV中的图像平滑技术

OpenCV中的边缘检测技术及实现

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

我的图书

下面两本书欢迎大家参考学习。

OpenCV轻松入门

李立宗,OpenCV轻松入门,电子工业出版社,2023
本书基于面向 Python 的 OpenCV(OpenCV for Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。

在介绍 OpenCV 函数的使用方法时,提供了大量的程序示例,并以循序渐进的方式展开。首先,直观地展示函数在易于观察的小数组上的使用方法、处理过程、运行结果,方便读者更深入地理解函数的原理、使用方法、运行机制、处理结果。在此基础上,进一步介绍如何更好地使用函数处理图像。在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的实例来说明问题,避免使用过多复杂抽象的公式。

本书适合计算机视觉领域的初学者阅读,包括在校学生、教师、专业技术人员、图像处理爱好者。
本书第1版出版后,深受广大读者朋友的喜爱,被很多高校选为教材,目前已经累计重印9次。为了更好地方便大家学习,对本书进行了修订。
在这里插入图片描述

计算机视觉40例

李立宗,计算机视觉40例,电子工业出版社,2022
近年来,我深耕计算机视觉领域的课程研发工作,在该领域尤其是OpenCV-Python方面积累了一点儿经验。因此,我经常会收到该领域相关知识点的咨询,内容涵盖图像处理的基础知识、OpenCV工具的使用、深度学习的具体应用等多个方面。为了更好地把所积累的知识以图文的形式分享给大家,我将该领域内的知识点进行了系统的整理,编写了本书。希望本书的内容能够对大家在计算机视觉方向的学习有所帮助。
本书以OpenCV-Python(the Python API for OpenCV)为工具,以案例为载体,系统介绍了计算机视觉从入门到深度学习的相关知识点。
本书从计算机视觉基础、经典案例、机器学习、深度学习、人脸识别应用等五个方面对计算机视觉的相关知识点做了全面、系统、深入的介绍。书中共介绍了40余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读懂2024年数字孪生发展新趋势!十大权威白皮书放送!

2024年&#xff0c;数字孪生 该往哪些方向走&#xff1f; 新技术的不断涌现 又会带来怎样的行业变迁 …… 在开工之际&#xff0c;我们整理了 51WORLD主导、参编的 十大权威数字孪生白皮书、行业报告 以及产业优秀案例集 分享给想要提升自我的朋友们 读完这些 上面看似…

不止提升免疫力?NMN或可预防、缓解支原体肺炎造成的肺部损伤

近期&#xff0c;全国多地进入呼吸道疾病高发季&#xff0c;支原体肺炎等相关话题频频登上各大热搜榜。 发烧、咳嗽、嗓子疼、肺炎……支原体肺炎的战线拉得挺长&#xff0c;过年了都还有不少人纷纷中招&#xff1a;发热、咳嗽&#xff0c;来来回回拖了一两周才好&#xff0c;…

JavaScript 设计模式之组合模式

组合模式 在我们日常中肯呢个会将一个表单用这种模式来创建 const Car function () { } Car.prototype.getName function () { throw new Error("需要重写该方法") } Car.prototype.getPrice function () {throw new Error("需要重写该方法") } const…

突破性创新:OpenAI推出Sora视频模型,预示视频制作技术的未来已到来!

一、前言 此页面上的所有视频均由 Sora 直接生成&#xff0c;未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes from text instructions. 2024 年 2 月 16 日&#xff0c;OpenAI 发布 AI 视频模型 Sora&#xff0c;60 秒的一镜到底…

XML Map 端口进阶篇——常用关键字和格式化器详解

XML Map 端口是用于在不同XML之间建立关系映射的工具&#xff0c;允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射&#xff0c;除此之外&#xff0c;XML Map 端口还提供了其它丰富多彩的功能&#xff0c;使用户能够更加灵活和高效的处理XML 数据映射任务&#xff0c;让…

以程序员的视角,看前后端分离的是否必要?

Hello&#xff0c;我是贝格前端工场&#xff0c;本篇分享一个老生常谈的话题&#xff0c;前后端分离是必然趋势&#xff0c;但也是要区分具体的场景&#xff0c;欢迎探讨&#xff0c;关注&#xff0c;有前端开发需求可以私信我&#xff0c;上车了。 一、什么是前后端分离和不分…

Bert-VITS-2 效果挺好的声音克隆工具

持中日英三语训练和推理。内置干声分离&#xff0c;切割和标注工具&#xff0c;开箱即用。请点下载量右边的符号查看镜像所对应的具体版本号。 教程地址&#xff1a; sjj​​​​​​​CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区&#xff0c;能复现…

分享一个背英语单词的方法

目录 前言 乱序记忆法 结语 前言 这是我现在正在用的背单词方法&#xff0c;我觉得是不错的&#xff0c;分享一下&#xff0c;希望对你有帮助。也欢迎评论点赞哟。 乱序记忆法 这种方法需要我们准备好纸&#xff0c;是需要我们动笔的。我坚持认为&#xff0c;动笔去记单词的…

人工智能专题: Sora,世界模拟器的视频生成器

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能专题&#xff1a; Sora&#xff0c;世界模拟器的视频生成器》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;16页 来源&#xff1a;人工智能学派 Sora 能做什么&#xff1f;…

苍穹外卖——第一天nginx

放到全是英文路径的打不开 到安装路径进入cmd&#xff0c;输入nginx -t nginx: the configuration file E:\Astudy\nginx-1.20.2/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbid…

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步&#xff1a;Fiddler截获客户端发送给服务器的HTTPS请求&#xff0c;Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步&#xff1a;服务器发回相应&#xff0c;Fiddler获取到服务器的CA证书&#xff0c; 用根证书&#xff08;这里的根证…

UI自动化之使用poco进行元素的唯一定位

直接选择&#xff1a; 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择&#xff1a; 3.poco(text/name).parent().child()[0].click()正则表达式&#xff1a; 4.listpoco(textMatches".*ETF")今天主要想记录下…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_5

《剑指Offer》笔记&题解&思路&技巧&优化_Part_5 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题&#x1f7e2;1. LCR 158. 库存管理 II——数组中出现次数超过一…

SQL数据库基础语法-增删改

SQL数据库基础语法-增删改 数据库是 ​ “按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 GeekSec专注技能竞赛培训5年&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;…

synchronized原理Callable接口

synchronized原理 特点 1.synchronized既是一个悲观锁,又是个乐观锁&#xff0c;自适应的&#xff01; synchronized默认是乐观锁,但是如果发现锁竞争比较激烈,就会变成悲观锁!!2.synchronized既是轻量级锁,又是一个重量级锁,自适应&#xff01; synchronized默认是轻量…

字符串算法(算法竞赛)--最小表示法与最详细的字符串哈希

1、B站视频链接&#xff1a;F01 最小表示法_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】最小表示法 - 洛谷 #include <bits/stdc.h> using namespace std; const int N7e5; int n; int s[N];int get_min(){for(int i1;i<n;i)s[ni]s[i];//字符串复制一倍int i1,j…

车载软件架构Adaptive AUTOSAR —— 身份和访问管理和加密技术

车载软件架构Adaptive AUTOSAR —— 身份和访问管理和加密技术 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。…

辽宁博学优晨教育科技有限公司视频剪辑培训靠谱吗?

在数字媒体日益繁荣的今天&#xff0c;视频剪辑已成为一项炙手可热的技能。不少培训机构纷纷涉足这一领域&#xff0c;辽宁博学优晨教育科技有限公司便是其中之一。然而&#xff0c;面对众多的选择&#xff0c;很多人不禁要问&#xff1a;辽宁博学优晨教育科技有限公司的视频剪…

【深度学习每日小知识】交并集 (IoU)

交并集 (IOU) 是一种性能指标&#xff0c;用于评估注释、分割和对象检测算法的准确性。它量化数据集中的预测边界框或分段区域与地面实况边界框或注释区域之间的重叠。 IOU 提供了预测对象与实际对象注释的对齐程度的衡量标准&#xff0c;从而可以评估模型准确性并微调算法以改…

中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…