Bien háganse una idea...
Tengo un conjunto de datos, del que cada ciclo extraigo uno. Ese dato se almacena en un vector, bajo la condición de que la distancia con el valor anterior almacenado entre dentro de un umbral predeterminado. Si se sale del rango, asigno a ese ciclo el dato del ciclo anterior. Es un filtrado simple para evitar espúreos y es aceptable en el entorno de datos que estoy manejando. La idea es que el valor del vector representa un cierto estado, y solo permito cambios de estado de +- el umbral. En código de Matlab:
Ejecutando el programa donde va eso, me encuentro que en ciertos conjuntos de datos, el comportamiento es malo. Viendo los vectores resultantes, llego a la conclusión de que el problema está en el filtro, ya que dadas ciertas condiciones iniciales extremas, puede fastidiarlo todo.
Así que se me ocurre hacer una pequeña modificación en el programa, de manera que me queden dos vectores, uno filtrado y otro sin filtrar, para así poder comparar el efecto del filtro.
O sea, comparo el valor seleccionado en este ciclo, almacenado en grupoDCT2(i), con el valor anterior del vector filtrado. Al final debería tener dos vectores, teniendo en grupoDCT2Filtro el mismo vector que antes de las modificaciones. En principio yo diría que está bien, ¿no?
Pues va a ser que no...
El vector filtrado resultante era completamente distinto al calculado con la versión anterior del programa.
Tocaba revisar...
Y revisar...
Y revisar...
Después de darle ochocientas mil vueltas, he encontrado la solución:
O sea, en vez de usar en la comparacion grupoDCT2(i) uso grupoDCT2Filtro(i), al que le he asignado el mismo valor que a grupoDCT2(i).
Y así funciona...
Estoy convencido de que hay alguna soberana chorrada que se me escapa, pero no he sido capaz de encontrarla...
En fin... Ya suelo decir que la informática es cualquier cosa menos una ciencia exacta...
Tengo un conjunto de datos, del que cada ciclo extraigo uno. Ese dato se almacena en un vector, bajo la condición de que la distancia con el valor anterior almacenado entre dentro de un umbral predeterminado. Si se sale del rango, asigno a ese ciclo el dato del ciclo anterior. Es un filtrado simple para evitar espúreos y es aceptable en el entorno de datos que estoy manejando. La idea es que el valor del vector representa un cierto estado, y solo permito cambios de estado de +- el umbral. En código de Matlab:
grupoDCT2(i) = datoSeleccionado;
if abs(grupoDCT2(i) - grupoDCT2(i-1)) > umbral
grupoDCT2(i) = grupoDCT2(i-1);
end
Ejecutando el programa donde va eso, me encuentro que en ciertos conjuntos de datos, el comportamiento es malo. Viendo los vectores resultantes, llego a la conclusión de que el problema está en el filtro, ya que dadas ciertas condiciones iniciales extremas, puede fastidiarlo todo.
Así que se me ocurre hacer una pequeña modificación en el programa, de manera que me queden dos vectores, uno filtrado y otro sin filtrar, para así poder comparar el efecto del filtro.
grupoDCT2(i) = datoSeleccionado;
if abs(grupoDCT2(i) - grupoDCT2Filtro(i-1)) > umbral
grupoDCT2Filtro(i) = grupoDCT2Filtro(i-1);
else
grupoDCT2Filtro(i) = grupoDCT2(i);
end
O sea, comparo el valor seleccionado en este ciclo, almacenado en grupoDCT2(i), con el valor anterior del vector filtrado. Al final debería tener dos vectores, teniendo en grupoDCT2Filtro el mismo vector que antes de las modificaciones. En principio yo diría que está bien, ¿no?
Pues va a ser que no...
El vector filtrado resultante era completamente distinto al calculado con la versión anterior del programa.
Tocaba revisar...
Y revisar...
Y revisar...
Después de darle ochocientas mil vueltas, he encontrado la solución:
grupoDCT2(i) = datoSeleccionado;
grupoDCT2Filtro(i) = datoSeleccionado;
if abs(grupoDCT2Filtro(i) - grupoDCT2Filtro(i-1)) > umbral
grupoDCT2Filtro(i) = grupoDCT2Filtro(i-1);
end
O sea, en vez de usar en la comparacion grupoDCT2(i) uso grupoDCT2Filtro(i), al que le he asignado el mismo valor que a grupoDCT2(i).
Y así funciona...
Estoy convencido de que hay alguna soberana chorrada que se me escapa, pero no he sido capaz de encontrarla...
En fin... Ya suelo decir que la informática es cualquier cosa menos una ciencia exacta...