# Digital Filters with GNU Octave

The following scripts use Octave's Signal Processing Toolbox; If you don't have the toolbox installed, get it from Octave-Forge.

It is easy to design a low pass filter:

```% The sampling frequency in Hz.
Fsam = 1500;

% Nyquist frequency, in Hz.
% The Nyquist frequency is half your sampling frequency.
Fnyq = Fsam/2;

% The cut-off frequency of your Low pass filter in Hz.
% This frequency must be greater than 0 and less than Fnyq.
Fc=1/4;

% Create a first-order Butterworth low pass.
% The returned vectors are of legth n.
% Thus a first order filter is created with n = 2.
[b,a]=butter(2, Fc/Fnyq);

% clear unused variables
clear("Fnyq", "Fc");
```

Now let's test the filter. First, let's generate a input signal containing components at 1 Hz, 200 Hz and Gaussian white noise.

```% Create a 5 seconds signal with 3 components:
% a 1 Hz and a 200 Hz sinusoidal component and some gaussian noise.
t=0:1/Fsam:5;
input=sin(2*pi*t) + sin(2*pi*200*t) + randn(size(t));

% Apply the filter to the input signal and plot input and output.
output=filter(b,a,input);
plot(t, [input; output])
```

You can also compare the input and output signals in the frequency domain:

```plot([abs(fft(input)); abs(fft(output))])

find(abs(fft(input)) > 3000)
find(abs(fft(output)) > 3000)
```

Thanks to Greg Locock for pointing out that rand() does not yield Gaussian noise.