压缩感知最经典的模型就是一个非线性逆问题:
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个非零值
此时,非线性逆问题的表达式可以表示为:,代码如下:
%% 一维稀疏信号生成测试
%% 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