Je suis assez nouveau sur DSP et j'ai fait des recherches sur les filtres possibles pour lisser les données de l'accéléromètre en python. Un exemple du type de données que je vais expérimenter peut être vu dans l'image suivante:
Essentiellement, je cherche des conseils pour lisser ces données pour éventuellement les convertir en vitesse et en déplacement. Je comprends que les accéléromètres des téléphones portables sont extrêmement bruyants.
Je ne pense pas pouvoir utiliser un filtre de Kalman pour le moment car je ne peux pas saisir l'appareil pour référencer le bruit produit par les données (j'ai lu qu'il est essentiel de placer l'appareil à plat et de trouver la quantité de bruit de ces lectures?)
La FFT a produit des résultats intéressants. L'une de mes tentatives a été de FFT le signal d'accélération, puis de rendre les basses fréquences pour avoir une valeur FFT absolue de 0. Ensuite, j'ai utilisé l'arithmétique oméga et la FFT inverse pour obtenir un tracé de la vitesse. Les résultats sont les suivants:
Est-ce une bonne façon de procéder? J'essaie de supprimer la nature bruyante globale du signal, mais des pics évidents, comme à environ 80 secondes, doivent être identifiés.
Je suis également fatigué d'utiliser un filtre passe-bas sur les données de l'accéléromètre d'origine, ce qui a fait un excellent travail de lissage, mais je ne sais pas vraiment où aller à partir d'ici. Tout conseil sur la route à suivre à partir d'ici serait vraiment utile!
EDIT: Un peu de code:
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
Donc, essentiellement, ive a effectué une FFT sur mes données d'accéléromètre, donnant Sz, filtré les hautes fréquences à l'aide d'un simple filtre de mur de briques (je sais que ce n'est pas idéal). Ensuite, j'utilise l'arithmétique oméga sur la FFT des données. Merci également à datageist d'avoir ajouté mes images dans mon message :)
fz
tableau, il semble que vous appliquiez un filtre passe-haut à la place.Réponses:
Comme l'a souligné @JohnRobertson dans Bag of Tricks for Denoising Signals tout en maintenant des transitions nettes, Total Variaton (TV) débruitage est une autre bonne alternative si votre signal est constant par morceaux. Cela peut être le cas pour les données de l'accéléromètre, si votre signal continue de varier entre les différents plateaux.
Vous trouverez ci-dessous un code Matlab qui effectue le débruitage TV dans un tel signal. Le code est basé sur l'article An Augmented Lagrangian Method for Total Variation Video Restoration . Les paramètres et doivent être ajustés en fonction du niveau de bruit et des caractéristiques du signal.μ ρ
Si est le signal bruyant et est le signal à estimer, la fonction à minimiser est , où est l'opérateur des différences finies.y x μ∥x−y∥2+∥Dx∥1 D
Résultats:
la source
Le problème est que votre bruit a un spectre plat. Si vous supposez un bruit blanc gaussien (qui s'avère être une bonne hypothèse), sa densité de spectre de puissance est constante. En gros, cela signifie que votre bruit contient toutes les fréquences. C'est pourquoi toute approche en fréquence, par exemple DFT ou filtres passe-bas, n'est pas bonne. Quelles seraient vos fréquences de coupure puisque votre bruit est sur tout le spectre?
Une réponse à cette question est le filtre de Wiener, qui nécessite la connaissance des statistiques de votre bruit et de votre signal souhaité. Fondamentalement, le signal bruyant (signal + bruit) est atténué sur les fréquences où le bruit devrait être plus important que votre signal, et il est amplifié là où votre signal devrait être plus grand que votre bruit.
Cependant, je suggérerais des approches plus modernes qui utilisent un traitement non linéaire, par exemple le débruitage en ondelettes. Ces méthodes donnent d'excellents résultats. Fondamentalement, le signal bruyant est d'abord décomposé en ondelettes, puis de petits coefficients sont mis à zéro. Cette approche fonctionne (et la DFT ne fonctionne pas) en raison de la nature multi-résolution des ondelettes. C'est-à-dire que le signal est traité séparément dans des bandes de fréquences définies par la transformée en ondelettes.
Dans MATLAB, tapez «menu d'onde» puis «SWT débruitage 1-D». Puis 'Fichier', 'Exemple d'analyse', 'Signaux bruyants', 'avec Haar au niveau 5, Blocs bruyants'. Cet exemple utilise l'ondelette Haar, qui devrait fonctionner correctement pour votre problème.
Je ne suis pas bon en Python, mais je pense que vous pouvez trouver des packages NumPy qui effectuent le débruitage des ondelettes Haar.
la source
Selon la suggestion de Daniel Pipa, j'ai jeté un œil au débruitage en ondelettes et j'ai trouvé cet excellent article de Francisco Blanco-Silva.
Ici, j'ai modifié son code Python pour le traitement d'image pour travailler avec des données 2D (accéléromètre) plutôt que 3D (image).
Notez que le seuil est "compensé" pour le seuillage progressif dans l'exemple de Francisco. Considérez ceci et modifiez pour votre application.
Où:
wavelet
- nom de chaîne de la forme en ondelettes à utiliser (voirpywt.wavelist()
, par exemple'haar'
)noise_sigma
- écart type du bruit par rapport aux donnéesdata
- tableau de valeurs à filtrer (par exemple, les données des axes x, y ou z)la source