J'essaie de créer un filtre passe-haut pour les jeux de données électroencéphalographiques (EEG), afin de se débarrasser des dérives très lentes. Cependant, les fréquences autour de 0,3 Hz sont très importantes pour la recherche que ces données servent.
J'utilise Matlab et j'ai essayé différentes choses. Il semble qu'une très faible atténuation dB, de 3 dB, soit très bien avec des filtres FIR. Par exemple, j'ai utilisé cela:
h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut
d=design(h,'butter');
fvtool(d)
Cependant ce filtre fait une dérive cc au début des données et je ne voudrais pas perdre ces premiers points de données.
J'ai lu à travers vos pages qu'une idée intelligente est de concevoir un filtre passe-bas que je retrancherais plus tard des données réelles. Je l'ai fait avec un filtre équiripple et cela a fonctionné, mais j'ai laissé un ascenseur de base. Je ne veux pas exécuter maintenant la suppression moyenne car c'est dans une prochaine étape du protocole d'analyse.
Aucune suggestion?
Réponses:
Vous demandez une machine à remonter le temps: pour éviter le bump DC à , vous devez connaître l'état du filtre comme s'il fonctionnait avant le début de l'enregistrement. Cela ne se produira pas, quel que soit le type de filtre que vous utilisez.t = 0
Voici une astuce qui peut vous être utile. Disons que vous avez un filtre FIR à tap (ou un filtre IIR dont la réponse impulsionnelle décroît correctement à 0 après N échantillons). Prenez les N premiers échantillons de votre signal, inversez-les et ajoutez-les au début de votre signal. En effet, nous définissons un nouveau signal g ( t ) = g ( - t ) = f ( t ) à des fins de filtrage. Lorsque vous filtrez cela, l'état du filtre aura déjà été "amorcé" avec le signal initial: supprimez le premier NN N N g( t ) = g( - t ) = f( t ) N des échantillons de la sortie, et la bosse DC aurait dû, espérons-le, disparu.
Inutile de dire qu'il existe de nombreux pièges avec ce schéma - pour les débutants, il est plus difficile à faire pour le traitement en temps réel, et si la dérivée du signal est élevée à , vous aurez toujours des problèmes de confiance avec les premiers échantillons. Mais il devrait se débarrasser de la bosse.t = 0
la source
Jetez un œil à la fonction filtfilt. Il donne une réponse en phase zéro et une réponse échelonnée parfaite. En particulier, la propriété de réponse par étapes du filtrage filtfilt peut résoudre votre problème.
la source
J'ai fait le tour que M. rtollert a expliqué et j'ai pensé que c'était le mieux que je pouvais faire.
Si vous suivez la voie de l'échantillonnage continu / de la compensation matérielle, alors l'efficacité pourrait vous intéresser aux bloqueurs de courant continu comme décrit par Randy Yates et Richard Lyons dans dsp Tips & Tricks mars 2008
la source
J'ai essayé quelque chose qui fonctionnait bien - pour l'amplificateur spécifié. le code matlab est ici: https://sites.google.com/site/marialstavrinou/home/dc-offset-removal-filter-in-matlab .
la source
Vous ne vous souciez pas de la valeur DC absolue, n'est-ce pas?
Pourquoi ne pas simplement ajouter un décalage statique à vos données afin que le premier point de données soit à zéro?
Bien sûr, vous devriez ajouter le décalage à chaque point de données, mais cela éviterait complètement les gros problèmes de réponse par étapes que vous rencontrez avec le filtre.
En effet, le filtre démarre initialisé à zéro. Par conséquent, lorsque vos données commencent, le filtre voit un grand escalier allant de zéro au niveau DC que vous avez.
Ajoutez simplement un décalage pour supprimer la marche d'escalier.
la source
Pourquoi ne pas faire un retrait moyen? La dernière étape qui le fait "encore" n'a tout simplement pas d'effet (ce serait soustraire zéro).
la source