【信号处理】从范数测量中恢复信号(Matlab实现)

“在代码的海洋里,有无尽的知识等待你去发现。我就是那艘领航的船,带你乘风破浪,驶向代码的彼岸。

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

从范数测量中恢复信号是一个信号处理和压缩感知领域中的关键技术问题。这个问题通常涉及到从一组线性测量中恢复原始信号,这些测量通常远少于信号的维数压缩感知(Compressed Sensing, CS)是一种信号处理技术,它允许我们从少量的非适应性线性测量中重建稀疏或可压缩的信号。压缩感知的基本原理是,如果一个信号在某个基下是稀疏的(即大多数系数接近零),那么我们可以通过远少于奈奎斯特采样定理所需的测量来恢复这个信号。在压缩感知中,“范数测量”通常指的是通过某种范数(如L1范数)来约束或优化信号恢复过程。其中最常用的是L1范数最小化方法,因为L1范数在求解稀疏信号恢复问题时具有很好的性能。从范数测量中恢复信号是压缩感知领域的一个核心问题,它利用了信号的稀疏性和测量矩阵的特殊性质来实现高效的数据采集和信号恢复。随着优化算法和硬件技术的发展,这种方法在许多实际应用中展现出了巨大的潜力。

📚2 运行结果

主函数部分代码:

rng(99); % set a seed for the random number generator

var_n = 50; % 'n' in the paper -- dimension of the signal of interest
var_m = 5; % 'm' in the paper
NoOp = var_n*5; % 'K' in the paper -- number of observations/operations

SNRin = 30; % the actual SNR is displayed in runtime

MAX_ITER = 2500; 
MAX_ITER_forlimit = 10000; 

%%%% 
%% generate the observation matrices
F = randn(NoOp * var_m,var_n); 
[U,S,V] = svd(F);
S = S / max(abs(S(:)));
S = S.^10;
F = U * S * V';

ComputeObs = @(x) reshape( sqrt(sum((reshape(F * x, var_m, [])).^2)), [], 1);
Project = @(u) Pject(u,var_m);

%% clean signal
clean = rand(var_n,1); % the clean signal

%% observations
y_clean = ComputeObs(clean);
y = y_clean;
% add noise so that the SNR is roughly SNRin
ey = sum(y.^2);
sig = sqrt( ey * 10^(-SNRin/10) / numel(y));
y = y + sig * randn(size(y));
y = max(y, 0);
disp(strcat('Actual SNR : ', num2str(10 * log10(ey / (sum(y - y_clean).^2)))));

%% given the observations, create the operator 'D'
DistMult = @(u) reshape( bsxfun(@times, reshape(u,var_m,[]), y'), [], 1); % multiplies each 'phase' vector with the distance

%% compute the spectral norm of F'F, set parameters
FF = F' * F;
sp = norm(F' * F);

gama = 0.49 / sp;
gamb = 0.1;

gam1 = 1/sqrt(sp);
gam2 = gamb;

IF = inv(gam1 * eye(size(FF,1)) + 2 * FF);

% random initialization, common to all algorithms
x_init = rand(size(clean));
u_init = Project(F * x_init);
%x_init = F' * DistMult(u_init);
%u_init = Project(F * x_init);

%% obtain the limit point using Algorithm-1

%initialize
x_limit = x_init;
u_limit = u_init;

wb = waitbar(0,'Obtaining the limit point');
for iter = 1:MAX_ITER_forlimit
    waitbar(iter/MAX_ITER_forlimit, wb);
    
    Fx = F * x_limit;
    Du = DistMult(u_limit);

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]邹本振,宿丁.面向效能级仿真的雷达信号处理抽象建模方法研究[J].科学技术创新,2024(17):115-118.

[2]卢海林,郭馨阳,郝静.基于多滤波降噪法的桥梁应变监测信号处理[J].噪声与振动控制,2024,44(04):180-187.

🌈4 Matlab代码实现

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值