Soy bastante nuevo en DSP y he realizado algunas investigaciones sobre posibles filtros para suavizar los datos del acelerómetro en Python. Un ejemplo del tipo de datos que estaré experimentando se puede ver en la siguiente imagen:
Esencialmente, estoy buscando consejos para suavizar estos datos para eventualmente convertirlos en velocidad y desplazamiento. Entiendo que los acelerómetros de los teléfonos móviles son extremadamente ruidosos.
No creo que pueda usar un filtro de Kalman en este momento porque no puedo controlar el dispositivo para hacer referencia al ruido producido por los datos (¿leí que es esencial colocar el dispositivo plano y encontrar la cantidad de ruido de esas lecturas?)
FFT ha producido algunos resultados interesantes. Uno de mis intentos fue FFT la señal de aceleración, luego renderizar las frecuencias bajas para tener un valor FFT absoluto de 0. Luego utilicé la aritmética omega y la FFT inversa para obtener un gráfico de velocidad. Los resultados fueron los siguientes:
¿Es esta una buena manera de hacer las cosas? Estoy tratando de eliminar la naturaleza ruidosa general de la señal, pero es necesario identificar picos obvios, como alrededor de 80 segundos.
También me he cansado de usar un filtro de paso bajo en los datos del acelerómetro original, lo que ha hecho un gran trabajo alisándolo, pero no estoy realmente seguro de a dónde ir desde aquí. ¡Cualquier guía sobre dónde ir desde aquí sería realmente útil!
EDITAR: Un poco de código:
for i in range(len(fz)):
testing = (abs(Sz[i]))/Nz
if fz[i] < 0.05:
Sz[i]=0
Velfreq = []
Velfreqa = array(Velfreq)
Velfreqa = Sz/(2*pi*fz*1j)
Veltimed = ifft(Velfreqa)
real = Veltimed.real
Así que, esencialmente, he realizado una FFT en mis datos de acelerómetro, dando a Sz, filtrando altas frecuencias usando un simple filtro de pared de ladrillos (sé que no es lo ideal). Luego uso aritmética omega en la FFT de los datos. También muchas gracias a datageist por agregar mis imágenes a mi publicación :)
fz
matriz, parece que está aplicando un filtro de paso alto en su lugar.Respuestas:
Como lo señaló @JohnRobertson en Bag of Tricks for Denoising Signals Mientras mantiene las transiciones nítidas, la eliminación de ruido de Variaton total (TV) es otra buena alternativa si su señal es constante por partes. Este puede ser el caso de los datos del acelerómetro, si su señal sigue variando entre diferentes mesetas.
Resultados:
fuente
El problema es que su ruido tiene un espectro plano. Si supone un ruido gaussiano blanco (que resulta ser una buena suposición), la densidad del espectro de potencia es constante. En términos generales, significa que su ruido contiene todas las frecuencias. Es por eso que cualquier enfoque de frecuencia, por ejemplo, DFT o filtros de paso bajo, no es bueno. ¿Cuáles serían sus frecuencias de corte ya que su ruido está en todo el espectro?
Una respuesta a esta pregunta es el filtro Wiener, que requiere el conocimiento de las estadísticas de su ruido y su señal deseada. Básicamente, la señal ruidosa (señal + ruido) se atenúa en las frecuencias en las que se espera que el ruido sea mayor que su señal, y se amplifica donde su señal se espera que sea mayor que su ruido.
Sin embargo, sugeriría enfoques más modernos que usan procesamiento no lineal, por ejemplo, eliminación de ondas. Estos métodos proporcionan excelentes resultados. Básicamente, la señal ruidosa se descompone primero en wavelets y luego se ponen a cero los coeficientes pequeños. Este enfoque funciona (y DFT no) debido a la naturaleza de múltiples resoluciones de las wavelets. Es decir, la señal se procesa por separado en las bandas de frecuencia definidas por la transformada wavelet.
En MATLAB, escriba 'wavemenu' y luego 'SWT denoising 1-D'. Luego 'Archivo', 'Análisis de ejemplo', 'Señales ruidosas', 'con Haar en el nivel 5, Bloques ruidosos'. Este ejemplo usa wavelet de Haar, que debería funcionar bien para su problema.
No soy bueno en Python, pero creo que puedes encontrar algunos paquetes de NumPy que realizan la eliminación de ruido de ondas Haar.
fuente
Según la sugerencia de Daniel Pipa, eché un vistazo a la eliminación de ondas y encontré este excelente artículo de Francisco Blanco-Silva.
Aquí he modificado su código Python para que el procesamiento de imágenes funcione con datos 2D (acelerómetro) en lugar de datos 3D (imagen).
Tenga en cuenta que el umbral está "compuesto" para el umbral suave en el ejemplo de Francisco. Considere esto y modifique para su aplicación.
Dónde:
wavelet
- nombre de cadena de la forma wavelet que se utilizará (verpywt.wavelist()
, por ejemplo'haar'
)noise_sigma
- desviación estándar del ruido de los datosdata
- matriz de valores para filtrar (por ejemplo, datos de eje x, y o z)fuente