Filtr górnoprzepustowy 0,01 Hz dla powolnych dryfów EEG

10

Próbuję stworzyć filtr górnoprzepustowy dla zestawów danych elektroencefalograficznych (EEG), aby pozbyć się bardzo powolnych dryfów. Jednak częstotliwości około 0,3 Hz są bardzo ważne dla badań, którym służą te dane.

Używam Matlaba i próbowałem różnych rzeczy. Wydaje się, że bardzo niskie tłumienie dB, wynoszące 3 dB, jest dobre w przypadku filtrów FIR. Na przykład użyłem tego:

h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut 
d=design(h,'butter');
fvtool(d)

Jednak ten filtr powoduje dryf dc na początku danych i nie chciałbym stracić tych pierwszych punktów danych.

Przeczytałem na twoich stronach, że sprytnym pomysłem jest zaprojektowanie filtra dolnoprzepustowego, który później odejmę od rzeczywistych danych. Zrobiłem to z filtrem equiripple i zadziałało, ale opuściło linię bazową. Nie chcę teraz uruchamiać średniego usuwania, ponieważ jest to kolejny krok w protokole analizy.

Jakieś sugestie?

forsker_for_dsp
źródło
1
Więc problemem jest tylko wstępna odpowiedź filtra? Czy to wstępnie nagrane dane, które możesz po prostu uzupełnić zerami, czy też są to dane w czasie rzeczywistym?
endolith,
Podejście dolnoprzepustowe i odejmowanie będzie również cierpieć z powodu problemu, który widzisz. Problem polega na tym, że każdy filtr ma opóźnienie. Filtry z ostrymi odcięciami, takie jak te, których potrzebujesz, mogą mieć bardzo duże opóźnienia. Nie jestem pewien, dlaczego miałbyś zrobić średnie usuwanie w następnej kolejności; wzmocnienie DC filtru, który pokazałeś, wynosi zero, więc nie będzie żadnej znaczącej średniej do usunięcia (z wyjątkiem okresu przejściowego na początku wyjścia z powodu opóźnienia filtra).
Jason R

Odpowiedzi:

6

Pytasz o wehikuł czasu: aby uniknąć uderzenia prądu stałego przy , musisz znać stan filtra tak, jakby działał przed rozpoczęciem nagrywania. Tak się nie stanie, bez względu na to, jakiego rodzaju filtra używasz.t=0

N.N.N.sol(t)=sol(-t)=fa(t)N. próbki danych wyjściowych, a guz DC powinien mieć nadzieję, że odejdzie.

t=0

rtollert
źródło
6

Spójrz na funkcję filtfilt. Daje odpowiedź zerową i idealną odpowiedź krokową. W szczególności właściwość filtrowania w trybie filtrowania plików krok po kroku może rozwiązać Twój problem.

niaren
źródło
0

Zrobiłem lewę, którą wyjaśnił pan rtollert, i pomyślałem, że to najlepsze, co mogę zrobić.

Jeśli pójdziesz drogą ciągłego próbkowania / kompensacji sprzętowej, wydajność może zainteresować Cię blokerami prądu stałego, jak opisali Randy Yates i Richard Lyons w dsp Tips & Tricks March 2008

Chip Wrangler
źródło
-1

Nie obchodzi Cię absolutna wartość DC, prawda?

Dlaczego po prostu nie dodać statycznego przesunięcia do swoich danych, aby pierwszy punkt danych miał zero?

Jasne, musiałbyś dodać przesunięcie do każdego punktu danych, ale całkowicie uniknęłoby to dużych problemów z reakcją krokową, które występują z filtrem.

Skutecznie filtr zostaje zainicjowany do zera. Dlatego po rozpoczęciu danych filtr widzi duży krok od zera do dowolnego poziomu prądu stałego.

Po prostu dodaj przesunięcie, aby usunąć stopień schodów.

Zmyślone imię
źródło
-1

Dlaczego nie zrobić przeciętnego usunięcia? Późniejszy krok, który robi to „ponownie”, po prostu nie ma efektu (odejmowałby zero).

ladkkasdöla
źródło
To jest raczej zapytanie, a nie odpowiedź na pytanie. W pewnym momencie może to być właściwe jako komentarz, chociaż pytanie jest tak stare, że wydaje się bezcelowe w tym momencie.
Sam Maloney