简单程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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');

上面都是没有添加噪声的算法结果,我们给信号添加一些噪声,以时域信号为例,

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

相关文档
最新文档