Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Ajustar modelos de Fourier

Sobre los modelos de serie de Fourier

Una serie de Fourier describe una función periódica como una suma de funciones de seno y coseno. Una función periódica arbitraria se puede descomponer en componentes simples mediante el uso de una serie de Fourier. Estos componentes son fáciles de integrar, diferenciar y analizar. Por esta razón, las series de Fourier se emplean con frecuencia para aproximar señales periódicas.

Las series de Fourier se representan con varios formatos. Curve Fitting Toolbox™ usa la serie de Fourier trigonométrica

y=a0+i=1naicos(iwx)+bisin(iwx)

en la que a0 modela un término constante (intercepto) en los datos y se asocia con el término coseno i = 0, w es la frecuencia fundamental de la señal y n es el número de términos (armónicos). Curve Fitting Toolbox admite la regresión de series de Fourier para 1 ≤ n ≤ 8.

Para obtener más información sobre las series de Fourier, consulte Análisis y filtrado de Fourier.

Ajustar el modelo de Fourier de forma interactiva en la app Curve Fitter

En este ejemplo se muestra cómo utilizar la app Curve Fitter para ajustar un modelo de Fourier a los datos.

Cargue los datos de muestra de señal de sonido.

load gong.mat

Las variables y y Fs contienen datos de la señal de sonido y frecuencia para un sonido de gong, respectivamente. Cree un clip de sonido almacenando los primeros 1000 elementos de y en un vector denominado gongClip.

gongClip = y(1:1000);

Para calcular el tiempo correspondiente de cada elemento en gongClip, divida el índice de los elementos por Fs.

t = [1:1000]./Fs;

Abra la app Curve Fitter desde la línea de comandos.

curveFitter

También puede hacer clic en Curve Fitter dentro del grupo Math, Statistics and Optimization de la pestaña Apps.

En la app Curve Fitter, seleccione las variables de datos para el ajuste. En la sección Data de la pestaña Curve Fitter, haga clic en Select Data. En el cuadro de diálogo Select Fitting Data, seleccione t como el valor X data y gongClip como el valor Y data.

Select_Fitting_Data.png

La app representa los puntos de datos a medida que selecciona variables. De forma predeterminada, la app ajusta un polinomio a los datos. Para ajustar un modelo de Fourier, en la sección Fit Type de la pestaña Curve Fitter, haga clic en Fourier.

FourierGallery.png

La app se ajusta a un modelo de Fourier de un solo término.

fourier1.png

El modelo de Fourier ajustado de un término es una función periódica con un comportamiento oscilatorio simple. En el panel Results se muestra la ecuación general para el modelo, las estimaciones de los coeficientes ajustados con intervalos de confianza del 95%, la frecuencia fundamental y las estadísticas de bondad de ajuste.

resultsFourier1.png

El modelo de Fourier ajustado de un término tiene un error cuadrático medio (RMSE) de 0,1996. Para comparar el modelo de Fourier de un término con un modelo de Fourier de cuatro términos, en el panel Fit Options, seleccione 4 para Number of terms. La app ajusta un modelo de Fourier de cuatro términos a los datos.

fourier4.png

El modelo de Fourier ajustado de cuatro términos tiene un comportamiento oscilatorio más complejo que el modelo de Fourier de un término. Un RMSE de 0,1685 para el modelo de cuatro términos indica que cuatro términos predicen los datos de sonido con mayor precisión que uno solo. Sin embargo, la gráfica muestra que algunos de los puntos de datos de gongClip están fuera del rango del modelo de cuatro términos.

Exporte el modelo de Fourier ajustado de cuatro términos al área de trabajo haciendo clic en Export en la sección Export y, a continuación, seleccionando Export to Workspace. En el cuadro de diálogo, desmarque la segunda y la tercera opción. Guarde el ajuste en el nombre de la variable en el recuadro junto a la primera opción.

ExportFitWindow.png

Puede escuchar los datos de sonido de gongClip utilizando la función sound.

sound(gongClip,Fs)
pause(2)    % Allow gongClip to play before executing next line

Para obtener los datos de sonido para la aproximación del modelo de Fourier de gongClip, use feval para evaluar gongFourierModel en los tiempos de t. Reproduzca los datos de sonido aproximados.

gongClipApprox = feval(gongFourierModel,t);
sound(gongClipApprox,Fs)

Los dos clips tienen el mismo tono promedio aproximado. Sin embargo, los datos de sonido aproximados no tienen tantas fluctuaciones de tono como los datos de sonido de gongClip.

Ajustar el modelo de Fourier en la línea de comandos

En este ejemplo se muestra cómo ajustar un modelo de Fourier a los datos empleando la función fit.

Ajustar modelos de Fourier de dos términos

Cargue los datos de El Niño-Southern Oscilation (ENSO).

load enso;

La variable pressure contiene datos para la diferencia de presión atmosférica promediada entre la Isla de Pascua, Chile, y Darwin, Australia. La variable month contiene datos del mes en que se produjo cada diferencia de presión.

Represente pressure contra month.

plot(month,pressure)

Los datos de presión oscilan entre 0 y 18, lo que indica que se pueden describir con una serie de Fourier.

Para ajustar un modelo de Fourier de dos términos, utilice el modelo de Fourier de la biblioteca. Especifique el tipo de modelo como fourier seguido del número de términos. Guarde los valores estadísticos de bondad de ajuste para compararlos más adelante.

[f2,gof2] = fit(month,pressure,"fourier2")
f2 = 
     General model Fourier2:
     f2(x) =  a0 + a1*cos(x*w) + b1*sin(x*w) + 
               a2*cos(2*x*w) + b2*sin(2*x*w)
     Coefficients (with 95% confidence bounds):
       a0 =       10.63  (10.23, 11.03)
       a1 =       2.923  (2.27, 3.576)
       b1 =       1.059  (0.01593, 2.101)
       a2 =     -0.5052  (-1.086, 0.07532)
       b2 =      0.2187  (-0.4202, 0.8576)
       w =      0.5258  (0.5222, 0.5294)
gof2 = struct with fields:
           sse: 1.1230e+03
       rsquare: 0.4279
           dfe: 162
    adjrsquare: 0.4103
          rmse: 2.6329

f2 es un objeto cfit que contiene la fórmula general, las estimaciones de coeficientes con límites de confianza del 95% y frecuencia fundamental para el ajuste w. Los límites de confianza en a2 y b2 cruzan por cero, por lo que no hay suficiente evidencia para concluir que difieren de cero o que el modelo ajustado difiere de un modelo de Fourier de un término. El error cuadrático medio (RMSE) de 2,6329 es útil para comparar la precisión de f2 con la precisión de otros ajustes.

Para calcular el periodo a partir de la frecuencia fundamental, utilice la fórmula T = 2*pi/w.

w = f2.w
w = 0.5258
T = 2*pi/w
T = 11.9497

El periodo del modelo de Fourier de dos términos ajustado es de aproximadamente 12 meses, o un año.

Represente f2 con una gráfica de dispersión de los datos.

plot(f2,month,pressure)

La forma de f2 es similar a la forma de un modelo de Fourier de un término, y los picos de oscilación se producen aproximadamente una vez cada 12 meses.

Ajustar modelos de Fourier de siete términos

Ajuste un modelo de Fourier de siete términos a los datos. Guarde las estadísticas de bondad de ajuste.

[f7,gof7] = fit(month,pressure,"fourier7")
f7 = 
     General model Fourier7:
     f7(x) = 
               a0 + a1*cos(x*w) + b1*sin(x*w) + 
               a2*cos(2*x*w) + b2*sin(2*x*w) + a3*cos(3*x*w) + b3*sin(3*x*w) + 
               a4*cos(4*x*w) + b4*sin(4*x*w) + a5*cos(5*x*w) + b5*sin(5*x*w) + 
               a6*cos(6*x*w) + b6*sin(6*x*w) + a7*cos(7*x*w) + b7*sin(7*x*w)
     Coefficients (with 95% confidence bounds):
       a0 =       10.63  (10.28, 10.97)
       a1 =      0.5669  (0.08285, 1.051)
       b1 =      0.1969  (-0.29, 0.6838)
       a2 =      -1.203  (-1.687, -0.7189)
       b2 =     -0.8085  (-1.307, -0.31)
       a3 =      0.9323  (0.4325, 1.432)
       b3 =      0.7599  (0.2622, 1.258)
       a4 =     -0.6653  (-1.149, -0.1817)
       b4 =     -0.2038  (-0.6995, 0.292)
       a5 =    -0.02913  (-0.5129, 0.4547)
       b5 =     -0.3701  (-0.8566, 0.1164)
       a6 =    -0.04841  (-0.5437, 0.4469)
       b6 =     -0.1367  (-0.6286, 0.3552)
       a7 =       2.812  (2.19, 3.433)
       b7 =       1.333  (0.4017, 2.264)
       w =     0.07527  (0.07478, 0.07576)
gof7 = struct with fields:
           sse: 768.3656
       rsquare: 0.6086
           dfe: 152
    adjrsquare: 0.5700
          rmse: 2.2483

f7 contiene varios coeficientes con límites de confianza que cruzan por cero, por lo que no hay suficiente evidencia para concluir que los términos correspondientes aumentan la precisión del modelo de Fourier ajustado. El RMSE de 2,2483 es menor que el error RMSE de f2, lo que confirma que el modelo de Fourier de siete términos predice la presión de manera más precisa que el modelo de Fourier de dos términos.

Para calcular el periodo a partir de la frecuencia fundamental, utilice la fórmula T = 2*pi/w.

w = f7.w
w = 0.0753
T = (2*pi)/w
T = 83.4745

El periodo del modelo de Fourier de 7 términos ajustado es de aproximadamente 83 meses, o aproximadamente 7 años. La amplitud de los coeficientes ajustados determina qué términos contribuyen más al valor previsto de la diferencia de presión.

El periodo de una sinusoide del formato sin(Ax) o cos(Ax) lo proporciona la fórmula T = 2*pi/|A|. a7 y b7 son los coeficientes más grandes.

T = 2*pi/(w*7)
T = 11.9249

El periodo de los términos correspondientes a a7 y b7 es de aproximadamente 12 meses, lo que indica que el ciclo anual es el más fuerte.

Use la misma fórmula para calcular los periodos de los términos siguientes:

  • Los términos a1 y b1 tienen un periodo de 7 años cada uno.

  • Los términos a2 y b2 tienen un periodo de 3,5 años (7/2) cada uno. Los coeficientes a2 y b2 tienen una magnitud mayor que a1 y b1, por lo que el ciclo de 3,5 años contribuye más al valor previsto de la diferencia de presión que el ciclo de 7 años.

  • Los términos a3 y b3 son fuertes, lo que indica un ciclo de 2,3 años (7/3).

Los términos más pequeños, como a6, b6, a5 y b5, son menos importantes para el ajuste.

Represente f7 con una gráfica de dispersión de los datos.

plot(f7,month,pressure)

El modelo de Fourier de 7 términos oscila en un patrón más complejo y captura un rango más amplio de valores en la diferencia de presión que el modelo de Fourier de un solo término. El ciclo se repite aproximadamente cada 84 meses, o 7 años. Habitualmente, el calentamiento de El Niño se produce en intervalos irregulares de entre dos y siete años, y dura entre 9 meses y 2 años. La duración media del periodo es de cinco años. Los resultados del modelo reflejan algunos de estos periodos.

Definir los puntos de partida

La función fit utiliza el argumento de entrada data para calcular los puntos de partida optimizados de los cálculos del coeficiente y la frecuencia fundamental. Los modelos de serie de Fourier son especialmente sensibles a los puntos de partida y es posible que los valores optimizados sean precisos solo para algunos términos en las ecuaciones asociadas. Puede anular los puntos de partida optimizados especificando el argumento nombre-valor StartPoint.

Los valores extremos en la gráfica de dispersión de los datos sugieren que puede estar presente un ciclo de 4 años. Para confirmar esta sugerencia, establezca el punto de partida de la frecuencia fundamental en el valor correspondiente a un periodo de 8 años, o 96 meses. Un periodo de 8 años para el modelo de Fourier ajustado aumenta el periodo de los términos a2 y b2 de 3.5 a 4.

w_8 = (2*pi)/96
w_8 = 0.0654

Para encontrar el índice de la frecuencia fundamental en el vector de celdas de nombres de coeficientes de f7, utilice la función coeffnames.

coeffnames(f7)
ans = 16×1 cell
    {'a0'}
    {'a1'}
    {'b1'}
    {'a2'}
    {'b2'}
    {'a3'}
    {'b3'}
    {'a4'}
    {'b4'}
    {'a5'}
    {'b5'}
    {'a6'}
    {'b6'}
    {'a7'}
    {'b7'}
    {'w' }

La frecuencia fundamental se encuentra en la última entrada del vector de nombres de coeficientes. Cree un vector de valores de coeficientes a partir de los coeficientes f7 y sustituya el valor de la frecuencia fundamental con el valor correspondiente a un periodo de 8 años.

coeffs = coeffvalues(f7);
coeffs(:,end) = w_8
coeffs = 1×16

   10.6262    0.5669    0.1969   -1.2031   -0.8085    0.9323    0.7599   -0.6653   -0.2038   -0.0291   -0.3701   -0.0484   -0.1367    2.8120    1.3330    0.0654

Ajuste un modelo de Fourier de siete términos a los datos de la diferencia de presión utilizando los coeficientes con el nuevo valor de la frecuencia fundamental como punto de partida. Guarde las estadísticas de bondad de ajuste.

[f7_8,gof7_8] = fit(month,pressure,"fourier7",StartPoint=coeffs)
f7_8 = 
     General model Fourier7:
     f7_8(x) = 
               a0 + a1*cos(x*w) + b1*sin(x*w) + 
               a2*cos(2*x*w) + b2*sin(2*x*w) + a3*cos(3*x*w) + b3*sin(3*x*w) + 
               a4*cos(4*x*w) + b4*sin(4*x*w) + a5*cos(5*x*w) + b5*sin(5*x*w) + 
               a6*cos(6*x*w) + b6*sin(6*x*w) + a7*cos(7*x*w) + b7*sin(7*x*w)
     Coefficients (with 95% confidence bounds):
       a0 =       10.58  (10.05, 11.1)
       a1 =      0.3286  (-0.4339, 1.091)
       b1 =    -0.05917  (-0.7884, 0.6701)
       a2 =     -0.8667  (-1.738, 0.004258)
       b2 =       1.094  (0.2819, 1.906)
       a3 =     -0.4524  (-1.232, 0.3272)
       b3 =     -0.3117  (-1.099, 0.4753)
       a4 =       0.181  (-0.7949, 1.157)
       b4 =      0.5806  (-0.1796, 1.341)
       a5 =     0.03263  (-0.7174, 0.7827)
       b5 =     -0.2299  (-0.9767, 0.5169)
       a6 =      0.3726  (-0.39, 1.135)
       b6 =     -0.2745  (-1.165, 0.6161)
       a7 =      0.4309  (-0.491, 1.353)
       b7 =     -0.3547  (-1.316, 0.6062)
       w =     0.06795  (0.06519, 0.0707)
gof7_8 = struct with fields:
           sse: 1.6851e+03
       rsquare: 0.1416
           dfe: 152
    adjrsquare: 0.0568
          rmse: 3.3296

Los coeficientes de f7_8 están ligeramente desplazados con respecto a los coeficientes de f7. La RMSE más alta para f7_8 indica que f7 es un mejor ajuste para los datos. Represente ambos ajustes para comparar los modelos visualmente.

plot(f7_8,month,pressure)
hold on
plot(f7, 'b')
hold off
legend("Data","f7_8","f7")

La gráfica muestra que f7 captura la variación de los datos de la diferencia de presión de forma más precisa que f7_8.

Mostrar iteraciones de ajuste de Fourier

Una alternativa a especificar opciones adicionales mediante argumentos de par nombre-valor es pasar un objeto fitoptions a la función fit. Para ver las opciones disponibles para un ajuste del modelo de Fourier, pase el nombre del modelo como argumento de entrada a la función fitoptions.

fitoptions("fourier7")
ans =

        Normalize: 'off'
          Exclude: []
          Weights: []
           Method: 'NonlinearLeastSquares'
           Robust: 'Off'
       StartPoint: [1×0 double]
            Lower: [1×0 double]
            Upper: [1×0 double]
        Algorithm: 'Trust-Region'
    DiffMinChange: 1.0000e-08
    DiffMaxChange: 0.1000
          Display: 'Notify'
      MaxFunEvals: 600
          MaxIter: 400
           TolFun: 1.0000e-06
             TolX: 1.0000e-06

Cree un objeto fitoptions y especifique que se muestre la salida tras cada iteración.

optionsf7 = fitoptions("fourier7",Display="iter")
options =

        Normalize: 'off'
          Exclude: []
          Weights: []
           Method: 'NonlinearLeastSquares'
           Robust: 'Off'
       StartPoint: [1×0 double]
            Lower: [1×0 double]
            Upper: [1×0 double]
        Algorithm: 'Trust-Region'
    DiffMinChange: 1.0000e-08
    DiffMaxChange: 0.1000
          Display: 'Iter'
      MaxFunEvals: 600
          MaxIter: 400
           TolFun: 1.0000e-06
             TolX: 1.0000e-06

optionsf7 es un objeto fitoptions que contiene las opciones de un ajuste de modelo de Fourier de 7 términos.

Para ver los pasos de iteración involucrados en la creación de f7, ajuste otro modelo de Fourier de 7 términos usando las opciones de optionsf7.

f7_iter = fit(month,pressure,"fourier7",optionsf7)
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality   CG-iterations
     0          2          768.41                      1.93e+03
     1          4         768.366     2.2176e-05           69.1            0
     2          6         768.366    7.94962e-07           2.48            0
Success, but fitting stopped because change in residuals less than tolerance (TolFun).
f7_iter = 
     General model Fourier7:
     f7_iter(x) = 
               a0 + a1*cos(x*w) + b1*sin(x*w) + 
               a2*cos(2*x*w) + b2*sin(2*x*w) + a3*cos(3*x*w) + b3*sin(3*x*w) + 
               a4*cos(4*x*w) + b4*sin(4*x*w) + a5*cos(5*x*w) + b5*sin(5*x*w) + 
               a6*cos(6*x*w) + b6*sin(6*x*w) + a7*cos(7*x*w) + b7*sin(7*x*w)
     Coefficients (with 95% confidence bounds):
       a0 =       10.63  (10.28, 10.97)
       a1 =      0.5669  (0.08285, 1.051)
       b1 =      0.1969  (-0.29, 0.6838)
       a2 =      -1.203  (-1.687, -0.7189)
       b2 =     -0.8085  (-1.307, -0.31)
       a3 =      0.9323  (0.4325, 1.432)
       b3 =      0.7599  (0.2622, 1.258)
       a4 =     -0.6653  (-1.149, -0.1817)
       b4 =     -0.2038  (-0.6995, 0.292)
       a5 =    -0.02913  (-0.5129, 0.4547)
       b5 =     -0.3701  (-0.8566, 0.1164)
       a6 =    -0.04841  (-0.5437, 0.4469)
       b6 =     -0.1367  (-0.6286, 0.3552)
       a7 =       2.812  (2.19, 3.433)
       b7 =       1.333  (0.4017, 2.264)
       w =     0.07527  (0.07478, 0.07576)

Para investigar más el ajuste del modelo de Fourier, puede experimentar especificando diferentes opciones disponibles para el algoritmo de ajuste de NonlinearLeastSquares. Para obtener más información, consulte fitoptions.

Consulte también

Apps

Funciones

Temas relacionados