5 votos

Método en línea para detectar la amplitud de onda

Me gustaría medir la amplitud de las ondas en un ruidoso de series de tiempo en línea. Tengo una series de tiempo que los modelos de un ruidoso de la función de onda, que se somete a los cambios en la amplitud. Decir, por ejemplo, algo como esto:

set.seed <- 1001
x <- abs(sin(seq(from = 0, t = 100, by = 0.1)))
x <- x + (runif(1001, 0, 1) / 5)
x <- x * c(rep(1.0, 500), rep(2.0, 501))

Los datos resultantes se parece a esto:

> head(x, n = 30)
 [1] 0.1581530 0.1329728 0.3911897 0.4104984 0.4774424 0.5118123 0.6499325
 [8] 0.6837706 0.8520770 0.8625692 0.8441520 0.9960601 1.1119514 1.1414032
[15] 1.1153601 1.1456799 1.0843497 1.1141201 1.1290904 0.9906415 0.9836052
[22] 0.9369836 0.9493608 0.7484588 0.7588435 0.6467422 0.5787302 0.4665009
[29] 0.4643982 0.3398427
> plot(x)
> lines(x)

Plot of waves

Como se puede ver, la causa del ruido en la serie los datos no aumenta monótonamente entre las olas " los comederos y las crestas.

Estoy buscando una manera de estimar la amplitud de cada onda del pico en línea en un cómputo untaxing manera. Es probable que pueda encontrar una manera de medir la magnitud máxima del ruido plazo. No estoy seguro de si la frecuencia de las ondas es constante, por lo que estaría interesado tanto en las respuestas que suponen una constante (conocida) con la frecuencia de la onda o una variable de la frecuencia de la onda. Los datos reales también es sinusoidal.

Estoy seguro de que este es un problema común con las bien conocidas las soluciones, pero soy tan nueva en esto, que yo no sé ni qué términos de búsqueda. También, le pido disculpas si esta pregunta sería más apropiado stackoverflow, puedo pedir, si se prefiere.

1voto

En respuesta a otra pregunta en este foro, me he referido a la OP a este sitio donde no está abierto el código fuente de una función llamada HT_PERIOD para medir instantáneamente el período de una serie de tiempo. También hay funciones que se llama HT_PHASE, HT_PHASOR y HT_SINE respectivamente, una medida de la fase, el fasor de los componentes de la onda sinusoidal/componente cíclico y el extracto de la onda sinusoidal de la misma (en escala entre -1 y 1) de una serie de tiempo. Como los cálculos de estas funciones son causales que sería apropiado para una función en línea que se actualiza a medida que nuevos datos que viene. El código de estas funciones podrían ser de ayuda para usted.

1voto

Kevin Ballard Puntos 88866

Más de una solución completa este está destinado a ser un muy aproximada de la serie de "consejos" sobre cómo implementar el uso de la FFT, que son probablemente los mejores métodos, pero, si funciona...

En primer lugar vamos a generar la onda, con diferentes niveles de frecuencia y amplitud

  freqs <- c(0.2, 0.05, 0.1)
  x <- NULL
  y <- NULL
  for (n in 1:length(freqs))
      {
      tmpx <- seq(n*100, (n+1)*100, 0.1)
      x <- c(x, tmpx)
      y <- c(y, sin(freqs[n] * 2*pi*tmpx))
      }

  y <- y * c(rep(1:5, each=(length(x)/5)))
  y <- y + rnorm(length(x), 0, 0.2)
  plot(x, y, "l")

Lo que nos da este

Test wave

Ahora, si queremos calcular la FFT de la onda de usar fft y, a continuación, una gráfica (he utilizado el plotFFT función que he publicado aquí), se obtiene:

Global FFT of the wave

Tenga en cuenta que yo overplotted el 3 frecuencias (0.05, 0.1 y 0.2) con la que me generó los datos. Como los datos se sinusoidal de la FFT hace un muy buen trabajo en la recuperación de ellos. Tenga en cuenta que esto funciona mejor cuando los valores son 0 centrado.

Ahora vamos a hacer un deslizamiento de la FFT con una ventana de 50 obtenemos

Windowed FFT

Como era de esperar, al principio solo el 0.2 frecuencia (los primeros 2 de la trama, así que entre 0 y 100), como se ve en el 0,05 frecuencia (100-200) y, finalmente, el 0.1 frecuencia viene (200-300).

El poder de la función FFT es proporcional a la amplitud de la onda. De hecho, si escribimos el máximo en cada ventana, se obtiene:

1 Max frequency:  0.2  - power:  254
2 Max frequency:  0.2  - power:  452
3 Max frequency:  0.04  - power:  478
4 Max frequency:  0.04  - power:  606
5 Max frequency:  0.1  - power:  1053
6 Max frequency:  0.1  - power:  1253 

===

Esto también se puede lograr utilizando un STFT (short-time Fourier transform), que es básicamente lo mismo que les mostré antes, pero con la superposición de windows. Esto se lleva a cabo, por ejemplo, por la evolfft función de la RSEIS paquete.

Le daría a usted:

stft <- evolfft(y, dt=0.1, Nfft=2048, Ns=100, Nov=90, fl=0, fh=0.5)
plotevol(stft) 

STFT

Esto, sin embargo, puede ser más complicado de analizar, especialmente en línea.

espero que esto ayude de alguna manera

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