首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >极简信号的去噪

极简信号的去噪
EN

Stack Overflow用户
提问于 2018-12-07 18:29:24
回答 1查看 46关注 0票数 0

我试图去噪一个高采样的频谱,消除所有尖峰,然后执行一个保形分段三次样条插值,以保留尽可能多的频谱信息。然而,我无法清除所有的山峰,包括一开始的一个高峰。我错过了什么-我明智地对待这件事吗?顺便说一下,我有几个需要处理的光谱。非常感谢您事先提供的任何意见!

使用的信号数据被发现这里

尝试

代码语言:javascript
复制
minval = 0;
maxval = 950;

figure();
plot(lambda, SI, '-')
xlabel('Wavelength')
ylabel('Signal Intensity')
ylim([minval maxval])
title('Original signal')

ind_min = find(SI <= minval);
ind_max = find(SI >= maxval);
lambda([ind_min.', ind_max.']) = [];
SI([ind_min.', ind_max.']) = [];

figure();
plot(lambda, SI, '-')
xlabel('Wavelength')
ylabel('Signal Intensity')
ylim([minval maxval])
title('Signal after removing all values above 950')

% Define threshold representing 25th percentile difference between signal values
diffSI = abs(diff(SI));
thres = quantile(diffSI, 0.25);

%% Remove all sharp peaks
% Remove all signal values differing from neighbouring values above 
% computed threshold and replace their values estimated by 
% shape-preserving piecewise cubic spline interpolation 
for i = 2:(length(SI) - 1)
    if abs(SI(i) - SI(i+1)) > thres
        SI(i) = NaN;
        SI(i+1) = NaN;
    elseif abs(SI(i) - SI(i-1)) > thres
        SI(i) = NaN;
        SI(i-1) = NaN;
    end
end
SI = fillmissing(SI, 'pchip');

figure()
plot(lambda, SI, '-')
xlabel('Wavelength')
ylabel('Signal Intensity')
ylim([minval maxval])
title('Signal after interpolation')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-07 19:35:30

如果您有图像处理工具箱,则imopen函数是您的筛选器。它对数据进行形态学处理,这是一个偏向于低值的非线性平滑函数(闭包是反向操作,偏向于高值)。

代码语言:javascript
复制
load ~/tmp/SI_and_lambda.mat
SI2=imopen(SI,ones(25,1));
plot(lambda,SI)
hold on
plot(lambda,SI2,'r')

请注意,在MATLAB上解答你的问题不会像imopen过滤器那样跟踪较低的信封。你可以把这些结果画在一起,看看它们之间的差别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53675066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档