8 votos

Datos de Fourier con períodos no entero, corrigiendo por sesgo de fase

Tengo datos que creo que es sinusoidal, pero no tengo una integral número de períodos. ¿Cómo puedo encontrar el "mejor ajuste" Sin/Cos función, compensación por esto, y por el feo constante que aparece? EJEMPLO:

  • Aquí hay algunos datos que sigue un patrón sinusoidal (Mathematica formato)

    t4 = N[Table[Sin[3.17*2*Pi*x/200], {x,1,200}]];

  • Ahora, con sólo t4, quiero volver a Sin[3.17*2*Pi*x/200] o el equivalente.

  • Tenga en cuenta que Mean[t4] es distinto de cero (se trata de 0.0281886). El los análisis que he probado hasta ahora "sacar" esto significa (como "0.0281886 + ..."). Esto es malo porque es raro voy a volver a mi forma original con esa constante sacó.

  • El uso de j0ker5 excelente técnica de http://stackoverflow.com/questions/4463481/continuous-fourier-transform-on-discrete-data-using-mathematica puedo compensar la no integral período y obtener:

    0.0281886 + 0.983639 Cos[1.49867 - 0.0992743 x]

Tenga en cuenta que el x plazo es 3.16*2*Pi*x/200, muy cerca de mi original.

  • He modificado j0ker5 la técnica ligeramente. La función real que he utilizado para conseguir lo anterior:


superfourier2[data_] :=Module[ 
 {pdata, n, f, pos, fr, frpos, freq, phase, coeff}, 
 pdata = data; 
 n = Length[data]; 
 f = Abs[Fourier[pdata]]; 
 pos = Ordering[-f, 1][[1]] - 1; 
 fr = Abs[Fourier[pdata*Exp[2*PiIposRange[0,n-1]/n], 
      FourierParameters -> {0, 2/n}]]; 
 frpos = Ordering[-fr, 1][[1]]; 
 freq = (pos + 2(frpos - 1)/n); 
 phase = Sum[Exp[freq*2*PiIx/n]*pdata[[x]], {x,1,n}]; 
 coeff =  N[{Mean[data], 2*Abs[phase]/n, freq*2*Pi/n, Arg[phase]}]; 
 Function[x, Evaluate[coeff[[1]] + coeff[[2]]*Cos[coeff[[3]]*x - coeff[[4]]]]] 
] 
  • Además de la mala término constante, tenga en cuenta que la adición de "0.983639*Cos[1.49867 - 0.0992743 x]" para x=1..200 rendimientos 0.0279175*200, que estoy convencido de que hace las cosas peor, no mejor.

  • Creo que el 0.0279175*200 suma desde el coseno y la 200*0.0281886 de la media de alguna manera se puede "cancelar" para ceder parte de atrás de mi pura Sin[] función.

Los pensamientos?

6voto

jldugger Puntos 7490

El periodograma estimar los períodos. Esto también puede manejar los datos con ruido y escoger varios componentes sinusoidales de diferente período.

Rápido y sucio Mathematica cálculo es

data = N[Table[Sin[3.17*2*Pi*x/200], {x, 1, n}]];
welch = 1 - (2 (Range[n] - (n - 1)/2)/(n + 1))^2;
fData = Append[Abs[Fourier[welch data]]^2 / (Plus @@ (welch^2)), 0];
fData = (fData + Reverse[fData])/2;
fData = fData / (Plus @@ fData);

(Usted realmente no necesita los dos últimos pasos, pero me quedé con ellos debido a que se produjeron las ilustraciones a continuación.)

Aquí está una parcela de la parte importante de la periodograma en este ejemplo:

Periodogram

Los puntos son el periodograma valores mientras que la línea es rápido suave (yo usé un polinomio interpolador de orden 5, pero con más tiempo podría aplicar un núcleo Gaussiano suave):

f = Interpolation[Log[fData], InterpolationOrder -> 5];
period = x /. (NMaximize[f[x + 1], x] // Last)

La máxima de la atenuación del valor se produce en $3.17661$, cuya cercanía a $3.17$ es la evidencia de la promesa de esta técnica.

Una vez que usted tiene una estimación del plazo, es sencillo encontrar la fase y la amplitud (uso no lineal de mínimos cuadrados, o ejecutar un estricto filtro de paso de banda sobre la transformada de Fourier y de invertir).

NonlinearModelFit[data, a Sin[\[Phi] + period*2*Pi*x/200], {a, \[Phi]}, x]

La amplitud estimada ( $a$ ) $1.00011$ y la fase ( $\phi$ )$0.0212758$, ambos cerca de los valores reales de a$1$$0$, respectivamente. (La fase de estimación es menos de un intervalo de muestreo ($2\pi/200 = 0.0314$) de la fase correcta, que es casi tan bueno como se puede esperar.) Comparar los datos para este ajuste:

Data and fit

Los residuos se presentan algunos cuasi-periodicidad (atribuibles a la corte de los datos en una integral período) y el rango de$-0.018$$0.021$.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X