Finding peak with two nulls around in a 1d plot

2 visualizaciones (últimos 30 días)
Vinay Killamsetty
Vinay Killamsetty el 31 de Mayo de 2021
Respondida: Sai Pavan el 16 de Feb. de 2024
How can we find the presence of a peak (global maxima) with two nulls (or crossing lower threshold) on each side of the peak in a 1d plot.
And is there a way to find the width of the peak at a particular threshold level
  2 comentarios
Image Analyst
Image Analyst el 31 de Mayo de 2021
You forgot to attach your data or even a screenshot. Which means you blew right past the posting guidelines. Here is another chance to read them and make it easy for us to help you:

Iniciar sesión para comentar.

Respuestas (1)

Sai Pavan
Sai Pavan el 16 de Feb. de 2024
Hello Vinay,
I see that you want to find the presence of a peak with two nulls on each side of the peak in a 1d plot and find the width of the peak at a particular threshold level.
Please refer to the below workflow to find the presence of a peak with two nulls (or crossing a lower threshold) on each side of the peak in a 1D plot, and to find the width of the peak at a particular threshold level:
  • Identify the peaks using the 'findpeaks' function.
  • For each detected peak, find the points where the signal crosses the lower threshold level on both sides of the peak.
  • Measure the width of the peak at the threshold level by calculating the distance between the two crossing points.
Please refer to the below code that illustrates the above mentioned workflow:
% Sample data
x = linspace(0, 10, 1000);
y = exp(-(x-5).^2) + 0.1*randn(size(x)); % Gaussian peak with some noise
plot(x, y);
hold on
threshold = 0.1; % Set to consider as null. Adjust the threshold variable to the level at which you want to measure the peak widths.
[peakValues, peakLocs] = findpeaks(y, x, 'MinPeakHeight', threshold); % Find the peaks
plot(peakLocs, peakValues, 'r*', 'MarkerSize', 10);
% For each peak, find the width at the threshold level
for i = 1:length(peakLocs)
peakX = peakLocs(i);
peakY = peakValues(i);
% Find where the signal crosses the threshold on the left side of the peak
leftSide = y(1:find(x==peakX));
leftCross = find(leftSide < threshold, 1, 'last');
if isempty(leftCross)
leftCross = 1; % If it never crosses, use the start of the data
end
% Find where the signal crosses the threshold on the right side of the peak
rightSide = y(find(x==peakX):end);
rightCross = find(rightSide < threshold, 1, 'first');
if isempty(rightCross)
rightCross = length(rightSide); % If it never crosses, use the end of the data
else
rightCross = rightCross + find(x==peakX) - 1; % Adjust index
end
% Calculate the width at the threshold
peakWidth = x(rightCross) - x(leftCross);
% Plot the width
plot(x([leftCross rightCross]), [threshold threshold], 'k-', 'LineWidth', 2);
% Display the width
disp(['Peak ' num2str(i) ' width at threshold ' num2str(threshold) ': ' num2str(peakWidth)]);
end
hold off
Please refer to the below documentation to learn more about 'findpeaks' function: https://www.mathworks.com/help/signal/ref/findpeaks.html
Hope it helps!

Productos


Versión

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by