Friday, October 5, 2018

autocorrelation - How to find the period of a noisy signal using MATLAB's $tt xcorr$?


enter image description here



Here is my code:


function [ T ] = FindPeriodicity2(x,Fs)
ac=xcorr(x,x);
[~,locs]=findpeaks(ac);
T=mean(diff(locs)/Fs);
end

and when I pass the signal x with a Gaussian noise the period is 1.564 but as we know it equals $\pi$, so the answer is about half of the real period in this case. I know I should eliminate some of the peaks found in 'ac', but I have no idea how to choose from peaks such that it works for any signals.The plot of 'ac' is attached . here is the signal x:


Fs=100;
t=0:(1/Fs):30;

n=length(t);
noise=randn(1,n).*0.3;
x=sin(2.*t+pi)+cos(4.*t)+noise;
T=FindPeriodicity2(x,Fs);
disp(T);

any hint would be appreciated.



Answer



You are getting that result because you are taking into account other maxima that do not correspond to the points you are actually looking for.


When you call findpeaks() with no other parameter than the input signal, you are taking into account all the points marked with a blue arrow. To determine the period, you just want those inside red circles.



enter image description here


Note that, due to the noise, inside some red circles there are more than just one point considered as a peak. That is undesired as well.


You have to put a restriction to find peaks such that they are at least 160 samples away from each other (in this case, due to your signal and its correlation). You can see that if you replace


[~,locs]=findpeaks(ac);


with


[pks,locs] = findpeaks(ac,'MinPeakDistance',300); %Or any number >160


the period will be the expected one.


No comments:

Post a Comment

periodic trends - Comparing radii in lithium, beryllium, magnesium, aluminium and sodium ions

Apparently the of last four, $\ce{Mg^2+}$ is closest in radius to $\ce{Li+}$. Is this true, and if so, why would a whole larger shell ($\ce{...