极度压缩信号去噪
Denosing of extremely condensed signal
我正在尝试通过去除所有尖峰来对高采样频谱进行降噪,然后执行保形分段三次样条插值以尽可能多地保留频谱信息。但是,我无法清除所有的峰,包括一开始的一个峰。我错过了什么——我是在明智地处理这个问题吗?顺便说一句,我有几个这样的光谱需要处理。非常感谢您提前输入!!
找到使用的信号数据here。
尝试
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')
如果您有图像处理工具箱,imopen
函数就是适合您的滤镜。它对数据应用形态学开运算,这是一个偏向低值的非线性平滑函数(闭运算是反向操作,偏向高值)。
load ~/tmp/SI_and_lambda.mat
SI2=imopen(SI,ones(25,1));
plot(lambda,SI)
hold on
plot(lambda,SI2,'r')
请注意,the movmin
solution you got on your question on MATLAB Answers 不会像 imopen
过滤器那样紧密地跟踪下包络。您可以将这些结果绘制在彼此之上以查看差异。
我正在尝试通过去除所有尖峰来对高采样频谱进行降噪,然后执行保形分段三次样条插值以尽可能多地保留频谱信息。但是,我无法清除所有的峰,包括一开始的一个峰。我错过了什么——我是在明智地处理这个问题吗?顺便说一句,我有几个这样的光谱需要处理。非常感谢您提前输入!!
找到使用的信号数据here。
尝试
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')
如果您有图像处理工具箱,imopen
函数就是适合您的滤镜。它对数据应用形态学开运算,这是一个偏向低值的非线性平滑函数(闭运算是反向操作,偏向高值)。
load ~/tmp/SI_and_lambda.mat
SI2=imopen(SI,ones(25,1));
plot(lambda,SI)
hold on
plot(lambda,SI2,'r')
请注意,the movmin
solution you got on your question on MATLAB Answers 不会像 imopen
过滤器那样紧密地跟踪下包络。您可以将这些结果绘制在彼此之上以查看差异。