MATLAB, Como filtrar um sinal discreto?

8

Eu tenho uma matriz de 1 por 10000 de double`s armazenada em um arquivo chamado "fecg.mat". A matriz representa a magnitude de um sinal FECG gravado.

Eu plotei contra o tempo (de 0 a 9999):

insira a descrição da imagem aqui

Para remover a linha de base, pergunto-me se posso usar um filtro passa-alto. Como faço para criar um filtro adequado?

O processamento de sinais PS não é o meu campo de estudo. Não faço ideia de como filtrar um sinal discreto no domínio do tempo.

hoo_man
fonte
11
Eu observaria que, para algumas formas de onda complexas (como sinais de vídeo), é mais eficaz "prender" a algum recurso da forma de onda do que tentar "filtrar" o sinal para remover ruídos de baixa frequência. No entanto, neste caso, não há recurso óbvio para fixar.
Daniel R Hicks
11
Então, você deseja filtrar um ECG fetal do ECG da mãe e o ECG fetal está em alta frequência. Transferiria o sinal para o domínio da frequência (FFT) usando um filtro de janela para obter a frequência em diferentes períodos de tempo, depois observaria as frequências resultantes nas diferentes janelas de tempo para saber em que frequência filtrar. Se você deseja conhecer os valores numéricos da hora e das frequências, ainda precisará da taxa de amostragem. Se você quer apenas ver que é constante, pode não precisar.
Danny Varod

Respostas:

6

A maneira mais fácil de remover a linha de base é remover a média:

filtered = original - mean(original);

Na verdade, a média é o primeiro coeficiente da transformada de Fourier, portanto, é realmente uma filtragem muito nítida: você está eliminando o coeficiente de CC.

Se você quiser uma filtragem mais clássica, verifique as funções como buttere amigos, que sintetizarão um filtro IIR e, em seguida, use filterpara filtrar seu sinal.

O Matlab também inclui uma ferramenta de design de filtro.

Juancho
fonte
3

O MATLAB possui uma ferramenta de design de filtro chamada fdatool. Execute o fdatool no MATLAB, ele fornece uma GUI visual, na qual você pode alterar os parâmetros do filtro. Escolha um filtro passa-alto a partir daí e escolha uma frequência de corte0ff. Quando estiver satisfeito com a forma do filtro, exporte-o para a área de trabalho do MATLAB. Digamos que seu nome de filtro seja myFilter e seu nome de sinal seja mySignal. Em seguida, para filtrar o sinal no tipo MATLAB: filterSignal = conv (mySignal, myFilter).

TJ1
fonte
3

Se você conhece o conteúdo da frequência do sinal desejado, pode passar alto um pouco abaixo dessa frequência. Digamos que você tenha interesse apenas no sinal acima de 2 Hz e a taxa de amostragem seja de 100 Hz, então você pode fazer o seguinte:

[b,a] = butter(3,2/(100/2),'high');
outputData = filter(b,a,inputData);

Este é um exemplo específico que usa um highpass de manteiga de 3ª ordem.

Hilmar
fonte
Obrigado. Eu não tenho a frequência e a taxa de amostragem, mas acho que devo calculá-las, porque a frequência dos sinais de ECG está principalmente na faixa de 0,1 a 250 Hz.
hoo_man
11
@hoo_man Se você não conhece a taxa de amostragem, as informações não fazem sentido. Você terá que perguntar quem lhe deu a medida. PS A taxa de amostragem deve ser pelo menos 2 * a frequência máxima do sinal.
Danny Varod
@DannyVarod: Então, sob esta circunstância a única maneira é encontrar a taxa de amostragem através de tentativa e erro ... Eu começo com 500Hz
hoo_man
Não precisa ser o número redondo. O que você quer fazer com os dados?
Danny Varod
@ DannyVarod: Principalmente a taxa de amostragem para gravação de ECG é de cerca de 400Hz a 500Hz. Eu quero extrair o ECG fetal do ECG materno. Primeiro eu tenho que remover o desvio da linha de base.
22412 hh_man
1

Qual filtro usar depende realmente do aplicativo específico. - Um filtro muito áspero pode remover as informações que você está procurando!

O algoritmo Pan-Tompkins amplamente utilizado (para detecção de QRS) especifica um filtro para a remoção da linha de base nos dados do ECG. Mas é difícil determinar se esse filtro é adequado para o seu aplicativo a partir das informações limitadas que você forneceu. Por favor, elabore uma resposta mais precisa.

mola
fonte
4
Passagem baixa para reconhecer a linha de base. Para removê-lo, você deve subtrair o resultado da passagem baixa do sinal original, criando efetivamente um filtro de passagem alta, não é?
Castilho
Você está certo - eu peguei essa parte de cabeça para baixo. Obrigado por corrigir isso.
Mola
Passei o sinal através de um LPFcomo disse Castilho . mas a linha de base que obtive foi atrasada. Para corresponder a linha de base e o sinal original para subtraí-los, devo mudar um deles ou existe uma maneira melhor?
22412 hh_man
1

Eu sugiro que você use um filtro adaptável para remover o ruído da linha de base de 50Hz. um filtro adaptativo lms funcionaria perfeitamente:

xk = sin(2*pi*50*t1);
dk = ecg1; 
bk = [0 0 0];                       %Gewichteter Vektor (FIR Koefizienten mit Anfangswert 0)
                                    %Die Werte ändern sich ständig bis sich
                                    %das System adaptiert hat

mu = .1;                            %Konvergenzgeschwindigkeit des Algorithmes.
                                    %( 0 < mu < 1/(20*(L+1)*Potenz_xk); L Filterorder)                                
Pot_x=mean(xk.*xk);
%mu=1/(100*(L+1)*Pot_x);            % Konvergenzgeschwindigkeit des Algorithmus.
                                    % Bei den Prädiktiven Adaptiven filter
                                    % gilt die Potenz nicht




yk=zeros(size(xk));                 % Ausgangssignal zum Zeitpunkt t=0 von der FIR.
ek=zeros(size(xk));                 % Fehlersignal zum ZEitpunkt t=0.

%Algorithmus für FIR Adaptiven Filter:
for n = 3:(punkte - 1)                          %Arranca en 3 porque tiene que almacenar las dos muestras anteriores y la actual (FIR de 2 coeficientes)
    xkn = [xk( n ) xk( n - 1 ) xk( n - 2 )];    %Vector niésimo (2 posiciones porque son dos coeficientes).
    yk(n) = xkn * bk';                          %Resultado parcial de la salida por el vector bk traspuesto.
    ek(n) = dk(n) - yk(n);                      %Señal de error parcial.
    bk = bk + 2*mu*ek(n)*xkn;                   %Actualización instante a instante del vector de pesos.  
end                                             %Ende des adaptiven Algorithmes.

Eje1 = figure(1);
set(Eje1,'name','Übung 1: FIR Adaptive Filter','position',[10 10 900 650]);
subplot( 2, 1, 1 );
plot( t1, xk, 'r');
xlabel('n');
ylabel('EKG mit Rauschen');
title('Eingangssignal: Bewegungsartifakt zu filtern');
subplot( 2, 1, 2 );
plot( t1, ek, '-k');
xlabel('n');
ylabel('d[k] - y[k]');
title('Ausgangssignal: EKG ohne Rauschen');
atormentar
fonte