# Filtering 50Hz using a notch filter in MATLAB

I need to filter 50 Hz from a signal. It looks like the best options are either a notch filter or a LMS filter, but I don't have a copy of the noise so a notch filter seems to be the best choice.

I don't need the frequencies normalised, as I know the sampling frequency (16kHz), and the duration is 30 seconds. The bandwidth can be fairly tight, 49.5Hz ~ 50.5Hz should be fine.

It looks like I need to use a combination of filter and iirnotch, but I'm not entirely sure how.

If someone can bring this all together I would greatly appreciate it. Thanks.

• I want to ask how the autoregressive filter simulation on damping/redaman???
– user10285
Jun 22 '14 at 5:42
• How to define 'x' in above program (where 'x' is a signal input)... thanks
– user18358
Nov 19 '15 at 12:45

I'm not sure what iirnotch does, but this is how to design the notch filter by hand.

fs = 20000;             % sampling rate
f0 = 50;                % notch frequency
fn = fs/2;              % Nyquist frequency
freqRatio = f0/fn;      % ratio of notch freq. to Nyquist freq.

notchWidth = 0.1;       % width of the notch

% Compute zeros
notchZeros = [exp( sqrt(-1)*pi*freqRatio ), exp( -sqrt(-1)*pi*freqRatio )];

% Compute poles
notchPoles = (1-notchWidth) * notchZeros;

figure;
zplane(notchZeros.', notchPoles.');

b = poly( notchZeros ); %  Get moving average filter coefficients
a = poly( notchPoles ); %  Get autoregressive filter coefficients

figure;
freqz(b,a,32000,fs)

% filter signal x
y = filter(b,a,x);

• Simple and elegant. I understand that the smaller notchWidth, the smaller the width of the notch will be, but does notchWidth relate to a concrete quantity?
– Lolo
Mar 9 '16 at 3:06
• @Lolo I don't think it does. I just picked it because it seemed like a convenient number. Mar 9 '16 at 4:25

You can just type help iirnotch and then see the following example:

% Design a filter with a Q-factor of Q=35 to remove a 60 Hz tone from
% system running at 300 Hz.
Wo = 60/(300/2);  BW = Wo/35;
[b,a] = iirnotch(Wo,BW);


If you replace the 60 with 50 Hz and then do:

Y = filter(b,a,X)


It should work (with X your data)