Aqui está uma tentativa de fazer o que você precisa scilab.
O gráfico superior mostra alguns dados que eu sintetizei. O segundo gráfico mostra a correlação automática dos dados brutos (ampliada em torno do pico central da correlação automática). Os círculos vermelhos mostram os picos encontrados usando esta find_peaks
função .
O gráfico final mostra a diferença entre todos os locais de pico. Esta será uma estimativa do período. Como você não está realmente garantido de que o período subjacente será um número inteiro de amostras, provavelmente você deve encontrar a média desses valores.
Nesse caso, o período "verdadeiro" é 1/f0 = 11.191996
, e recebe diffs = diff(peaks);
e depois mean(diffs(10:173))
cede 11.195122
.
Código abaixo.
N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;
x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);
clf
subplot(311)
plot(x);
subplot(312)
plot(XC);
peaks=peak_detect(XC,0);
plot(peaks,XC(peaks),'ro')
a = get('current_axes');
a.data_bounds=[950 1050 -500 800];
subplot(313)
plot(diff(peaks));