Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

High-pass filtering in MATLAB

Tags:

Does anyone know how to use filters in MATLAB? I am not an aficionado, so I'm not concerned with roll-off characteristics etc — I have a 1 dimensional signal vector x sampled at 100 kHz, and I want to perform a high pass filtering on it (say, rejecting anything below 10Hz) to remove the baseline drift.

There are Butterworth, Elliptical, and Chebychev filters described in the help, but no simple explanation as to how to implement.

like image 664
user391339 Avatar asked Apr 08 '11 06:04

user391339


People also ask

What is high pass filter in MATLAB?

Design high-pass filters using MATLAB A high-pass filter attenuates signals below a cutoff frequency (the stopband) and allows signals above the cutoff frequency (the passband). The amount of attenuation depends on the design of the filter.

What does a high pass filter do?

A high pass filter is a simple, effective type of EQ curve, one that scoops out unwanted low frequencies from any audio source. They are fantastic when used correctly to clean up woofy signals and tighten up arrangements.

How do I create a highpass filter in MATLAB?

y = highpass( x , wpass ) filters the input signal x using a highpass filter with normalized passband frequency wpass in units of π rad/sample. highpass uses a minimum-order filter with a stopband attenuation of 60 dB and compensates for the delay introduced by the filter.

What is high pass filtering in image processing?

A high pass filter tends to retain the high frequency information within an image while reducing the low frequency information. The kernel of the high pass filter is designed to increase the brightness of the center pixel relative to neighboring pixels.


2 Answers

There are several filters that can be used, and the actual choice of the filter will depend on what you're trying to achieve. Since you mentioned Butterworth, Chebyschev and Elliptical filters, I'm assuming you're looking for IIR filters in general.

Wikipedia is a good place to start reading up on the different filters and what they do. For example, Butterworth is maximally flat in the passband and the response rolls off in the stop band. In Chebyschev, you have a smooth response in either the passband (type 2) or the stop band (type 1) and larger, irregular ripples in the other and lastly, in Elliptical filters, there's ripples in both the bands. The following image is taken from wikipedia.

enter image description here

So in all three cases, you have to trade something for something else. In Butterworth, you get no ripples, but the frequency response roll off is slower. In the above figure, it takes from 0.4 to about 0.55 to get to half power. In Chebyschev, you get steeper roll off, but you have to allow for irregular and larger ripples in one of the bands, and in Elliptical, you get near-instant cut off, but you have ripples in both bands.

The choice of filter will depend entirely on your application. Are you trying to get a clean signal with little to no losses? Then you need something that gives you a smooth response in the passband (Butterworth/Cheby2). Are you trying to kill frequencies in the stopband, and you won't mind a minor loss in the response in the passband? Then you will need something that's smooth in the stop band (Cheby1). Do you need extremely sharp cut-off corners, i.e., anything a little beyond the passband is detrimental to your analysis? If so, you should use Elliptical filters.

The thing to remember about IIR filters is that they've got poles. Unlike FIR filters where you can increase the order of the filter with the only ramification being the filter delay, increasing the order of IIR filters will make the filter unstable. By unstable, I mean you will have poles that lie outside the unit circle. To see why this is so, you can read the wiki articles on IIR filters, especially the part on stability.

To further illustrate my point, consider the following band pass filter.

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); 

Now if you look at the zero-pole diagram using zplane(b,a), you'll see that there are several poles (x) lying outside the unit circle, which makes this approach unstable.

enter image description here

and this is evident from the fact that the frequency response is all haywire. Use freqz(b,a) to get the following

enter image description here

To get a more stable filter with your exact design requirements, you'll need to use second order filters using the z-p-k method instead of b-a, in MATLAB. Here's how for the same filter as above:

[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. 

Now if you look at the characteristics of this filter, you'll see that all the poles lie inside the unit circle (hence stable) and matches the design requirements

enter image description here

enter image description here

The approach is similar for butter and ellip, with equivalent buttord and ellipord. The MATLAB documentation also has good examples on designing filters. You can build upon these examples and mine to design a filter according to what you want.

To use the filter on your data, you can either do filter(b,a,data) or filter(Hd,data) depending on what filter you eventually use. If you want zero phase distortion, use filtfilt. However, this does not accept dfilt objects. So to zero-phase filter with Hd, use the filtfilthd file available on the Mathworks file exchange site

EDIT

This is in response to @DarenW's comment. Smoothing and filtering are two different operations, and although they're similar in some regards (moving average is a low pass filter), you can't simply substitute one for the other unless it you can be sure that it won't be of concern in the specific application.

For example, implementing Daren's suggestion on a linear chirp signal from 0-25kHz, sampled at 100kHz, this the frequency spectrum after smoothing with a Gaussian filter

enter image description here

Sure, the drift close to 10Hz is almost nil. However, the operation has completely changed the nature of the frequency components in the original signal. This discrepancy comes about because they completely ignored the roll-off of the smoothing operation (see red line), and assumed that it would be flat zero. If that were true, then the subtraction would've worked. But alas, that is not the case, which is why an entire field on designing filters exists.

like image 133
abcd Avatar answered Oct 04 '22 19:10

abcd


Create your filter - for example using [B,A] = butter(N,Wn,'high') where N is the order of the filter - if you are unsure what this is, just set it to 10. Wn is the cutoff frequency normalized between 0 and 1, with 1 corresponding to half the sample rate of the signal. If your sample rate is fs, and you want a cutoff frequency of 10 Hz, you need to set Wn = (10/(fs/2)).

You can then apply the filter by using Y = filter(B,A,X) where X is your signal. You can also look into the filtfilt function.

like image 30
Andreass Avatar answered Oct 04 '22 19:10

Andreass