压缩感知(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-6
        break; % 达到误差要求时跳出循环
    end
end

reconstructed_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余个经典的计算机视觉案例,其中既有字符识别、信息加密、指纹识别、车牌识别、次品检测等计算机视觉的经典案例,也包含图像分类、目标检测、语义分割、实例分割、风格迁移、姿势识别等基于深度学习的计算机视觉案例,还包括表情识别、驾驶员疲劳监测、易容术、识别年龄和性别等针对人脸的应用案例。
在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用复杂抽象的公式来介绍。
本书适合计算机视觉领域的初学者阅读,适于在校学生、教师、专业技术人员、图像处理爱好者使用。

在这里插入图片描述

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

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

相关文章

定制学习风格、满足多元需求:Mr. Ranedeer 帮你打造 AI 家教 | 开源日报 No.178

JushBJJ/Mr.-Ranedeer-AI-Tutor Stars: 20.4k License: NOASSERTION Mr. Ranedeer 是一个个性化的 AI 辅导项目&#xff0c;主要功能包括使用 GPT-4 生成定制化提示&#xff0c;为用户提供个性化学习体验。其核心优势和特点包括&#xff1a; 调整知识深度以满足学习需求定制学…

原生 复选框 input[type=“checkbox“] 样式修改

样式&#xff1a; input[type"checkbox"] {position: relative;width: 25px;height: 25px;/* 用于控制 UI 控件的基于操作系统主题的原生外观。none 隐藏部件的某些特性 */appearance: none; }input[type"checkbox"]::before {content: "";posi…

采用uniapp实现的银行卡卡片, 支持H5和微信小程序

采用uniapp-vue3实现的银行卡卡片 支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可用于参考学习 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id16736 使用示例

ansible的剧本

1 playbook 剧本 1.1 playbooks的组成 Tasks 任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 Variables 变量 Templates 模板 Handlers 处理器&#xff0c;当changed状态条件满足时&#xff0c;&#xff08;notify&#xff09…

“TypeError: utils request jS WEBPACK IMPORTED MODULE O .default is undefined‘报错

写项目时报下列错误&#xff0c;找了半天&#xff0c;结果才发现自己在request.js中少写了一行代码 一定不要少些代码 export default requestrequest.js完整代码 import axios from axios;//创建一个新的axios对象 const request axios.create({baseURL:http://localhost:…

AIDL的工作原理与使用示例 跨进程通信 远程方法调用RPC

AIDL的介绍与使用 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android中用于定义客户端和服务端之间通信接口的一种接口定义语言。它允许你定义客户端和服务的通信协议&#xff0c;用于在不同的进程间或同一进程的不同组件间进行数据传递。AIDL通过…

SpringCloud Ribbon负载均衡的策略总结及其配置

1. 轮询策略 2. 权重轮询策略 3. 随机策略 4. 最少并发数策略 5. 在选定的负载均衡策略基础上重试机制 6. 可用性敏感策略。 7. 区域敏感策略 —————————————————————— Ribbon负载均衡策略的配置&#xff1a; 在application.yml中配置如下&am…

功能问题:如何开发一个自己的 VS Code 插件?

大家好&#xff0c;我是大澈&#xff01; 本文约1100字&#xff0c;整篇阅读大约需要3分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

linuxshell日常脚本命令之sleep延时

shell之sleep指定延时单位(六) 用于延时打印或延时在超算投放任务 for i in $(seq 1 10);do echo $i;sleep 2m;done

机器学习面试:逻辑回归与朴素贝叶斯区别

逻辑回归与朴素贝叶斯区别有以下几个方面: (1)逻辑回归是判别模型&#xff0c;朴素贝叶斯是生成模型&#xff0c;所以生成和判别的所有区别它们都有。 (2)朴素贝叶斯属于贝叶斯&#xff0c;逻辑回归是最大似然&#xff0c;两种概率哲学间的区别。 (3)朴素贝叶斯需要条件独立假设…

Day10_面向对象-抽象类-接口-课后练习-参考答案

文章目录 代码编程题第1题第2题第3题 代码编程题 第1题 知识点&#xff1a;抽象类语法点&#xff1a;继承&#xff0c;抽象类按步骤编写代码&#xff0c;效果如图所示&#xff1a; 编写步骤&#xff1a; 定义抽象类A&#xff0c;抽象类B继承A&#xff0c;普通类C继承BA类中&…

IDEA 2021.3激活

1、打开idea&#xff0c;在设置中查找Settings/Preferences… -> Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io搜索&#xff1a;IDE Eval Reset 插件进行安装。应用和使用&#xff0c;如图

迈向三维:vue3+Cesium.js三维WebGIS项目实战--持续更新中

写在前面&#xff1a;随着市场对数字孪生的需求日益增多&#xff0c;对于前端从业者的能力从对框架vue、react的要求&#xff0c;逐步扩展到2D、3D空间的交互&#xff0c;为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。本文将记录WebGIS的学习之旅&#xff0c;从…

Vue3-组合式Api(重点)

阅读文章你可以收获的知识 1.知道setup语法糖的使用和如何实现的 2.知道在vue3中如何定义响应式数据 3.知道在vue3中如何定义一个计算属性&#xff08;computed&#xff09; 4.知道如何在vue3中使用watch来监听数据 5.知道在vue3如何实现父子通信 6.知道vue3如何使用ref函…

前端架构: 脚手架之Chalk和Chalk-CLI使用教程

Chalk Chalk 是粉笔的意思, 它想表达的是&#xff0c;给我们的命令行中的文本添加颜色类似彩色粉笔的功能 在官方文档当中&#xff0c;它的 Highlights 核心特性 Expressive API Highly performant No dependencies Ability to nest styles 256/Truecolor color support Auto-…

dell r740服务器黄灯闪烁维修现场解决

1&#xff1a;首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样&#xff0c;不得不说就外观来说自从IBM抛弃System X系列服务器后&#xff0c;也就戴尔这个外观看的比较顺眼。 图一&#xff1a;是DELL R740前视图&#xff08;这款是8盘机型&#xff09; 图二&#xff…

【算法与数据结构】1020、130、LeetCode飞地的数量 被围绕的区域

文章目录 一、1020、飞地的数量二、130、被围绕的区域三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、1020、飞地的数量 思路分析&#xff1a;博主认为题目很抽象&#xff0c;非常难理解。想了好久&#xff0c;要理解…

(っ•̀ω•́)っ 如何在PPT中为文本框添加滚动条

本人在写技术分享的PPT时&#xff0c;遇到问题&#xff1a;有一大篇的代码&#xff0c;如何在一张PPT页面上显示&#xff1f;急需带有滚动条的文本框&#xff01;百度了不少&#xff0c;自己也来总结一篇&#xff0c;如下&#xff1a; 1、找到【文件】-【选项】 2、【自定义功…

基于 QUIC 协议的 HTTP/3 正式发布!

近期&#xff0c;超文本传输协议新版本 HTTP/3 RFC 文档&#xff0c;已由互联网工程任务组&#xff08;IETF&#xff09;对外发布。HTTP/3 全称为 HTTP-over-QUIC&#xff0c;指在 QUIC&#xff08;Quick UDP Internet Connections, 快速 UDP 互联网连接&#xff09;上映射 HTT…

3个精美的wordpress企业网站模板

WordPress企业网站模板 https://www.zhanyes.com/qiye/6305.html WordPress企业官网模板 https://www.zhanyes.com/qiye/6309.html WordPress律师模板 https://www.zhanyes.com/qiye/23.html