Определение чрезмерно сжатого сигнала - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь создать шум в спектре с высокой выборкой, удалив все острые пики и затем выполнив кусочно-кубическую сплайн-интерполяцию с сохранением формы, чтобы сохранить как можно больше информации о спектре.Однако я не могу очистить все пики, включая один пик в начале.Чего мне не хватает - я к этому мудро подхожуКстати, у меня есть несколько из этих спектров, которые мне нужно обработать.Большое спасибо за любой ввод заранее !!

Используемые данные сигнала находятся здесь .

enter image description here enter image description here enter image description 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')

1 Ответ

0 голосов
/ 07 декабря 2018

Если у вас есть набор инструментов для обработки изображений, функция imopen подойдет вам.Он применяет морфологическое открытие к данным, которое представляет собой нелинейную функцию сглаживания, которая смещена к низким значениям (операция закрытия - обратная операция, смещенная к высоким значениям).

load ~/tmp/SI_and_lambda.mat
SI2=imopen(SI,ones(25,1));
plot(lambda,SI)
hold on
plot(lambda,SI2,'r')

plot of data before and after filtering

Обратите внимание, что решение movmin, которое вы получили по вашему вопросу в ответах MATLAB , не будет отслеживать нижний конверт так же близко, как фильтр imopen.Вы можете нанести эти результаты друг на друга, чтобы увидеть разницу.

...