Estou tentando fazer um filtro passa-alto para conjuntos de dados eletroencefalográficos (EEG), para me livrar de desvios muito lentos. No entanto, frequências em torno de 0,3 Hz são muito importantes para a pesquisa que esses dados servem.
Eu uso o Matlab e tentei várias coisas. Parece que uma atenuação de dB muito baixa, de 3 dB, é boa com filtros FIR. Por exemplo, eu usei isso:
h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut
d=design(h,'butter');
fvtool(d)
No entanto, este filtro faz uma variação de CC no início dos dados e eu não gostaria de perder esses primeiros pontos de dados.
Li nas suas páginas que uma idéia inteligente é projetar um filtro passa-baixo que posteriormente subtrairia dos dados reais. Fiz isso com um filtro de duas vias e funcionou, mas deixou um aumento na linha de base. Não quero executar agora a remoção média, pois esta é uma próxima etapa do protocolo de análise.
Alguma sugestão?
Respostas:
Você está pedindo uma máquina do tempo: para evitar o colapso DC em , você precisa conhecer o estado do filtro como se estivesse em funcionamento antes do início da gravação. Isso não vai acontecer, não importa que tipo de filtro você use.t=0
Aqui está um truque que pode ser útil para você. Digamos que você tenha um filtro -tap FIR (ou um filtro IIR cuja resposta ao impulso decaia adequadamente para 0 após amostras). Pegue as primeiras amostras do seu sinal, inverta-as e coloque-as no início do seu sinal. Com efeito, estamos definindo um novo sinal para fins de filtragem. Quando você filtrar isso, o estado do filtro já terá sido "preparado" com o sinal inicial: exclua as primeiras amostras da saída e esperamos que o dump CC tenha desaparecido.N N g ( t ) = g ( - t ) = f ( t ) NN N N g(t)=g(−t)=f(t) N
Escusado será dizer que existem inúmeras dicas com esse esquema - para iniciantes, é mais difícil fazer o processamento em tempo real, e se o derivado do sinal for alto em , você ainda terá problemas de confiança com as primeiras amostras. Mas deve se livrar do solavanco.t=0
fonte
Dê uma olhada na função filtfilt. Ele fornece resposta de fase zero e uma resposta de etapa perfeita. Especialmente, a propriedade de resposta a etapas da filtragem de filtfilt pode resolver seu problema.
fonte
Fiz o truque que o Sr. rtollert explicou e pensei que era o melhor que eu podia fazer.
Se você seguir o caminho da amostragem contínua / compensação de hardware, a eficiência poderá interessá-lo pelos bloqueadores de corrente contínua, conforme descrito por Randy Yates e Richard Lyons no dsp Tips & Tricks March 2008
fonte
Eu tentei algo que funcionou bem- para o amplificador especificado. o código do matlab está aqui: https://sites.google.com/site/marialstavrinou/home/dc-offset-removal-filter-in-matlab .
fonte
Você não se importa com o valor absoluto de CD, correto?
Por que não adicionar apenas um deslocamento estático aos seus dados para que o primeiro ponto de dados seja zero?
Claro, você teria que adicionar o deslocamento a todos os pontos de dados, mas evitaria completamente os grandes problemas de resposta a etapas que você está tendo com o filtro.
Efetivamente, o filtro inicia inicializado em zero. Portanto, quando seus dados começam, o filtro vê uma grande escada de zero a qualquer nível de CC que você tiver.
Basta adicionar deslocamento para remover a escada.
fonte
Por que não fazer a remoção média? A etapa posterior, que faz "de novo", simplesmente não tem efeito (seria subtrair zero).
fonte