Advertisement

matlab重构误差,压缩感知重构信号(matlab源码)

阅读量:

function cs

clc;

clear

K=8; % 稀疏度

N=256; % 信号长度

M=64; % 测量数

f1=50; % 信号频率1

f2=100; % 信号频率2

f3=200; % 信号频率3

f4=400; % 信号频率4

fs=800; % 采样频率

ts=1/fs; % 采样间隔

Ts=1:N; % 采样序列

x=0.2sin(2pif1Tsts)+0.4sin(2pif2Tsts)+0.6sin(2pif3Tsts)+0.9sin(2pif4Tsts); % 完整信号

Phi=randn(M,N); % 测量矩阵(高斯分布白噪声)

s=Phi*x.'; % 获得线性测量

m=2*K; % 算法迭代次数(m>=K)

Psi=fft(eye(N,N))/sqrt(N);

T=Phi*Psi';

hat_y=zeros(1,N); % 待重构的谱域(变换域)向量

Aug_t=[]; % 增量矩阵(初始值为空矩阵)

r_n=s;

%% 重构

for times=1:m;

for col=1:N;

product(col)=abs(T(:,col)'*r_n);

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.'); % 做逆傅里叶变换重构得到时域信号

figure(1);

hold on;

plot(hat_x,'.-') % 重建信号

plot(x,'r'); % 原始信号

legend('原始信号','恢复信号')

norm(hat_x.'-x)/norm(x) % 重构误差

全部评论 (0)

还没有任何评论哟~