白话压缩感知(含Matlab代码)

压缩感知介绍

压缩感知(Compressive Sensing,CS),有时也叫成Compressive Sampling。相对于传统的奈奎斯特采样定理——要求采样频率必须是信号最高频率的两倍或两倍以上(这就要求信号是带限信号,通常在采样前使用低通滤波器使信号带限),压缩感知则利用数据的冗余特性,只采集少量的样本还原原始数据。

这所谓的冗余特性,借助MLSS2014马毅老师的课件上的例子来说明,

因为自然界的数据都存在局部低维结构、周期性、对称性等,因此,传统的固定采样率的采样方法必然存在信息冗余。由于信息冗余的存在,我们就知道有数据压缩那么一门学科。既然这样,为什么要把冗余的数据也采进来,再进行压缩呢,能不能不把冗余的数据采集进来?

压缩感知的思路就是:在采集的过程中就对数据进行了压缩,而且这种压缩能保证不失真(低失真)的恢复原始数据,这与传统的先2倍频率采集信号→存储→再压缩的方式不同,可以降低采集信号的存储空间和计算量。

好了,那么就来了解一下压缩感知的具体模型。

1. 稀疏表示

使用压缩感知理论首先要求信号能表示为稀疏信号,如x=[1 0 0 0 1 0],其中只有2个1,可认为是稀疏的。我们将信号通过一个矩阵映射到稀疏空间,

设信号x为N维,即,则为NxN维稀疏表达矩阵,s即是将x进行稀疏表示后的Nx1维向量,其中大部分元素值为0。稀疏表示的原理就是通过线性空间映射,将信号在稀疏空间进行表示。

比如,信号

在时域是非稀疏的,但做傅里叶变换表示成频域后,只有少数几个点为非0(如下图)。则该信号的时域空间为非稀疏,频域空间为稀疏空间,组成的矩阵。一般为正交矩阵。

若稀疏表示后的结果s中只有k个值不为0,则称x的稀疏表示为k-Sparse。上图对x的频域稀疏表示就是2-Sparse。

2. 感知测量

压缩感知的目的是在采集信号时就对数据进行压缩,大牛们的思路集中到了数据采集上——既然要压缩,还不如就从大量的传感器中只使用其中很少的一部分传感器,采集少量的冗余度低的数据。这就是感知测量的通俗的说法,用表达式表示

其中的x就是稀疏表示中的信号,为MxN维的感知矩阵(M表示测量信号的维度),y则表示M(M远小于N才有意义)个传感器的直接测量,因此维度为Mx1。

将稀疏表示过程和感知测量过程综合起来:

数学描述

对于压缩感知模型,其中每个量的维度一定要了解(通过维度的变化来理解压缩感知很有效):

从感知测量中知道:M就是测量的维度(M远小于N)。

压缩感知的原信号恢复问题描述为:

由已知条件:

(1) 测量值y,且,其中e为噪声引入

(2) s为k-Sparse信号(k未知)

求解目标:k尽可能小的稀疏表示信号s及对应的

用数学形式描述为:

e可以看成告诉随机噪声,e~N(0,δ2)。

即是要求s使s的0范数(非0值的个数)最小,但0范数优化问题是很难求解的,于是一帮大牛就证明求解1范数也能逼近和上面相同的效果,而求解2范数及其更高的范数则结果相差越来越大(有些人在研究介于0范数与1范数之间的范数求解方法)。因此可转化为1范数求解:

由拉格朗日乘子法,上面的最优问题可转化成:

上面的最小值求解问题就可以直接通过凸优化解得结果了。

程序分析

先下载CVX或spams工具箱,下面的matlab程序分别使用了时域稀疏信号和频域稀疏信号进行测试,两种不同在于时域稀疏信号不用稀疏表达矩阵(因此稀疏表达矩阵使用单位阵即可),而频域稀疏信号则需要先通过稀疏表达矩阵将信号在频域进行稀疏表示,再压缩感知后进行恢复时也要进行反FFT变换到时域。

关于M的选取:测量数M>=K*log(N/K),K是稀疏度,N信号长度,可以近乎完全重构

clc
clear all
close all

%% 产生原始信号及相关参数
n = 512;                          % 信号长度
s = 25;                           % 稀疏度(从下面知道,分时域和频域的情况)
m = 5*s;                          % 测量长度 M>=S*log(N/S)
freq_sparse = 0;                  % 信号频域稀疏则为1

if freq_sparse
    t = [0: n-1]‘;
    f = cos(2*pi/256*t) + sin(2*pi/128*t);   % 产生频域稀疏的信号
else
    tmp = randperm(n);
    f = zeros(n,1);
    f(tmp(1:s)) = randn(s,1);     % 产生时域稀疏的信号
end

%% 产生感知矩阵和稀疏表示矩阵
Phi = sqrt(1/m) * randn(m,n);     % 感知矩阵(测量矩阵)
% A = get_A_fourier(n, m);

y = Phi * f;                      % 通过感知矩阵获得测量值
                                  % Psi 将信号变换到稀疏域
if freq_sparse                    % 信号频域可以稀疏表示
    Psi = inv(fft(eye(n,n)));     % 傅里叶正变换,频域稀疏正交基(稀疏表示矩阵)
else                              % 信号时域可以稀疏表示
    Psi = eye(n, n);              % 时域稀疏正交基
end
A = Phi * Psi;                    % 恢复矩阵 A = Phi * Psi

%% 优化方法1:使用CVX工具进行凸优化
addpath(‘../../cvx-w64/cvx/‘);
cvx_startup;                            % 设置cvx环境
cvx_begin
    variable xp(n) complex;               % 如果xp是复数,则添加complex,否则不加
    minimize (norm(xp, 1));
    subject to
        A * xp == y;
cvx_end

%% 优化方法2:使用spams工具箱进行优化
% addpath(‘spams-matlab/build‘);
% param.L = 100;
% param.eps = 0.001;
% param.numThreads = -1;
%
% A=A./repmat(sqrt(sum(A.^2)),[size(A,1) 1]);
% xp = mexOMP(y, A, param);       % 正交匹配追踪法Orthogonal Matching Pursuit

%% 对比原信号和
if freq_sparse
    xp = real(ifft(full(xp)));           % 傅里叶逆变换
else

end
plot(f+noise);
hold on
plot(real(xp), ‘r.‘);
legend(‘Original‘, ‘Recovered‘);
  1. 设程序中的freq_sparse = 0时,观察时域稀疏信号的恢复结果为

    在恢复时域稀疏信号时,所使用的测量矩阵Phi为初始化的随机阵,因为本身时域就稀疏,而算法直接在时域进行恢复,所以稀疏表达矩阵就是单位阵Psi=E。上面的时域稀疏恢复结果显得没有误差是因为没有给原始信号添加噪声。

  2. 设程序中的freq_sparse = 1时,观察频域稀疏信号的恢复结果为

    在恢复时域稀疏信号时,所使用的测量矩阵Phi为初始化的随机阵,因为信号只在频域稀疏,所以稀疏变换矩阵为傅里叶变换基,所以稀疏表达矩阵就是Psi = inv(fft(eye(n,n)))。同理,上面的频域稀疏恢复结果显得没有误差是因为没有给原始信号添加噪声。

  3. 上面都是没有添加噪声的算法结果,我们给信号添加一些噪声,以时域信号为例,
    if freq_sparse
        t = [0: n-1]‘;
        f = cos(2*pi/256*t) + sin(2*pi/128*t);   % 产生频域稀疏的信号
    else
        tmp = randperm(n);
        f = zeros(n,1);
        f(tmp(1:s)) = randn(s,1);     % 产生时域稀疏的信号
    end
    
    noise = random(‘norm‘, 0, 0.01, [n 1]);
    f = f + noise;                    % 添加噪声
    
    %% Remaining code not changed
    

    从下图的恢复结果看,已经能看到一些恢复误差了,

压缩感知介绍

压缩感知(Compressive Sensing,CS),有时也叫成Compressive Sampling。相对于传统的奈奎斯特采样定理——要求采样频率必须是信号最高频率的两倍或两倍以上(这就要求信号是带限信号,通常在采样前使用低通滤波器使信号带限),压缩感知则利用数据的冗余特性,只采集少量的样本还原原始数据。

这所谓的冗余特性,借助MLSS2014马毅老师的课件上的例子来说明,

因为自然界的数据都存在局部低维结构、周期性、对称性等,因此,传统的固定采样率的采样方法必然存在信息冗余。由于信息冗余的存在,我们就知道有数据压缩那么一门学科。既然这样,为什么要把冗余的数据也采进来,再进行压缩呢,能不能不把冗余的数据采集进来?

压缩感知的思路就是:在采集的过程中就对数据进行了压缩,而且这种压缩能保证不失真(低失真)的恢复原始数据,这与传统的先2倍频率采集信号→存储→再压缩的方式不同,可以降低采集信号的存储空间和计算量。

好了,那么就来了解一下压缩感知的具体模型。

1. 稀疏表示

使用压缩感知理论首先要求信号能表示为稀疏信号,如x=[1 0 0 0 1 0],其中只有2个1,可认为是稀疏的。我们将信号通过一个矩阵映射到稀疏空间,

设信号x为N维,即,则为NxN维稀疏表达矩阵,s即是将x进行稀疏表示后的Nx1维向量,其中大部分元素值为0。稀疏表示的原理就是通过线性空间映射,将信号在稀疏空间进行表示。

比如,信号

在时域是非稀疏的,但做傅里叶变换表示成频域后,只有少数几个点为非0(如下图)。则该信号的时域空间为非稀疏,频域空间为稀疏空间,组成的矩阵。一般为正交矩阵。

若稀疏表示后的结果s中只有k个值不为0,则称x的稀疏表示为k-Sparse。上图对x的频域稀疏表示就是2-Sparse。

2. 感知测量

压缩感知的目的是在采集信号时就对数据进行压缩,大牛们的思路集中到了数据采集上——既然要压缩,还不如就从大量的传感器中只使用其中很少的一部分传感器,采集少量的冗余度低的数据。这就是感知测量的通俗的说法,用表达式表示

其中的x就是稀疏表示中的信号,为MxN维的感知矩阵(M表示测量信号的维度),y则表示M(M远小于N才有意义)个传感器的直接测量,因此维度为Mx1。

将稀疏表示过程和感知测量过程综合起来:

数学描述

对于压缩感知模型,其中每个量的维度一定要了解(通过维度的变化来理解压缩感知很有效):

从感知测量中知道:M就是测量的维度(M远小于N)。

压缩感知的原信号恢复问题描述为:

由已知条件:

(1) 测量值y,且,其中e为噪声引入

(2) s为k-Sparse信号(k未知)

求解目标:k尽可能小的稀疏表示信号s及对应的

用数学形式描述为:

e可以看成告诉随机噪声,e~N(0,δ2)。

即是要求s使s的0范数(非0值的个数)最小,但0范数优化问题是很难求解的,于是一帮大牛就证明求解1范数也能逼近和上面相同的效果,而求解2范数及其更高的范数则结果相差越来越大(有些人在研究介于0范数与1范数之间的范数求解方法)。因此可转化为1范数求解:

由拉格朗日乘子法,上面的最优问题可转化成:

上面的最小值求解问题就可以直接通过凸优化解得结果了。

程序分析

先下载CVX或spams工具箱,下面的matlab程序分别使用了时域稀疏信号和频域稀疏信号进行测试,两种不同在于时域稀疏信号不用稀疏表达矩阵(因此稀疏表达矩阵使用单位阵即可),而频域稀疏信号则需要先通过稀疏表达矩阵将信号在频域进行稀疏表示,再压缩感知后进行恢复时也要进行反FFT变换到时域。

关于M的选取:测量数M>=K*log(N/K),K是稀疏度,N信号长度,可以近乎完全重构

clc
clear all
close all

%% 产生原始信号及相关参数
n = 512;                          % 信号长度
s = 25;                           % 稀疏度(从下面知道,分时域和频域的情况)
m = 5*s;                          % 测量长度 M>=S*log(N/S)
freq_sparse = 0;                  % 信号频域稀疏则为1

if freq_sparse
    t = [0: n-1]‘;
    f = cos(2*pi/256*t) + sin(2*pi/128*t);   % 产生频域稀疏的信号
else
    tmp = randperm(n);
    f = zeros(n,1);
    f(tmp(1:s)) = randn(s,1);     % 产生时域稀疏的信号
end

%% 产生感知矩阵和稀疏表示矩阵
Phi = sqrt(1/m) * randn(m,n);     % 感知矩阵(测量矩阵)
% A = get_A_fourier(n, m);

y = Phi * f;                      % 通过感知矩阵获得测量值
                                  % Psi 将信号变换到稀疏域
if freq_sparse                    % 信号频域可以稀疏表示
    Psi = inv(fft(eye(n,n)));     % 傅里叶正变换,频域稀疏正交基(稀疏表示矩阵)
else                              % 信号时域可以稀疏表示
    Psi = eye(n, n);              % 时域稀疏正交基
end
A = Phi * Psi;                    % 恢复矩阵 A = Phi * Psi

%% 优化方法1:使用CVX工具进行凸优化
addpath(‘../../cvx-w64/cvx/‘);
cvx_startup;                            % 设置cvx环境
cvx_begin
    variable xp(n) complex;               % 如果xp是复数,则添加complex,否则不加
    minimize (norm(xp, 1));
    subject to
        A * xp == y;
cvx_end

%% 优化方法2:使用spams工具箱进行优化
% addpath(‘spams-matlab/build‘);
% param.L = 100;
% param.eps = 0.001;
% param.numThreads = -1;
%
% A=A./repmat(sqrt(sum(A.^2)),[size(A,1) 1]);
% xp = mexOMP(y, A, param);       % 正交匹配追踪法Orthogonal Matching Pursuit

%% 对比原信号和
if freq_sparse
    xp = real(ifft(full(xp)));           % 傅里叶逆变换
else

end
plot(f+noise);
hold on
plot(real(xp), ‘r.‘);
legend(‘Original‘, ‘Recovered‘);
  1. 设程序中的freq_sparse = 0时,观察时域稀疏信号的恢复结果为

    在恢复时域稀疏信号时,所使用的测量矩阵Phi为初始化的随机阵,因为本身时域就稀疏,而算法直接在时域进行恢复,所以稀疏表达矩阵就是单位阵Psi=E。上面的时域稀疏恢复结果显得没有误差是因为没有给原始信号添加噪声。

  2. 设程序中的freq_sparse = 1时,观察频域稀疏信号的恢复结果为

    在恢复时域稀疏信号时,所使用的测量矩阵Phi为初始化的随机阵,因为信号只在频域稀疏,所以稀疏变换矩阵为傅里叶变换基,所以稀疏表达矩阵就是Psi = inv(fft(eye(n,n)))。同理,上面的频域稀疏恢复结果显得没有误差是因为没有给原始信号添加噪声。

  3. 上面都是没有添加噪声的算法结果,我们给信号添加一些噪声,以时域信号为例,
    if freq_sparse
        t = [0: n-1]‘;
        f = cos(2*pi/256*t) + sin(2*pi/128*t);   % 产生频域稀疏的信号
    else
        tmp = randperm(n);
        f = zeros(n,1);
        f(tmp(1:s)) = randn(s,1);     % 产生时域稀疏的信号
    end
    
    noise = random(‘norm‘, 0, 0.01, [n 1]);
    f = f + noise;                    % 添加噪声
    
    %% Remaining code not changed
    

    从下图的恢复结果看,已经能看到一些恢复误差了,

时间: 2024-10-18 00:08:56

白话压缩感知(含Matlab代码)的相关文章

浅谈压缩感知(三十):压缩感知重构算法之L1最小二乘

主要内容: l1_ls的算法流程 l1_ls的MATLAB实现 一维信号的实验与结果 前言 前面所介绍的算法都是在匹配追踪算法MP基础上延伸的贪心算法,从本节开始,介绍基于凸优化的压缩感知重构算法. 约束的凸优化问题: 去约束的凸优化问题: 在压缩感知中,J函数和H函数的选择: 那么,后面要解决的问题就是如何通过最优化方法来求出x. 一.l1_ls的算法 l1_ls,全称?1-regularized least squares,基于L1正则的最小二乘算法,在标准内点法的基础上,在truncate

压缩感知中常用的待还原信号种类

研究压缩感知的一个基本工作就是生成原始的信号,也就是y=Ax中的x.一般来说,x是一个长度为N的列向量,稀疏度为k,其中x的非零位置组成的集合称作支撑集T. x中的非零元素集合一般独立同分布四种随机分布. 1.Uniform,开区间(0,1)上的均匀分布. 2.Signs,伯努利分布,待选集合为{-1,1},等概率选取. 3.Gaussian,标准正态分布N(0,1) 4.Power,能量法则,1/j,j=1,...,k的某个排列组合. 基于这些生成的向量,我们就可以进一步做算法研究了,比如算法

浅谈压缩感知(三十一):压缩感知重构算法之定点连续法FPC

主要内容: FPC的算法流程 FPC的MATLAB实现 一维信号的实验与结果 基于凸优化的重构算法 基于凸优化的压缩感知重构算法. 约束的凸优化问题: 去约束的凸优化问题: 在压缩感知中,J函数和H函数的选择: 一.FPC的算法 FPC,全称Fixed-Point Continuation,这里翻译为定点连续. 数学模型: 算法: 该算法在迭代过程中利用了收缩公式shrinkage(也称为软阈值soft thresholding),算法简单.优美. 迭代过程: (梯度) 合并一下,就得到了整个迭

[转]压缩感知重构算法之分段正交匹配追踪(StOMP)

分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的优势. 1.StOMP重构算法流程: 分段正交匹配追踪(StagewiseOMP)或者翻译为逐步正交匹配追踪,它是OMP另一种改进算法,每次迭代可以选择多个原子.此算法的输入参数中没有信号稀疏度K,因此相比于ROMP及CoSaMP有独到的优势. 1.StOMP重构算法流程: 2.分段正交匹配追踪(S

SAR成像学习(四)距离方向成像matlab代码解析 2

如果发射信号是线性调频信号,上一次讲的距离成像算法流程(匹配滤波方法)依然可以用,但那个流程要求T x =4X 0 c >T p  .如果T x <T p  ,即幅宽相对较小的情况,上一讲中的流程会带来一个问题,解决这个问题的办法是pulse compression.本文将会讨论这个puse compression的原理和实现. 1 what is pulse compression 对于线性调频信号:p(t)=a(t)exp(jβt+jαt 2 ) ,信号持续时间为T p  ,瞬时频率为β+

压缩感知先进——关于稀疏矩阵

前<初识压缩感知Compressive Sensing>中我们已经讲过了压缩感知的作用和基本想法,涉及的领域,本文通过学习陶哲轩对compressive sensing(CS)的课程,对压缩感知做进一步理解.针对其原理做出解说.本文较为理论性,代码请參考<"压缩感知"之"Hello world">. Keywords: 压缩感知 compressive sensing, 稀疏(Sparsity).不相关(Incoherence).随机性(Ra

压缩感知(compressed sensing)科普两则

文章贴自:http://www.cvchina.info/2010/06/08/compressed-sensing-2/#more-1173 这是数学家陶哲轩在他自己的blog上写的一篇科普文章,讨论的是近年来在应用数学领域里最热门的话题之一:压缩感知(compressed sensing). 所谓压缩感知,最核心的概念在于试图从原理上降低对一个信号进行测量的成本.比如说,一个信号包含一千个数据,那么按照传统的信号处理理论,至少需要做一 千次测量才能完整的复原这个信号.这就相当于是说,需要有一

数字图像处理,初识压缩感知Compressive Sensing

声明: 本文为转载, 原作者Rachel-Zhang. 原博客地址:http://blog.csdn.net/abcjennifer 原文地址,http://blog.csdn.net/abcjennifer/article/details/7721834/ 压缩感知是近年来极为热门的研究前沿,在若干应用领域中都引起瞩目.最近粗浅地看了这方面一些研究,对于Compressive Sensing有了初步理解,在此分享一些资料与精华.本文针对陶哲轩和Emmanuel Candes上次到北京的讲座中对

压缩感知中常用的观测矩阵

接上文:<压缩感知中常用的待还原信号种类>,http://blog.csdn.net/zhyoulun/article/details/25600311 在压缩感知中,观测矩阵就是指y=Ax中的A.A是一个n*m的矩阵,矩阵中的每一个元素独立同分布于一个特定的分布.分布的种类如下: 1.USE.一致球集合,Uniform spherical ensemble,首先计算出一个n*m的矩阵,矩阵中的每一个元素服从标准正态分布,然后对这个矩阵的每一列做归一化. 2.RSE.随机信号集合,Random