MATLAB, Comment filtrer un signal discret?

8

J'ai une matrice 1 par 10000 de doubles stockés dans un fichier nommé "fecg.mat". La matrice représente l'amplitude d'un signal FECG enregistré.

Je l'ai tracé en fonction du temps (de 0 à 9999):

entrez la description de l'image ici

Pour supprimer la ligne de base, je me demande si je peux utiliser un filtre passe-haut. Comment concevoir un filtre approprié?

Le traitement du signal PS n'est pas mon domaine d'étude. Je ne sais pas comment filtrer un signal discret dans le domaine temporel.

hoo_man
la source
1
Je noterais que pour certaines formes d'ondes complexes (comme les signaux vidéo), il est plus efficace de "fixer" à certaines caractéristiques de la forme d'onde que d'essayer de "filtrer" le signal pour éliminer le bruit à basse fréquence. Cependant, dans ce cas, il n'y a aucune caractéristique évidente à laquelle se fixer.
Daniel R Hicks
1
Vous voulez donc filtrer un ECG fœtal à partir de l'ECG de la mère et l'ECG fœtal est à une fréquence élevée. Je transfèrerais le signal dans le domaine fréquentiel (FFT) à l'aide d'un filtre de fenêtre pour obtenir la fréquence dans différentes périodes de temps, puis j'examinerais les fréquences résultantes sur les différentes fenêtres de temps pour dire à quelle fréquence filtrer. Si vous voulez connaître les valeurs numériques de l'heure et des fréquences, vous aurez toujours besoin de la fréquence d'échantillonnage. Si vous voulez juste voir qu'elle est constante, vous n'en aurez peut-être pas besoin.
Danny Varod

Réponses:

6

Le moyen le plus simple de supprimer la ligne de base consiste à supprimer la moyenne:

filtered = original - mean(original);

En fait, la moyenne est le premier coefficient de la transformée de Fourier, il s'agit donc en fait d'un filtrage très pointu: vous éliminez le coefficient DC.

Si vous voulez un filtrage plus classique, vérifiez les fonctions comme butteret amis, qui synthétiseront un filtre IIR, puis utilisez filterpour filtrer votre signal.

Matlab comprend également un outil de conception de filtres.

Juancho
la source
3

MATLAB dispose d'un outil de conception de filtres appelé fdatool. Exécutez le fdatool dans MATLAB, il vous donne une interface graphique visuelle, dans laquelle vous pouvez modifier les paramètres du filtre. Choisissez un filtre passe-haut à partir de là et choisissez une fréquence de coupure. lorsque vous êtes satisfait de la forme du filtre, exportez-la vers l'espace de travail MATLAB. Disons que votre nom de filtre est myFilter et que votre nom de signal est mySignal. Puis pour filtrer le signal en type MATLAB: filterSignal = conv (mySignal, myFilter).

TJ1
la source
3

Si vous connaissez le contenu fréquentiel du signal souhaité, vous pouvez passer un peu au-dessus de cette fréquence. Disons que vous ne vous intéressez qu'au signal supérieur à 2 Hz et que votre fréquence d'échantillonnage est de 100 Hz, alors vous pouvez le faire comme suit:

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

Cet exemple spécifique utilise un passe-haut Butterworth de troisième ordre.

Hilmar
la source
Merci, je n'ai pas la fréquence et la fréquence d'échantillonnage, mais je pense que je devrais les estimer, car la fréquence des signaux ECG est généralement comprise entre 0,1 et 250 Hz.
hoo_man
1
@hoo_man Si vous ne connaissez pas la fréquence d'échantillonnage, les informations n'ont aucun sens. Vous devrez demander à celui qui vous a donné la mesure. PS La fréquence d'échantillonnage doit être d'au moins 2 * la fréquence maximale du signal.
Danny Varod
@DannyVarod: Donc, dans ce cas, le seul moyen est de trouver le taux d'échantillonnage par essais et erreurs ... Je commence par 500 Hz
hoo_man
Il n'est pas nécessaire que ce soit un chiffre rond. Que voulez-vous faire avec les données?
Danny Varod
@DannyVarod: Généralement, la fréquence d'échantillonnage pour l'enregistrement de l'ECG est d'environ 400 Hz à 500 Hz. Je veux extraire l'ECG fœtal de l'ECG maternel. Je dois d'abord supprimer l'errance de la ligne de base.
hoo_man
1

Le filtre à utiliser dépend vraiment de l'application spécifique. - Un filtre trop grossier pourrait supprimer les informations que vous recherchez!

L' algorithme Pan-Tompkins largement utilisé (pour la détection QRS) spécifie un filtre pour la suppression de la ligne de base dans les données ECG. Mais il est difficile de déterminer si ce filtre convient à votre application à partir des informations limitées que vous avez fournies. Veuillez élaborer pour une réponse plus précise.

mola
la source
4
Passe-bas pour reconnaître la ligne de base. Pour le supprimer, vous devez soustraire le résultat du passe-bas du signal d'origine, créant ainsi un filtre passe-haut, n'est-ce pas?
Castilho
Vous avez raison - j'ai mis cette partie à l'envers. Merci d'avoir corrigé cela.
mola
J'ai transmis le signal par un CastilhoLPF comme l'a dit. mais la ligne de base que j'ai obtenue a été retardée. Pour faire correspondre la ligne de base et le signal d'origine pour les soustraire, devrais-je déplacer l'un d'eux ou y a-t-il une meilleure façon?
hoo_man
1

Je vous suggère d'utiliser un filtre adaptatif pour supprimer le bruit de base de 50 Hz. un filtre adaptatif lms ferait très bien l'affaire:

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');
Harry
la source