ELAI S.r.l.

Cuando el sensor engaña a la IA: por qué una vibración rápida parece lenta

Un ejemplo reproducible explica por qué 700 Hz pueden parecer 300 Hz: muestreo, pérdida de información y filtrado antes de diezmar en sistemas embebidos.

Cuando el sensor engaña a la IA: por qué una vibración rápida parece lenta

El problema aparece antes del modelo

Un motor vibra y un dispositivo pequeño intenta detectar una anomalía. El sistema registra un pico a 300 hercios, trescientas oscilaciones por segundo. ¿Podemos concluir que el motor contiene realmente esa vibración? No necesariamente: con un muestreo inadecuado, una componente de 700 hercios puede dejar exactamente la misma huella digital. Un modelo de IA muy preciso no distingue dos causas presentadas con los mismos números si no dispone de información adicional.

La pregunta es cómo conservar la información útil al introducir una señal física en un sistema embebido, un ordenador integrado en un dispositivo. Partimos de dos ondas simples, demostramos por qué se vuelven indistinguibles y construimos un filtro antes de reducir las muestras. También examinamos el precio: retardo, memoria y operaciones. Todas las señales y cifras son sintéticas y reproducibles; no hemos medido un motor, una placa ni un producto de EL-AI.

Muestrear significa observar a intervalos

Un acelerómetro puede producir una señal variable en el tiempo. El convertidor analógico-digital, ADC, la representa mediante números adquiridos en instantes discretos. Con frecuencia de muestreo f_s de 1.000 muestras por segundo, observamos cada milisegundo. No conservamos directamente lo que ocurre entre observaciones. No se trata solo de bits por número: incluso números infinitamente precisos pueden describir ambiguamente una dinámica observada con poca frecuencia.

Para aislar el fenómeno usamos un coseno: una oscilación regular de amplitud unitaria y fase inicial cero. f cuenta ciclos por segundo, t es el tiempo en segundos y n el índice entero de la muestra. Sustituir t = n/f_s evalúa la onda solo en los instantes disponibles. Aquí los paréntesis indican tiempo continuo y los corchetes la secuencia digital: no cambian la física del sensor, aclaran qué observamos.

x(t) = cos(2π f t) x[n] = cos(2π f n / f_s)

Dos frecuencias, una misma secuencia

Tomemos f_s = 1.000 Hz y comparemos f = 700 Hz con f = 300 Hz. En un milisegundo, la primera onda recorre 0,7 vueltas y la segunda 0,3. El coseno vale lo mismo para ángulos opuestos y añadir vueltas completas no cambia el resultado. Son esas propiedades, no un fallo de software, las que igualan las muestras. La demostración vale para cualquier entero n, no solo para puntos dibujados.

cos(2π · 700 n / 1000) = cos(2π n − 2π · 300 n / 1000) = cos(2π · 300 n / 1000)

Esto es aliasing: frecuencias físicas distintas adquieren la misma identidad en la secuencia muestreada. En 1.000 muestras, la diferencia máxima numérica es de unos 1,27 × 10⁻¹² por la aritmética finita; matemáticamente es cero. Cambiar la fase puede modificar el signo o la fase del alias, pero no elimina la ambigüedad general. Una hipótesis externa, como saber que no hay frecuencias superiores a 400 Hz, permite excluir explicaciones. Es información adicional, no recuperada de las muestras.

f_s/2 se denomina frecuencia de Nyquist. Para representar sin aliasing una señal arbitraria limitada en banda, su frecuencia máxima debe quedar por debajo; justo en el límite algunas fases son problemáticas. Pero «la señal útil está a 300 Hz» no equivale a «toda la señal está por debajo de 500 Hz». Interferencias y armónicos superiores siguen entrando al convertidor. Un sistema real debe conocer y limitar también lo que no desea medir.

Por qué filtrar después puede ser demasiado tarde

Supongamos que ya adquirimos a 1 kHz y aplicamos un filtro digital que conserva 300 Hz. También conservará la contribución de 700 Hz, superpuesta en las mismas muestras. Si elimina 300 Hz, elimina ambas explicaciones. El filtro no decide cuál era verdadera cuando la distinción se ha perdido. La protección debe actuar antes de la operación que vuelve indistinguibles las frecuencias: delante del ADC en el primer muestreo y antes de cada reducción posterior de frecuencia digital.

En el experimento empezamos a 4.000 muestras por segundo: 300 y 700 Hz están por debajo de 2.000 Hz y siguen siendo distinguibles. Después queremos entregar solo 1.000 muestras por segundo al modelo. Conservar una de cada cuatro es diezmar por M = 4. Hacerlo sin filtrar reproduce el problema. El filtro intermedio debe atenuar componentes que serían ambiguas a la nueva frecuencia y conservar la banda de interés.

Un filtro construido y verificable

Usamos un filtro FIR, de respuesta finita al impulso: cada salida es una suma ponderada de un número finito de muestras recientes. Los pesos h[k] indican cuánto aporta cada muestra. No es una red neuronal entrenada: elegimos una respuesta paso bajo que conserva oscilaciones lentas y atenúa las rápidas. La suma muestra el cálculo y su coste. Con L = 129 coeficientes, la evaluación directa necesita 129 productos y su suma.

y[n] = Σ(k=0…128) h[k] x[n−k] z[m] = y[4m]

La primera línea filtra; la segunda toma una salida de cada cuatro. m enumera la nueva secuencia. Para definir coeficientes partimos de una sinc, forma del paso bajo ideal, la limitamos a 129 valores y suavizamos sus bordes con una ventana de Hann. Esto reduce algunas ondulaciones a cambio de una transición no instantánea. Finalmente dividimos los pesos por su suma, para conservar el nivel de una entrada constante tras el transitorio inicial.

sinc(u) = sin(πu)/(πu), sinc(0) = 1 w[k] = 0.5 − 0.5 cos(2πk/128) g[k] = (2f_c/f_s) sinc((2f_c/f_s)(k−64)) w[k] h[k] = g[k] / Σ(j=0…128) g[j] f_c = 400 Hz, f_s = 4000 Hz

64 centra la respuesta: es la mitad de los 128 intervalos entre el primer y último coeficiente. f_c es el parámetro de corte, no una garantía de paso intacto hasta 400 Hz y desaparición inmediata después. Un filtro finito tiene una región de transición. Por eso inspeccionamos su respuesta en las frecuencias del ejemplo y en toda la gráfica. El código usa la sinc normalizada de NumPy; cambiar la convención sin ajustar la fórmula produciría otro filtro.

El resultado: un pico falso deja de dominar

Construimos la entrada sumando una componente útil de 300 Hz y amplitud 0,2 con otra no deseada de 700 Hz y amplitud 1. Las amplitudes están normalizadas, sin atribuir unidades físicas de aceleración. Sin filtro, la decimación las superpone: el pico de 300 Hz tiene amplitud 1,2. El programa podría interpretarlo como una vibración útil seis veces mayor. Depende de las fases elegidas; con otras fases podrían cancelarse parcialmente.

x[n] = 0.2 cos(2π · 300 n / 4000) + 1.0 cos(2π · 700 n / 4000)

Con el filtro, la ganancia a 300 Hz es 0,998531: pasa casi toda la componente útil. A 700 Hz vale aproximadamente 0,0000131684. En decibelios, la respuesta en esa frecuencia concreta es −97,61 dB; aquí usamos 20 log₁₀ de la relación de amplitudes. No significa que toda la banda rechazada tenga esa atenuación: la gráfica muestra mínimos y máximos distintos. Tras filtrar y diezmar, la amplitud sintética medida a 300 Hz es aproximadamente 0,199693, cerca del 0,2 original.

MagnitudValor calculado
f_s → f_out4000 → 1000 Hz
|H(300 Hz)|0.998531446
|H(700 Hz)|0.0000131684
A300: x[4m]1.200000000
A300: y[4m]0.199693121
(L−1)/(2f_s)16 ms
Respuesta calculada del FIR: casi 0 dB a 300 Hz y fuerte atenuación a 700 Hz. La línea de 500 Hz es la nueva frecuencia de Nyquist. Las ondulaciones muestran que −97,6 dB vale a 700 Hz, no en toda la banda.
Respuesta calculada del FIR: casi 0 dB a 300 Hz y fuerte atenuación a 700 Hz. La línea de 500 Hz es la nueva frecuencia de Nyquist. Las ondulaciones muestran que −97,6 dB vale a 700 Hz, no en toda la banda.

Para verificar la comparación generamos 5.000 muestras a 4 kHz, aplicamos convolución causal y seleccionamos índices de 256 a 4252 cada cuatro: exactamente 1.000 salidas. Empezar en 256 evita el transitorio inicial, de hasta 128 muestras de entrada para esta secuencia. En ese segundo estimamos amplitud mediante proyección sinusoidal a 300 Hz, equivalente al coeficiente correspondiente de la transformada discreta de Fourier. La ventana contiene ciclos enteros; no estudiamos fuga espectral por frecuencias desalineadas.

El coste oculto: esperar y guardar muestras

Los coeficientes son simétricos: el filtro tiene fase lineal e introduce un retardo de grupo de (L−1)/2 muestras en la banda útil. Con L = 129 y f_s = 4 kHz son 64 muestras, 16 ms. Un reconocedor que deba reaccionar rápido debe incluirlo en el presupuesto total. No significa 16 ms de CPU: el retraso de la señal es distinto del tiempo de procesador para calcular las sumas.

Procesar bloques de 128 entradas exige 32 ms para reunir un bloque completo. Una muestra del principio espera más que una del final; no debemos confundir esa espera con el retardo de grupo. Se añaden transferencias, cálculo del modelo y posibles colas. No medimos latencia media ni percentiles en un dispositivo: identificamos dos contribuciones deterministas de diseño. Bloques menores reducen la espera de recogida, pero pueden aumentar la sobrecarga de llamadas y transferencias.

La documentación del diezmador FIR CMSIS-DSP especifica L + B − 1 valores de estado para bloques de B entradas. Con float32 de cuatro bytes, el estado ocuparía 1.024 bytes, los coeficientes 516, la entrada 512 y la salida de 32 muestras 128. Totalizan 2.180 bytes si los cuatro arrays están en RAM; con coeficientes en memoria de solo lectura, los tres búferes explícitos requieren 1.664 bytes. Excluimos pila, estructuras, alineación, DMA y modelo de IA: no es una medición del pico RAM de la aplicación.

Calcular solo las salidas conservadas mediante suma directa exige unas 129.000 operaciones multiplicar-acumular por segundo y canal: 129 coeficientes por 1.000 salidas. Calcular las 4.000 salidas y descartar tres de cada cuatro exigiría cuatro veces más. La aritmética describe trabajo, no duración: instrucciones vectoriales, simetría, caché e implementación afectan al coste real. NumPy calcula aquí la convolución completa por claridad; no ejecutamos el núcleo CMSIS en Cortex-M.

Qué cambiaría en una placa real

La primera comprobación sería el recorrido analógico. Muestrear a 4 kHz no protege frente a cualquier frecuencia: componentes superiores a 2 kHz pueden plegarse ya en la entrada digital. Hay que considerar juntos sensor, filtro interno y filtro externo. No suponemos que un acelerómetro incorpore automáticamente el filtro adecuado. Saturación del ADC y montaje mecánico deficiente generan problemas distintos del aliasing que este filtro digital no resuelve.

Después habría que verificar la precisión numérica real. Los resultados usan float64; no se garantiza −97,61 dB a 700 Hz al convertir coeficientes a float32 o enteros de punto fijo. Deben recalcularse respuesta, desbordamiento y saturación, y comprobarse los límites entre bloques manteniendo el estado. Reiniciarlo en cada bloque introduciría transitorios repetidos y alteraría la señal justo cuando queremos hacerla más fiable.

Por último hay que evaluar las decisiones del modelo con la misma cadena de adquisición en entrenamiento y producción. Cambiar el filtro modifica amplitudes, fase y retardo; el modelo puede haber aprendido accidentalmente un artefacto. Las pruebas deberían registrar frecuencias de entrada conocidas, configuración del sensor, reloj, versiones y código, y medir latencia y potencia en la plataforma. Es un protocolo propuesto: no publicamos potencia, energía por inferencia ni exactitud diagnóstica no medidas.

Conclusión: proteger la información antes de interpretarla

El pico inicial de 300 Hz no bastaba para identificar la vibración real. Ya sabemos por qué: elegir los instantes de observación puede borrar una distinción física que la IA posterior no recrea sin otras hipótesis. En nuestro caso, filtrar a 4 kHz antes de bajar a 1 kHz conserva la componente útil y reduce su contaminante. El coste se cuantifica en retardo, búferes y cálculo; el rendimiento físico queda por verificar. Diseñar IA embebida incluye diseñar cómo el mundo se convierte en datos.

Fuentes, código y condiciones de reproducción

MIT 6.300 — Sampling and Aliasing, Spring 2026.

Arm CMSIS-DSP — Finite Impulse Response Decimator, main documentation.

Analog Devices — Filter Basics: Anti-Aliasing.

Las fuentes documentan muestreo, protección antialiasing e interfaz del diezmador. CMSIS main es documentación mutable consultada el 25 de septiembre de 2026, no una versión del núcleo que hayamos medido. Filtro, señales y comparación se construyen en el experimento adjunto. El fragmento calcula ganancia y retardo; el archivo añade convolución, estimación de amplitudes y figura. Usamos Python 3.14.0, NumPy 2.5.3 y Matplotlib 3.11.2, sin números aleatorios. Este análisis editorial no implica que EL-AI disponga ya de productos o instalaciones embebidos.

import numpy as np
fs, fc, taps = 4000, 400, 129
k = np.arange(taps)
h = (2*fc/fs) * np.sinc((2*fc/fs)*(k-64)) * np.hanning(taps)
h /= h.sum()
for f in (300, 700):
    gain = abs(np.sum(h*np.exp(-2j*np.pi*f*k/fs)))
    print(f, round(float(gain), 9))
print("delay_ms", 1000*64/fs)

Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 25 de septiembre de 2026.