Find quasi-periodic peak locations from noisy photon count data

Illustration
yun-hun-jmai - 2021-02-18T11:31:00+00:00
Question: Find quasi-periodic peak locations from noisy photon count data

I am trying to find the method of locating the gaussian peaks from the photon count data. x axis is the number of photons for each spot and y axis is the counted spots.     I used findpeaks function to find peaks. The solid line is created by sgolayfilt.     hgcs = sgolayfilt(hgc, 10, 41); plot(hgc); hold on;plot(hgcs) findpeaks(hgc, 'MinPeakDistance', 20) The peaks that I want to recover are located about 40, 80, 120, and 160.   Question1: Are there any functions or algorithms that can determine the number of peaks and the locations?   Question2: After 160, there are small features. Some of them may be still peaks following the first four peaks. At least, we know that the locations of peaks are quasi-periodic. Could we also find more peaks?  

Expert Answer

Profile picture of Kshitij Singh Kshitij Singh answered . 2025-11-20

I gave up on estimating the width parameter, and just went for the amplitude and location with a uniform width.
Try This:
 
D = load('hgc.mat');
hgc = D.hgc;
x = linspace(0, numel(hgc), numel(hgc));

hgcs = sgolayfilt(hgc, 10, 41);

figure
plot(x,hgc)
hold on
plot(x,hgcs)
hold off
grid

[pks,locs,w] = findpeaks(hgc, 'MinPeakDistance', 20, 'MinPeakProminence',5);

gausfcn = @(b,x) b(1).*exp(-(x-b(2)).^2 * 0.05);

for k = 1:numel(locs)
    B(:,k) = lsqcurvefit(gausfcn, [pks(k); x(locs(k))], x, hgcs);
end

figure
plot(x,hgc)
hold on
for k = 1:numel(locs)
    plot(x, gausfcn(B(:,k),x), 'LineWidth',2)
end
hold off
grid


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!