本文主要是介绍使用OMP复原一维信号(MATLAB),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考文献
https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master
MATLAB代码
%% 含有噪声
% minimize ||x||_1
% subject to: (||Ax-y||_2)^2<=eps;
% minimize : (||Ax-y||_2)^2+lambda*||x||_1
% y传输中可能含噪 y=y+w
%
%%
clc;clearvars;
close all;
%% 1.构造一个两个谐波信号
lam=0.37;
itrs=400;
m=380;
sig=0.5;
n=1024;
dt=1/2000;
T=1023*dt;
t=0:dt:T;
t=t(:);
x=sin(697*pi*t)+sin(1975*pi*t);
Dn=dctmtx(n);%% 2.构造测量矩阵
rand('state',15);
q=randperm(n);
q=q(:);
y=x(q(1:m));
randn('state',7)
w=sig*randn(m,1); %产生噪声
yn=y+w; %压缩矩阵有噪声
Psi1=Dn';%% 4. 重构信号 OMP
A=Psi1(q(1:m),:);
[xh,errr]=CS_OMP(yn,A,100); %OMP
xx=Psi1*xh';
figure
plot(errr,'*-')
legend('OMP误差')figure
plot(t,x,'b',t,xx,'r');
legend('DCT-稀疏信号','OMP重构信号')figure
t1=50*dt:dt:100*dt;
plot(t1,x(50:100),'b',t1,xx(50:100),'r','linewidth',1.5)
legend('DCT-稀疏信号','OMP重构信号')%% CS_OMP Algorithm
%-------------------------------------------------------------------------------------%
% CS_OMP Algorithm (正交匹配追踪法 Orthogonal Matching Pursuit)
% 输入:y---测量信号 M X 1
% A---恢复矩阵 M X N
% K---迭代次数
% 输出 :theta---估计的稀疏向量 N X 1
% erro_rn---每次迭代的误差
% 编程人: 何刘 Email: aresmiki@163.com
% 编程时间:2017年04月26日 西南交通大学牵引动力国家重点实验室
% SWJTU TPL
% 参考文献:Joel A. Tropp and Anna C. Gilbert
% Signal Recovery From Random Measurements Via Orthogonal Matching
% Pursuit,IEEE TRANSACTIONS ON INFORMATION THEORY, VOL. 53, NO. 12,
%------------------------------------------------------------------------------------------%
%%
function [ theta,erro_rn ] = CS_OMP( y,A,K )
N=max(size(A));
M=min(size(A));
theta=zeros(1,N); % 待重构的向量
Base_t=[]; % 记录基向量的矩阵
r_n=y; % 残差值
for times=1:K; % 迭代次数(有噪声的情况下,该迭代次数为K)for col=1:N; % 恢复矩阵的所有列向量product(col)=abs(A(:,col)'*r_n); % 恢复矩阵的列向量和残差的投影系数(内积值) end[val,pos]=max(product); % 最大投影系数对应的位置,val值,pos位置Base_t=[Base_t,A(:,pos)]; % 矩阵扩充,记录最大投影的基向量A(:,pos)=zeros(M,1); % 选中的列置零(实质上应该去掉,为了简单我把它置零)aug_y=(Base_t'*Base_t)^(-1)*Base_t'*y; % 最小二乘,使残差最小r_n=y-Base_t*aug_y; % 残差erro_rn(times)=norm(r_n,2); %迭代误差pos_array(times)=pos; % 纪录最大投影系数的位置if erro_rn(times)<1e-6 %break; %跳出for循环end
end
theta(pos_array)=aug_y; % 重构的向量
end
运行结果
这篇关于使用OMP复原一维信号(MATLAB)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!