Aquí hay un intento de hacer lo que necesita en scilab.
La gráfica superior muestra algunos datos que sinteticé. La segunda gráfica muestra la autocorrelación de los datos sin procesar (ampliada alrededor del pico central de la autocorrelación). Los círculos rojos muestran los picos encontrados usando esta find_peaks
función .
La gráfica final muestra la diferencia entre todas las ubicaciones de los picos. Esta será una estimación del período. Debido a que no está realmente garantizado de que el período subyacente sea un número entero de muestras, probablemente debería encontrar la media de estos valores.
En este caso, el período "verdadero" es 1/f0 = 11.191996
, y toma diffs = diff(peaks);
y luego mean(diffs(10:173))
rinde 11.195122
.
Código a continuación.
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));