压缩感知模型及稀疏信号的生成

压缩感知最经典的模型就是一个非线性逆问题:

y = A x

其中y为观测值,A为观测矩阵,x为稀疏矢量。A的维度为M*N,M<N,y为M行列向量,x为N行列向量,所谓的逆问题是指,y和A为已知量,x为未知量,当A为方阵且满秩的时候,A逆乘x,但是A在这里并非方阵,由x到y的变化是不可逆的。

以下matlab代码用于生成上述模型:

%% 一维时域稀疏信号生成测试
%% Vsesion:1.0 Written by zhenhuaLiu@ 2021.11.17 HIT ATCI
clear
clc
N = 1024;
M = 512;
k = 10;%稀疏度为K
x_index = 1:1:1024;  
x = zeros(N, 1);
T = 5*randn(k, 1);%
index_k = randperm(N);
x(index_k(1:k)) = T;
A = randn(M, N);
A = sqrt(1/M)*A;
A = orth(A')';
y = A*x;
figure(1);
stem(x_index, x);
title('x');
figure(2);
stem(y);
title('y');

可以看到,x有1000多个点,但是只有只有若干个非零值,而y只有500个点,但是杂乱无章,几乎都是非零值,我们能够从少量的y中恢复出x值,就是所谓的“压缩”。 

上述代码中,A矩阵为512*1024,它将一个1024行的向量x变为了512行的y向量,“压缩”即体现于此。

其中的几个函数:

1.randn()用于生成标准正态分布的随机数

2.randperm(N)将1~N的数字随机打散。

3.K为稀疏度,稀疏度指的是非零值的个数

4.orth()函数用于正交化,由于A矩阵是一个胖矩阵,因此需要先转置之后再正交。

上面的代码只是生成了一个时域稀疏信号,在我们的信号处理中,我们遇到的往往是频域稀疏信号。下面给出频域稀疏信号的例子,该稀疏信号在频域只有4个非零值

此时,非线性逆问题的表达式可以表示为:y=\Phi\Psi x=\Theta x,代码如下:

%% 一维稀疏信号生成测试
%% Vsesion:1.0 Written by zhenhuaLiu@ 2021.11.15 HIT ATCI
clear
clc
N = 1000;
M = 500;
k = 4;%稀疏度
fs = 1000;
t = 0: 1/fs: (1 - 1/fs);
x_index = 1:1:1000;  
x = sin(100*2*pi*t)+sin(200*2*pi*t);%两个频率,4个频点,包含了负频率,因此稀疏度为4
plot(t, x);
psi = dftWnkGenerate(N);
phi = randn(M, N);
theta = phi*psi;
A = theta;%感知矩阵由随机矩阵和傅里叶系数矩阵相乘得到
y = phi*x';

dftWnkGenerate函数代码如下:

function [WNnk] = dftWnkGenerate(N)

 
n = [0:1:N-1]; % row vector for n
k = [0:1:N-1]; % row vector for k
WN = exp(-1i*2*pi/N);%matlab提示要增强稳定性,使用li代替i
nk = n'*k;
WNnk = WN .^ nk;   %DFT matrix

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值