¿Es posible implementar una media móvil en C sin necesidad de una ventana de muestras? He encontrado que puedo optimizar un poco, eligiendo un tamaño de ventana que es una potencia de dos para permitir el cambio de bits en lugar de dividir, pero no necesitar Un buffer sería bueno. ¿Existe una manera de expresar un nuevo promedio móvil sólo como una función del resultado anterior y la nueva muestra Definir un ejemplo de media móvil, a través de una ventana de 4 muestras para ser: Agregar nueva muestra e: Un promedio móvil se puede implementar recursivamente , Pero para un cálculo exacto de la media móvil tiene que recordar la más antigua muestra de entrada en la suma (es decir, el a en su ejemplo). Para una longitud N de media móvil se calcula: donde yn es la señal de salida y xn es la señal de entrada. Eq. (1) se puede escribir recursivamente como Así que siempre necesita recordar la muestra xn-N para calcular (2). Como señaló Conrad Turner, puede usar una ventana exponencial (infinitamente larga), que le permite calcular la salida sólo de la salida pasada y la entrada actual: pero esto no es una media móvil estándar (no ponderada) sino exponencial (Por lo menos en teoría) nunca se olvida nada (los pesos sólo se hacen más pequeños y más pequeños para las muestras en el pasado). Implementé un promedio móvil sin memoria de elementos individuales para un programa de seguimiento GPS que escribí. Empiezo con 1 muestra y divido por 1 para obtener la media actual. A continuación, añadir otra muestra y dividir por 2 a la actual media. Esto continúa hasta que consigo a la longitud del promedio. Cada vez después, agrego la nueva muestra, obtengo el promedio y elimino ese promedio del total. No soy un matemático, pero esto parecía una buena manera de hacerlo. Pensé que se convertiría en el estómago de un verdadero matemático, pero, resulta que es una de las maneras aceptadas de hacerlo. Y funciona bien. Sólo recuerde que cuanto más alto sea su longitud, más lento seguirá lo que desea seguir. Eso puede no importar la mayor parte del tiempo pero al seguir los satélites, si usted es lento, el rastro podría estar lejos de la posición real y parecerá malo. Usted podría tener una brecha entre el sat y los puntos finales. Elegí una longitud de 15 actualizado 6 veces por minuto para obtener suavizado adecuado y no llegar demasiado lejos de la posición real sentado con los puntos de pista suavizada. Respondió el 16 de noviembre a las 23:03 inicializar total 0, count0 (cada vez que vea un nuevo valor Entonces una entrada (scanf), una agregar totalnewValue, un incremento (count), un promedio de división (total / count) Sobre todas las entradas Para calcular el promedio sólo en las últimas 4 entradas, se requerirían 4 variables de entrada, tal vez copiando cada entrada a una variable de entrada más antigua, luego calculando la nueva media móvil como suma de las 4 variables de entrada, dividida por 4 Ser bueno si todos los insumos fueron positivos para hacer que el promedio de cálculo respondido Feb 3 15 at 4:06 Eso calculará realmente el promedio total y NO el promedio móvil A medida que el conteo se hace más grande el impacto de cualquier nueva muestra de entrada se vuelve ndsh 3 de febrero de 2011 a las 13:53 Su respuesta 2016 Stack Exchange, IncI esencialmente tienen una matriz de valores como este: La matriz anterior es simplificado, Im recopilación de 1 valor por milisegundo en mi código real y tengo que procesar la salida en un algoritmo I Escribió para encontrar el pico más cercano antes de un punto en el tiempo. Mi lógica falla porque en mi ejemplo anterior, 0.36 es el pico real, pero mi algoritmo miraría hacia atrás y vería el último número 0.25 como el pico, pues hay una disminución a 0.24 antes de él. El objetivo es tomar estos valores y aplicarles un algoritmo que los suavice un poco para que tenga valores más lineales. (Es decir: la identificación como mis resultados para ser curvy, no jaggedy) se me ha dicho que aplique un filtro de media móvil exponencial a mis valores. ¿Cómo puedo hacer esto? Es realmente difícil para mí para leer las ecuaciones matemáticas, trato mucho mejor con el código. ¿Cómo procesar los valores en mi matriz, aplicando un cálculo de promedio móvil exponencial para igualarlos? Preguntado Feb 8 12 at 20:27 Para calcular una media móvil exponencial. Usted necesita mantener un poco de estado alrededor y usted necesita un parámetro de ajuste. Esto requiere una pequeña clase (asumiendo que está usando Java 5 o posterior): Instantiate con el parámetro de decadencia que desea (puede tomar la afinación debe estar entre 0 y 1) y luego use average () para filtrar. Al leer una página sobre alguna recurrencia matemática, todo lo que realmente necesita saber al convertirlo en código es que a los matemáticos les gusta escribir índices en matrices y secuencias con subíndices. Sin embargo, la EMA es bastante simple, ya que sólo es necesario recordar un valor antiguo que no requiere arrays de estado complicado. Respondió 8 Feb a las 20:42 TKKocheran: Bastante. No es bueno cuando las cosas pueden ser simples (si comienza con una nueva secuencia, obtenga un nuevo averager). Observe que los primeros términos de la secuencia promediada saltarán alrededor de un bit debido a efectos de límite, pero obtendrá aquellos con otras medias móviles también. Sin embargo, una buena ventaja es que usted puede envolver la lógica del promedio móvil en el averager y experimentar sin molestar el resto de su programa demasiado. Ndash Donal Fellows Feb 9 12 en 0:06 Estoy teniendo un rato difícil entender sus preguntas, pero intentaré contestar de todos modos. 1) Si su algoritmo encontró 0.25 en lugar de 0.36, entonces es incorrecto. Está mal porque asume un aumento o una disminución monotónica (que siempre sube o baja siempre). A menos que usted promedio TODOS sus datos, sus puntos de datos --- como usted los presenta --- son no lineales. Si realmente desea encontrar el valor máximo entre dos puntos en el tiempo, corte su matriz de tmin a tmax y busque el máximo de ese subarray. 2) Ahora, el concepto de promedios móviles es muy simple: imagina que tengo la siguiente lista: 1.4, 1.5, 1.4, 1.5, 1.5. Puedo suavizarlo tomando el promedio de dos números: 1.45, 1.45, 1.45, 1.5. Observe que el primer número es el promedio de 1,5 y 1,4 (segundo y primeros números), la segunda (nueva lista) es el promedio de 1,4 y 1,5 (tercera y segunda lista antigua) la tercera (nueva lista) el promedio de 1,5 y 1,4 (Cuarto y tercero), y así sucesivamente. Podría haberlo hecho el período tres o cuatro, o n. Observe cómo los datos son mucho más suaves. Una buena manera de ver los promedios móviles en el trabajo es ir a Google Finance, seleccionar una acción (probar Tesla Motors bastante volátil (TSLA)) y hacer clic en technicals en la parte inferior de la tabla. Seleccione Promedio móvil con un período determinado y Promedio móvil exponencial para comparar sus diferencias. La media móvil exponencial es sólo otra elaboración de esto, pero los pesos de los datos más antiguos menos de los nuevos datos de esta es una manera de sesgar el alisamiento hacia la parte posterior. Por favor, lea la entrada de Wikipedia. Por lo tanto, esto es más un comentario que una respuesta, pero el pequeño cuadro de comentarios era sólo a pequeño. Buena suerte. Si usted está teniendo apuro con la matemáticas, usted podría ir con una media móvil simple en vez de exponencial. Así que la salida que obtendrías serían los últimos x términos divididos por x. Pseudocódigo no comprobado: Tenga en cuenta que tendrá que manejar las partes inicial y final de los datos, ya que claramente no puede medirse los últimos 5 términos cuando está en su segundo punto de datos. Además, hay maneras más eficientes de calcular este promedio móvil (suma suma - más reciente más reciente), pero esto es para obtener el concepto de lo que está sucediendo a través de. Respondió 8 febrero a las 20:41 Su respuesta 2016 Stack Exchange, IncC algoritmo de latencia cero exponencial media móvil Última actualización: 2012-08-13 He estado tratando de implementar un corte de baja frecuencia en c que esencialmente tiene una serie de números y Suaviza la salida (filtrando el movimiento de alta frecuencia / jitter), sin embargo es importante que los números ponderados delanteros se consideran inmediatamente como los datos son críticos en el tiempo (es para controlar una base de simulación de movimiento utilizando la salida de un poco de software de juego). Tengo un algoritmo de media móvil ponderada de trabajo, pero podría hacer con algo un poco más sensible en la parte delantera, y he encontrado esto: - El pseudo-código es como sigue: Entradas: Precio (NumericSeries), Period (NumericSimple) Variables: ZLEMA Factor de precio 2 / (Período1) Retardo (Período-1) / 2 Fin de más comenzar Factor ZLEMA (2Precio-Pricelag) (1 factor) ZLEMA1 fin Ive translated Lo en C y mi código es como sigue: Sin embargo, doesnt parecen comportarse bastante como Id esperar. Parece estar casi allí, pero a veces me dan un valor ligeramente inferior a todos los elementos de la cola (cuando son todos más altos). Mi cola y el número de elementos en él se pasan como parámetros, con el más reciente estar en la parte delantera en todo momento, también pasar un contador de incremento a partir de 0 como sea requerido por la función. No estoy seguro de Ive interpretado el significado de ZLEMA1 correctamente como no está claro en su pseudocódigo, por lo que he asumido que esto es la última llamada zlema y también estoy suponiendo que el precio realmente significa Price0. Tal vez Ive tiene este mal ¿Se supone que estoy copiando los valores reales zlema calculado de nuevo a mi cola original antes de la próxima llamada Yo no cambiar la cola original en todos los demás que simplemente cambiar todos los valores de uno al final e insertar lo último al principio . El código que utilizo para hacer esto es: Sería muy agradecido si alguien con una mejor comprensión de las matemáticas podría satisfacer sanidad comprobar esto para mí para ver si he conseguido algo ligeramente mal Gracias de antemano si puede ayudar En primer lugar gracias a todos por Su entrada, muy apreciado Eso tiene sentido, supongo, entonces supongo que lo mejor que puedo esperar es simplemente un promedio móvil exponencial, aceptando que habrá un pequeño retraso, pero esto será minimizado por la ponderación de peso más pesado que el dado en tipcial ponderado Media móvil Tengo este algoritmo también, pero un problema similar en que los valores no parecen muy correctos (a menos que sea la naturaleza de la fórmula). Por ejemplo, digamos que mi matriz contiene 16 valores, todos los 0.4775 - la salida es 0.4983, pero Id esperar que sea 0.4775 ¿Te parece bien a ti. / Promedio móvil exponencial. / Float ema (float vals, int numVals, int currentSample) factor estático float 0 static float lastema 0 float ema if (currentSample lt 1) ema vals0 factor 2.0 / ((float) numVals) 1.0) o bien ema (factor vals0) (1,0-factor)) lastema ema return ema A la inversa, a veces la salida es más baja que cada una de las entradas, incluso si todas son más altas. Se llama de la misma manera que zlema (.) Arriba, con un contador de incremento. La fórmula y el pseudocódigo para este están aquí: - autotradingstrategy. wordpress / 2009/11/30 / expo nential-mo ving-avera ge / Gracias de nuevo, disculpas por mi malentendido de algunos de los fundamentos :( Saludos cordiales, Chris J As Para el código que publiqué, youre correcto sobre la situación del tamaño de la matriz. Eso debe ser fijado fácilmente En cuanto a sus preguntas: 1) La constante del filtro representa un cutoff de la frecuencia. Utilicé un Digital Signal Processing (DSP) para esta técnica. Es. wikipedia. org/wi ki / Low-pas sfilter es una explicación sencilla. Desea la sección Realización de tiempo discreto. En mi caso el A es el RC-Constant del que hablan. Así que la frecuencia que corta es por encima de 1 / (2piA). Si usted no tiene una comprensión de la teoría de Frecuencia-Dominio, esto puede ser complicado. En su caso, cuanto más alto usted hace A, menor será la frecuencia que este filtro permitirá, lo que significa que suavizará la curva cada vez más. Cuanto más bajo lo haces, más ruido se permite en el sistema. Recuerde que A debe ser mayor o igual que 1 para ser efectivo. Volví a conectar el XLS, esta vez sin el cambio de rand () números. Ajuste la constante A y observe cómo quotsmoothsquot (o filtros) de las variaciones de alta frecuencia. 2) El último punto de la matriz de entrada tiene el valor más reciente. 3) Lo mismo ocurre con la matriz de salida. El último es el valor más reciente. 5) El NUMVALS es arbitrario. Puede agregar continuamente a la matriz de entrada y salida tantas veces como le gustaría y no afectaría el filtro. En particular, utilicé 49 puntos. Pero puedo eliminar fácilmente los últimos 20 y las primeras 29 salidas seguirían siendo las mismas. La función no se basa en cuántos puntos se están utilizando. Me gustaría mencionar que he desarrollado esta función para una conversión de una sola vez. Si desea hacer una conversión para el siguiente valor sobre la marcha podría probar algo más simple (como adjunto). Otra vez Im oxidado en c. Espero que esto sea correcto. La única cosa que usted necesitaría suministrar es la constante de entrada y filtro. Déjeme saber si esto ayuda.
Comments
Post a Comment