Main Content

Encontrar picos en datos

Utilice findpeaks para buscar valores y ubicaciones de máximos locales en un conjunto de datos.

El archivo spots_num.mat contiene el número medio de manchas solares observadas cada año desde 1749 hasta 2012. La NASA pone a disposición estos datos.

Encuentre los máximos y los años en que se producen. Represéntelos junto con los datos.

load('spots_num.mat')

[pks,locs] = findpeaks(avSpots);

plot(year,avSpots,year(locs),pks,'or')
xlabel('Year')
ylabel('Number')
axis tight

Figure contains an axes object. The axes object contains 2 objects of type line.

Algunos picos están muy próximos entre sí. Los que no lo están se producen en intervalos regulares. Se producen aproximadamente cinco picos de este tipo en cada periodo de 50 años.

Para calcular mejor la duración del ciclo, vuelva a utilizar findpeaks, pero ahora restrinja la separación entre picos a, al menos, seis años. Calcule el intervalo medio entre máximos.

[pks,locs] = findpeaks(avSpots,'MinPeakDistance',6);

plot(year,avSpots,year(locs),pks,'or')
xlabel('Year')
ylabel('Number')
title('Sunspots')
axis tight

legend('Data','peaks','Location','NorthWest')

Figure contains an axes object. The axes object with title Sunspots contains 2 objects of type line. These objects represent Data, peaks.

cycles = diff(locs);
meanCycle = mean(cycles)
meanCycle = 10.8696

Se sabe que los ciclos de actividad solar son de aproximadamente 11 años. Compruébelo utilizando la transformada de Fourier. Elimine la media de la señal para concentrarse en sus fluctuaciones. Recuerde que la tasa de muestreo se mide en años. Utilice frecuencias hasta la frecuencia de Nyquist.

Fs = 1;
Nf = 512;

df = Fs/Nf;
f = 0:df:Fs/2-df;

trSpots = fftshift(fft(avSpots-mean(avSpots),Nf));

dBspots = 20*log10(abs(trSpots(Nf/2+1:Nf)));

yaxis = [20 85];
plot(f,dBspots,1./[meanCycle meanCycle],yaxis)
xlabel('Frequency (year^{-1})')
ylabel('| FFT | (dB)')
axis([0 1/2 yaxis])
text(1/meanCycle + .02,25,['<== 1/' num2str(meanCycle)])

Figure contains an axes object. The axes object contains 3 objects of type line, text.

La transformada de Fourier alcanza un pico en la frecuencia esperada, confirmando así la suposición de los 11 años. También puede encontrar el periodo localizando el pico más alto de la transformada de Fourier.

[pk,MaxFreq] = findpeaks(dBspots,'NPeaks',1,'SortStr','descend');

Period = 1/f(MaxFreq)
Period = 10.8936
hold on
plot(f(MaxFreq),pk,'or')
hold off
legend('Fourier transform','1/meanCycle','1/Period')

Figure contains an axes object. The axes object contains 4 objects of type line, text. These objects represent Fourier transform, 1/meanCycle, 1/Period.

Ambos cálculos coincidirán bastante.

Consulte también

|

Temas relacionados