Create a Notch filter with low and high pass filters

32 views (last 30 days)
I have been attempting to create a notch filter where I can specifiy the range of frequncies that will be filtered out. This is my best attempt:
[y,Fs] = audioread('africa-toto.wav');
notchfilt = highpass(y,1000,Fs) .* lowpass(y,100,Fs);
figure
freqz(notchfilt, 1, 2^16, Fs)
sound(notchfilt,Fs)
I'm not sure why but the resulting audio playback is very very grainy and doesnt remove the frequencies specified correctly.
  1 Comment
Paul
Paul on 5 Dec 2022
Hi Luke,
Not sure why the outputs of highpass() and lowpass() would be multiplied. If anything, it looks like they should be added
% create some data
Fs = 5000;
rng(100);
y = randn(1024,1);
% DTFT of the input
[hy,wy] = freqz(y,1,2^16);
% the output and its DTFT
notchfilt = highpass(y,1000,Fs) + lowpass(y,100,Fs);
[hn,wn] = freqz(notchfilt,1,2^16);
figure
plot(wy/2/pi*Fs,[abs(hy) , abs(hn)]),grid
Having said, designing the bandstop filter directly is the way to go.

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 4 Dec 2022
Use the bandstop function, specifying 'ImpulseResponse','iir' for best results.
  3 Comments
Luke McDevitt
Luke McDevitt on 4 Dec 2022
For anyone wondering this would be the new code:
(where 350 is the low cutoff and 6000 is the high cutoff)
[y,Fs] = audioread('africa-toto.wav');
bandstop(y,[350 6000],Fs,ImpulseResponse="iir",Steepness=0.95)

Sign in to comment.

More Answers (0)

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!