关于压缩感知(CS)技术的个人实践

关于压缩感知(CS)技术的个人实践

文章目录

  • 关于压缩感知(CS)技术的个人实践
    • 概论与理论原理
    • 信号的压缩原理
    • 信号的重构原理
    • MATLAB解决一维信号的压缩重构
    • MATLAB解决二维图像的压缩重构

概论与理论原理

压缩感知技术,英文名为Compressive Sensing,简称CS理论。该理论指出当信号满足稀疏性或可压缩条件时,可以在远低于Nyquist速率的情况下采样信号,通过求解非线性最优化问题实现对信号的重建,且不会丢失信号的主要信息。该理论实质是通过保留数据中的有用信息,舍弃无用的部分,实现数据的压缩。压缩感知将给信号处理领域带来巨大变革,近年来已引起了宽带信号处理、无线通信图像信号处理、医疗成像、光学成像、雷达等领域的广泛关注。
接下来是一些理论基础:
我们假设存在一个简单的正弦波信号,为了获得信号的主要信息,在A/D转化过程中采样率需要满足Nyquist采样理论。特别是在宽带信号处理中,传统方式下的采样方法需要很高的采样率,采样点存有巨大的信息冗余。压缩感知理论只需要用较少的采样点数,通过求解线性规划问题就能恢复出原始信号信息。如果将图1-4(a)信号的采样率降低,减少采样点数周期性地采样信号,如图1-4(b)所示,那么用压缩感知则无法恢复出原信号,得到的信号将存在很大的周期模糊。为了在采样点数远小于传统方法的情况下,可以获得目标的主要信息,采样间隔需要满足随机性原则,图1-4(c)所示的三角标号表示随机采样点。由随机采样的测量值,经过压缩感知重构算法重建原始信号,如图1-4(d)所示,压缩感知可以重建原始信号的主要信息。
关于压缩感知(CS)技术的个人实践_第1张图片

信号的压缩原理

由信号理论可知,一组离散信号 x ∈ C N x\in C^N xCN总能用一组基 ψ = ψ 1 , ψ 2 … ψ N ψ={ψ_1,ψ_2…ψ_N} ψ=ψ1,ψ2ψN线性表示,即:
x = ψ θ x=ψθ x=ψθ
其中θ为信号在该基上的投影系数,是一个N*1维的向量。如果在这N个系数中只有K(远远小于N)个系数不为零(或者不近似为零),则称信号x在该基上是稀疏的或者是可压缩的。K称之为信号在该稀疏基下的稀疏度。

与奈奎斯特的逐点采样不同的是,在CS理论中,对信号x的观测不是停留在原始信号本身,而是将该信号随机投影到一组低维的测量向量上。该变换过程可以表示为:
y = ϕ x y=ϕx y=ϕx
其中ϕ是一个MN的矩阵,从而将信号x的N个数据转换为M个测量值,可以表示为:
y = ϕ x = ϕ ψ θ = Θ θ y=ϕx=ϕψθ=Θθ yϕxϕψθΘθ
在获得测量信号y后,我们可以通过该式得到向量θ,但是由于M小于N,因此这是一个病态的求解问题。根据理论,只要Θ满足受限等距特性(RIP),就可以几乎精确的求出向量θ。可以证明,只要观测矩阵ϕ与稀疏矩阵Ψ不相关,就可以使Θ满足RIP:
1 - ε ≤ ‖ Θ α ‖ 2 ‖ α ‖ 2 ≤ 1 + ε ( ε > 0 ) 1-ε≤\frac{‖Θα‖_2}{‖α‖_2} ≤1+ε (ε>0) εα2Θα2ε(ε)
在不同场合下,稀疏矩阵Ψ会因为不同的信号而改变,那么寻求测量矩阵ϕ对不同的稀疏 矩阵Ψ都满足不相干性则变成了一个难点。M
N的随 机 矩 阵 可以在很大概率上使得Θ满足RIP。其中M需要满足:
M ≥ c K l o g 2 ( N K ) M≥cK log_2(\frac{N}{K}) cKlog2(KN)

信号的重构原理

重建信号的最直接方法是通过求解L0最小范数(0-范数指向量中非零元素的个数)求解θ,从而得到原信号x。这种方法可以得到稀疏系数的的估计θ’,从而有x’=ψθ’。由于上式的求解是个NP难问题(在多项式时间内难以求解,甚至无法验证解的可靠性)。L1最小范数下在一定条件下和L0最小范数具有等价性,可得到相同的解。那么上式转化为L1最小范数下的最优化问题。
除此之外,我们还可以用迭代方法来重构信号,例如MP、OMP、ROMP算法。
OMP算法是典型的贪婪算法,他会不断的进行迭代,每次迭代找出当前未选择的投影系数中最大的那一个(与测量信号y相关性最大的那个基),然后通过最小二乘的方法求得该对应投影系数的大小并对之前求得的投影系数进行更新,使得每次迭代后得到的 y 0 = ψ 0 θ 0 y_0=ψ_0θ_0 y0=ψ0θ0 与测量信号y的差距 ∣ ∣ y − y 0 ∣ ∣ 2 ||y-y_0||_2 yy02 减少的最多。我们总共会找到m个投影系数和其对应的基,在m大于2K的情况下,使用这m个投影系数合成的信号x’一般和原信号x误差很小。
接下来,我会通过Matlab来介绍对一维和二维信号进行压缩重构的具体步骤。

MATLAB解决一维信号的压缩重构

首先感谢“香港大学电子工程系 沙威 Email: [email protected] ”提供的源程序,在原程序的基础上我进行了修改,程序的每一步含义如下:

  • 生成一个时域测量信号
%% 1.时域测试信号生成  
K=6;      %  稀疏度(做FFT可以看出来)  
N=256;    %  信号长度  
M=48;     %  测量数(M>=cK*log(N/K),至少20,但有出错的概率)  
f1=25;    %  信号频率1  
f2=50;    %  信号频率2  
f3=75;    %  信号频率3  
f4=150;   %  信号频率4  
f5=350;   %  信号频率5
f6=400;   %  信号频率6
fs=800;   %  原信号的采样频率  
ts=1/fs;  %  原信号的采样间隔  
Ts=1:N;   %  采样序列,得到我们最终要还原出来的信号x  
x=0.3*cos(2*pi*f1*Ts*ts)+0.6*cos(2*pi*f2*Ts*ts)+0.1*cos(2*pi*f3*Ts*ts)+0.9*cos(2*pi*f4*Ts*ts)+0.9*sin(2*pi*f5*Ts*ts+10)+0.6*sin(2*pi*f6*Ts*ts);  %  完整信号,由6个信号叠加而来 

可以看到,我建立了一个在频域稀疏的信号,稀疏度为6,而这个信号的最高频率为400,那么在一般情况下,我们要传输的数据要满足奈奎斯特采样定理,而现在,我们不会传输这么长的数据,我们会对我们原本需要传输的这么长的数据进行压缩。

  • 使用随机矩阵进行压缩
%%  2.时域信号压缩传感  
Phi=randn(M,N);                                   %  测量矩阵,为随机分布矩阵 
s=Phi*x.';                                        %  获得线性测量 ,s相当于文中的y矩阵  

这里的s便是我们要传输的信号y,在实际应用中,我们会将测量到的低维信号y从传感器端传输到计算机端进行还原,将其从M1维信号y还原为N1维信号x,我们这里使用了OMP算法进行还原。

  • 正交匹配追踪法(OMP)重构信号
%%  3.  正交匹配追踪法重构信号(本质上是L_1范数最优化问题)  

Psi=fft(eye(N,N))/sqrt(N);                        %  傅里叶正变换矩阵  
                                       
for m=1:1:4*K                                     %通过循环,确定最佳迭代次数
    
T=Phi*Psi';                                       %  恢复矩阵(测量矩阵*正交反变换矩阵)
hat_y=zeros(1,N);                                 %  待重构的谱域(变换域)向量,也就是θ0                       
Aug_t=[];                                         %  增量矩阵(初始值为空矩阵),也就是ψ0
r_n=s;                                            %  残差值,即每次增加一个投影系数后得到的系数矩阵和得到的正交基矩阵之积信号y0与信号y的差  

for times=1:m;                                    %  迭代次数(有噪声的情况下,该迭代次数为K)  
    for col=1:N;                                  %  恢复矩阵的所有列向量  
        product(col)=abs(T(:,col)*r_n);           %  恢复矩阵的列向量和残差的投影系数(内积值)
%  上一式的T(:,col)应当先转置,由于博客显示的原因,不在程序中写出   
    end  
    [val,pos]=max(product);                       %  最大投影系数对应的位置  
    Aug_t=[Aug_t,T(:,pos)];                       %  矩阵扩充      
      
    T(:,pos)=zeros(M,1);                          %  选中的列置零,相当于去掉该列
    aug_y=(Aug_t'*Aug_t)^(-1)*Aug_t'*s;           %  最小二乘解,使现有基下的残差最小  
    r_n=s-Aug_t*aug_y;                            %  新的残差  
    pos_array(times)=pos;                         %  记录这次找到的最大投影系数的位置  
end  
hat_y(pos_array)=aug_y;                           %  重构的谱域向量  
hat_x=real(Psi'*hat_y.');                         %  做逆傅里叶变换重构得到时域信号  
wucha(m)=norm(hat_x.'-x)/norm(x);				  %  记录每次还原出的信号的误差
end
plot(wucha,'.-')  								  %  作图给出迭代次数与还原精度的关系

有得到的误差曲线如下:
关于压缩感知(CS)技术的个人实践_第2张图片

可见只要迭代次数满足m>2*K,就可以近乎完全的重构信号。而OMP算法的步骤可以解释如下:

首先进行初始化,已知低维信号y,稀疏度K,恢复矩阵T,并将残差值设为y,因为现在我们从候选的T1…Tn里面还没有选出用来还原x的正交基,因此y0为0,即与y的差为y。aug_y和Aug_T分别代表我们已经选择出的投影系数和其对应的恢复矩阵的一列,这两个相乘便可得到y0,因此初始均为空。

接下来便不断进行迭代,我们将恢复矩阵的每一列和y做内积,内积最大的那一个便是相关性最高的基于投影系数所在的位置。我们将这一列添加到Aug_T,并且根据最小二乘解求出当前的Aug_T对应的aug_y,满足其乘积y0与y在当前条件下距离最近。然后我们就从T中删去那一行,并且记录下这次迭代得到的那一列的位置和得到的投影系数的数值。然后进行下一次迭代。直到迭代次数达到m,便视为重构完成了。

下面给出在m=2*K时还原信号x’与原始信号x的图像:
关于压缩感知(CS)技术的个人实践_第3张图片

可见还原效果非常好。

MATLAB解决二维图像的压缩重构

你可能感兴趣的:(信号与系统)