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

news2024/12/23 8:32:35

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

在这里插入图片描述

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

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

相关文章

uniapp运动课程健身打卡系统微信小程序

考虑到实际生活中在我来运动管理方面的需要以及对该系统认真的分析,将系统分为小程序端模块和后台管理员模块&#xff0c;权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;首页、个人中心、用户管理、课程类别管理…

计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

静态时序分析:保持时间分析

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;保持时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关…

虚拟机安装Centos7迷你版

虚拟机安装Centos7迷你版 迷你版较常规版精简了很多功能&#xff0c;所以体积也小了很多&#xff0c;喜欢自定义安装的可以选择迷你版 参考文章&#xff1a; VirtualBox虚拟机安装Centos7详细教程图解 网卡配置参考文章 下载Centos迷你版镜像 安装镜像 下载镜像 阿里云Cen…

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…

【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程

文章目录 1. 写在前面2. 环境搭建2. 加密定位实战 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关…

如何高效测试APP,快速定位bug?

一般提到测试&#xff0c;很多人会想到考试&#xff0c;但任意一个APP面世之前&#xff0c;也都需要多次测试&#xff0c;确保可以正常使用之后才会面世。有的公司会有专门的测试工程师&#xff0c;而在一般的互联网公司&#xff0c;大多由产品经理、工程师、设计师等兼职&…

vulnhub练习 DC-1复现及分析

一、搭建环境 1.工具 靶机&#xff1a;DC-1 192.168.200.17 攻击机&#xff1a;kali 192.168.200.13 2.注意 攻击机和靶机的网络连接方式要相同&#xff0c;另外DC-1的网络连接方式我这里采用NAT模式&#xff0c;是与kali的网络连接模式相同的&#xff08;当然亦可以选用桥…

unity学习(28)——登录功能

有之前注册的知识&#xff0c;登录就很容易处理了。 登陆成功返回id&#xff1a; 登录失败返回null&#xff1a; 测试同一账号不能重复登陆&#xff01;登录成功后最好可以跳到新的场景中 结果是好的&#xff0c;去服务器看一下对应部分的代码&#xff0c;可见&#xff0c;登…

多端开发围炉夜话

文章目录 一、多端开发 一、多端开发 uni-app 官网 UNI-APP中的UI框架&#xff1a;介绍常用的UI框架及其特点 uView UIVant WeappColor UIMint UI uniapp嵌入android原生开发的功能 uniapp使用安卓原生sdk uni-app中的uni.requireNativePlugin Qt for iOS Qt for Android

Deep Layer Aggregation(CVPR 2018)原理与代码解析

paper&#xff1a;Deep Layer Aggregation official implementation&#xff1a;https://github.com/ucbdrive/dla third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/dla.py 本文的创新点 骨干网络的设计…

Spring Boot利用Kaptcha生成验证码

生成验证码 我们在登录或注册某个网站的时候&#xff0c;会需要我们输入验证码&#xff0c;才能登录注册&#xff0c;那么如何生成验证码呢&#xff1f;其实&#xff0c;生成验证码我们可以用Java Swing在后台内存里的区域画一个出来&#xff0c;但是非常麻烦&#xff0c;所以…

Linux系统——nginx服务介绍

一、Nginx——高性能的Web服务端 Nginx的高并发性能优于httpd服务 1.nginx概述 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本…

KubeSphere 镜像构建器(S2I)服务证书过期解决方案

目前 KubeSphere 所有 3.x.x 版本&#xff0c;如果开启了 DevOps 模块并使用了镜像构建器功能&#xff08;S2I&#xff09;都会遇到证书过期问题。 解决方法 已开启 DevOps 模块 下载这个更新 S2I 服务证书压缩包&#xff0c;上传到任一可以访问 K8s 集群的节点&#xff1b; …

Java Web(一)--介绍

Java Web 技术体系图 三大组成部分&#xff1a; 前端&#xff1a; 前端开发技术工具包括三要素&#xff1a;HTML、CSS 和 JavaScript&#xff1b;其他高级的前端框架&#xff0c;如bootstrap、jquery&#xff0c;VUE 等。 后端&#xff1a; 后端开发技术工具主要有&am…

PiflowX-组件UnionAll

UnionAll组件 组件说明 Union多个输入源。输入源必须具有相同的字段类型。 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;Any outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子inportsInports“”无否Inports string are…

Atcoder ABC341 A - Print 341

Print 341&#xff08;输出 341&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入1】 …

基于python-socket构建任务服务器(基于socket发送指令创建、停止任务)

在实现ia业务服务器时需要构建一个python-socket客户端&#xff0c;1、要求能与服务器保持心跳连接&#xff0c;每10秒钟发送一次心跳信号&#xff1b;2、要求能根据socket服务器发送的指令创建或终止一个定时任务。 为此以3个类实现该功能&#xff0c;分别为socket通信类&…

Hypervisor是什么

Hypervisor 通常指的是虚拟机监视器&#xff08;VirtualMachine Monitor&#xff09;&#xff0c;它是一种软件或硬件&#xff0c;可以在物理服务器上创建和管理多个虚拟机&#xff08;VirtualMachine&#xff09;。 Hypervisor 提供了一个抽象层&#xff0c;将物理服务器的资源…

基于SpringBoot的农产品智慧物流系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…