¿Cómo puedo filtrar paso alto (DSP) una señal de baja frecuencia sin introducir retraso?

Necesito filtrar una señal de paso alto, y mi diseño simplemente no es suficiente. La parte que lo complica es que no puedo tolerar el retraso. Estoy muestreando a 20 Hz, la señal que me importa es de 1/12 a 1/4 Hz, y mi sistema tiene que ser lo más real posible (un retraso de 2 segundos para el procesamiento de la señal es todo lo que puedo manejar). La frecuencia de esquina es flexible, pero tiene que estar por debajo de 1/10 Hz en el peor de los casos.

He estado usando un filtro de paso bajo similar a IIR como este:

signal_low_freq(n) = (signal_low_freq(n-1)*(filter_constant - 1) + (sensor_data(n))) /filter_constant;

signal_ac(n) = sensor_data(n) - signal_low_freq(n);

donde constante_filtro = 165.

Tiene una latencia baja, pero también introduce una gran cantidad de errores relacionados con la fase (lo medí en unas 100 muestras de retraso).

He usado fdatool de Matlab y puedo obtener excelentes resultados con un filtro FIR de alto orden, pero obviamente eso es demasiado retraso.

¿Alguien tiene una buena solución a este problema de DSP?

Como nota: en el rango de audio, es similar al muestreo a 48 kHz y al filtrado de paso alto con una frecuencia de esquina entre 150 Hz y 240 Hz.

¿Es ese el código exacto? -- porque le falta un índice para los datos del sensor en la primera línea. ¿Puede mostrar una figura para la respuesta de paso de su filtro y signal_low_freq?
Buena captura en el índice faltante, lo arreglé. Está prácticamente línea por línea el código, con todos los nombres cambiados para que nadie se moleste. El filtro que describí es basura y no funciona bien en absoluto, pero DSP no es mi conjunto de habilidades más fuerte y no sé qué más hacer que no introduzca un retraso importante.

Respuestas (1)

Me temo que te enfrentas a una limitación fundamental de los sistemas físicos causales reales. Está solicitando un filtro que pueda distinguir entre señales que tienen períodos de 12 a 16 segundos, pero que solo le permita "mirar" un segmento de 2 segundos (1/6 a 1/8 del período) de la forma de onda en cuestión. Simplemente no es posible obtener un cambio de fase y un retraso bajo en estas circunstancias.

¿Puede proporcionar más contexto para este problema? ¿Cuál es la naturaleza de las señales y por qué se requiere una latencia de procesamiento tan baja?

Pensé que podría estar chocando contra una pared; Esperaba que alguien con más experiencia pudiera romper las reglas y guiarme hacia una solución. El problema es inercial, se relaciona con los datos del acelerómetro y trata de obtener una posición en movimiento sinusoidal en tiempo real. Si la posición no es casi en tiempo real, se vuelve inútil. Sé que necesita filtrar el error de baja frecuencia (deriva de CC y polarización) desde el principio, y no he visto nada más que filtros Kalman como solución. El filtro IIR-ish que describo se ocupa de algunas de las frecuencias bajas, pero tiene características de fase horribles, introduciendo una pila de frecuencias bajas. error.
ah En ese caso, está adoptando un enfoque demasiado simplista. Los componentes de CC y de baja frecuencia que desea rechazar tienen una frecuencia mucho más baja que su señal inercial, por lo que utiliza un filtro de frecuencia de corte muy bajo (un par de órdenes de magnitud por debajo de la frecuencia de su señal) para separarlos. Este filtro puede ser un filtro recursivo simple o un filtro Kalman sofisticado y sí, puede llevar mucho tiempo inicializarse. Pero luego, cuando resta su salida de la señal sin procesar, la señal de navegación queda prácticamente sin efecto en sus características de fase/retardo.
Cuando miraba las características de fase de, por ejemplo, los filtros IIR en fdatool de Matlab, tenía características de fase horribles en mis frecuencias de señal, incluso si empujaba la frecuencia de esquina muy por debajo de mi señal. ¿Hay algún tipo específico de IIR u otro filtro recursivo que me falta y que no afectaría tanto la fase de mi señal?