Filtrage à haut passage dans MATLAB

Quelqu'un sait-il comment utiliser les filtres dans MATLAB? Je ne suis pas un aficionado, donc je ne suis pas concerné par les caractéristiques de roulis etc - j'ai un vecteur de signal de 1 Dimension X échantillonné à 100 kHz, et je veux effectuer un filtrage haute passe sur elle (disons, rejeter tout ce qui est en dessous de 10Hz) pour supprimer la dérive de base.

il y a des filtres Butterworth, elliptiques, et Chebychev décrits dans l'aide, mais aucune explication simple quant à la façon de mettre en œuvre.

25
demandé sur user391339 2011-04-08 10:27:09

3 réponses

Il y a plusieurs filtres qui peuvent être utilisés, et le choix du filtre dépend de ce que vous essayez d'atteindre. Puisque vous avez mentionné Butterworth, Chebyschev et filtres elliptiques, je suppose que vous êtes à la recherche de filtres IIR en général.

Wikipedia est un bon endroit pour commencer à lire sur les différents filtres et ce qu'ils font. Par exemple, Butterworth est au maximum à plat dans la bande passante et la réponse s'éteint dans la bande stop. Dans Chebyschev, vous avez une réponse en douceur soit dans la bande passante (type 2) soit dans la bande stop( type 1) et des rides plus grandes et irrégulières dans l'autre et enfin, dans Elliptique filtres, il y a des ondulations dans les deux bandes. L'image suivante est tiré de wikipedia.

enter image description here

donc dans les trois cas, vous devez échanger quelque chose contre autre chose. À Butterworth, il n'y a pas de vagues, mais la fréquence réponse roll off est plus lent. Dans la figure ci-dessus, il prend de 0.4 à propos de 0.55 pour atteindre la moitié de la puissance. Dans Chebyschev, vous obtenez rouleau plus raide, mais vous devez tenir compte des ondulations irrégulières et plus grandes dans l'une des bandes, et en elliptique, vous obtenez presque instantanée coupure, mais vous avez des ondulations dans les deux bandes.

Le choix du filtre dépend entièrement de votre application. Êtes-vous essayer d'obtenir un signal propre, avec peu ou pas de pertes? Alors tu as besoin de quelque chose qui donne vous une réponse en douceur dans le passband (Butterworth / Cheby2). Essayez-vous de tuer les fréquences dans le stop, et une petite perte dans la réponse dans le passband ne vous dérangera pas? Ensuite, vous aurez besoin de quelque chose qui est lisse dans la bande d'arrêt (Cheby1). Avez-vous besoin de coins de coupure extrêmement pointus, c.-à-d., quelque chose un peu au-delà de la bande passante est préjudiciable à votre analyse? Si oui, vous devriez utiliser les filtres Elliptiques.

ce qu'il faut se rappeler à propos des filtres IIR, c'est qu'ils ont des poteaux. Contrairement aux filtres FIR où vous pouvez augmenter l'ordre du filtre avec la seule ramification étant le délai du filtre, l'augmentation de l'ordre des filtres IIR rendra le filtre instable. Par instable, je veux dire que vous aurez des pôles qui se trouvent en dehors du cercle de l'unité. Pour voir pourquoi c'est ainsi, vous pouvez lire les articles wiki sur filtres IIR, surtout la partie sur la stabilité.

pour illustrer davantage mon point de vue, considérez la passe de bande suivante filtrer.

fpass=[0.05 0.2];%# passband
fstop=[0.045 0.205]; %# frequency where it rolls off to half power
Rpass=1;%# max permissible ripples in stopband (dB)
Astop=40;%# min 40dB attenuation
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements

[b,a]=cheby2(n,Astop,fstop);

maintenant, si vous regardez le diagramme à zéro pôle en utilisant zplane(b,a), vous verrez qu'il ya plusieurs pôles (x) se trouvant à l'extérieur du cercle unitaire, ce qui rend cette approche instable.

enter image description here

et cela est évident du fait que la réponse en fréquence est tout détraqué. Utilisez freqz(b,a) pour obtenir le suivant

enter image description here

pour obtenir un filtre plus stable avec votre conception exacte exigences, vous aurez besoin d'utiliser des filtres de second ordre en utilisant le z-p-k méthode au lieu de b-a, dans MATLAB. Voici comment pour le même filtre que ci-dessus:

[z,p,k]=cheby2(n,Astop,fstop);
[s,g]=zp2sos(z,p,k);%# create second order sections
Hd=dfilt.df2sos(s,g);%# create a dfilt object.

Maintenant, si vous regardez les caractéristiques de ce filtre, vous verrez que tous les pôles sont à l'intérieur du cercle unité (donc stable) et répond aux exigences de conception

enter image description here

enter image description here

l'approche est similaire pour butter et ellip, avec équivalent buttord et ellipord. La documentation de MATLAB contient également de bons exemples de conception de filtres. Vous pouvez construire sur ces exemples et le mien pour concevoir un filtre selon ce que vous voulez.

pour utiliser le filtre sur vos données, vous pouvez soit faire filter(b,a,data) ou filter(Hd,data) selon le filtre que vous utilisez éventuellement. Si vous voulez une distorsion de phase zéro, utilisez filtfilt. Cependant, ceci n'accepte pas dfilt objets. Donc à zéro-filtre de phase avec Hd, utilisez la filtfilthd fichier disponible sur le site D'échange de fichiers Mathworks

EDIT

Ceci est en réponse au commentaire de @DarenW. Lissage et filtrage sont deux opérations différentes, et bien qu'ils soient similaires à certains égards (moyenne mobile est un filtre passe-bas), vous ne pouvez pas simplement substituer l'un pour l'autre à moins qu'il vous pouvez être sûr qu'il ne sera pas de préoccupation dans l'application spécifique.

Par exemple, la mise en œuvre de La suggestion de Daren sur un signal chirp linéaire de 0-25kHz, échantillonné à 100kHz, c'est le spectre de fréquence après lissage avec un filtre gaussien

enter image description here

bien Sûr, la dérive près de 10Hz est presque nulle. Toutefois, l'opération a complètement changé la nature des composantes de fréquence du signal original. Cette divergence s'explique par le fait qu'ils ont complètement ignoré le déroulement de l'opération de lissage (voir ligne rouge), et ont supposé qu'il serait être à plat zéro. Si c'était vrai, la soustraction aurait fonctionné. Mais hélas, ce n'est pas le cas, c'est pourquoi tout un champ sur la conception de filtres existe.

48
répondu abcd 2011-04-09 16:04:25

créez votre filtre - par exemple en utilisant [B,A] = butter(N,Wn,'high') où N est l'ordre du filtre - si vous n'êtes pas sûr de ce que c'est, mettez-le à 10. Wn est la fréquence de coupure normalisée entre 0 et 1, avec 1 correspondant à la moitié de la fréquence d'échantillonnage du signal. Si votre taux d'échantillonnage fs, et que vous voulez une fréquence de coupure de 10 Hz, vous devez définir Wn = (10/(fs/2)).

vous pouvez alors appliquer le filtre en utilisant Y = filter(B,A,X) où X est votre signal. Vous pouvez également regarder dans le filtfilt fonction.

7
répondu Andreass 2011-04-08 14:00:26

une façon économique de faire ce genre de filtrage qui n'implique pas de forcer les cellules cérébrales sur la conception, les zéros et les pôles et l'ondulation et tout ça, est:

* Make a copy of the signal
* Smooth it.   For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points.   Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy.  (A simple box smoother of total width 10,000 used once may produce unwanted edge effects)
* Subtract the smoothed version from the original.  Baseline drift will be gone.

si le signal original est spikey, vous pouvez utiliser un court filtre médian avant le gros smoother.

cela généralise facilement aux images 2D, données de volume 3D, peu importe.

0
répondu DarenW 2011-04-08 16:10:48