Any filter that operates in ``real-time'' is a causal filter in that it's output at time t0 can only depend on events that have occured for tt0. But, if we have recorded data and are processing it after the fact, then we have knowledge of what happened at t > t0, so the output at time t = t0 could make use of that. The best example of these so-called non-causal filters is matlab's filtfilt command, which applies a filter to a sequence of data, takes the output, reverses it, and applies the same filter again. The phase delays from the forward and backwards filtering cancel each other out, so there is no effective filter delay. Obviously such a process cannot happen in real-time and all real-time filters must have some delay.
An example of the use of filtfilt() is shown in Figure 1. You can see that although filter() and filtfilt() both remove the high frequency noise, the use of filter() introduces significant phase delay. filtfilt() has zero phase delay. Further, at t=0, the output of filter() starts at 0, whereas the output of filtfilt() has matched the initial conditions exactly 2.
Because it filters the data twice, once forward and once backward, filtfilt() also has a better amplitude response (i.e. sharper cutoff and more attentuation in the stop band).
For almost all of my day-to-day filtering needs, I use filtfilt(). I only use filter() when I specifically need to simulate a real-time process.
More information on causal versus non-causal filters can be found at http://en.wikipedia.org/wiki/Causal_filter
%code to generate the above figure
Fs = 300; t = 0:(1/Fs):1; sig = cos(5 * 2 * pi * t) + 0.4 * rand(1, length(t)); [b,a] = butter(4, 10 / (Fs/2)); figure; plot(t, sig, t, filter(b,a, sig), t, filtfilt(b,a,sig)); legend('Original 5 Hz Signal with noise', 'Using filter(), 4 pole butterworth @ 10 Hz', 'Using filtfilt()'); xlabel('Time (s)'); ylabel('Response'); title('Effect of filtfilt() versus filter()') ylim([-1 1.7]) print -dpng filtfilt.png |
/' $I