Filtre passe-haut de 0,01 Hz pour dérives lentes EEG

10

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?

forsker_for_dsp
la source
1
Le problème n'est donc que la réponse initiale du filtre? S'agit-il de données préenregistrées que vous pouvez simplement ajouter des zéros ou est-ce en temps réel?
endolith
L'approche passe-bas et soustraire souffrira également du problème que vous voyez. Le problème est que chaque filtre a un retard. Les filtres avec des coupures nettes comme celui que vous voulez peuvent avoir de très longs délais. Je ne sais pas pourquoi vous feriez la suppression moyenne ensuite; le gain DC du filtre que vous avez montré est nul, il n'y aura donc pas de moyenne appréciable à supprimer (à l'exception de la période transitoire au début de la sortie due au retard du filtre).
Jason R

Réponses:

6

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 NNNNg(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

rtollert
la source
6

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.

niaren
la source
0

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

Chip Wrangler
la source
-1

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.

Faux nom
la source
-1

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).

ladkkasdöla
la source
Il s'agit plus d'une requête, et pas vraiment d'une réponse à la question. Cela aurait peut-être été approprié comme commentaire à un moment donné, bien que la question soit si ancienne qu'elle semble tout simplement inutile à ce stade.
Sam Maloney