MATLAB: IIR and FIR Bandpass Filter Design Help (2.2kHz) from a .wav

bandpassbutterworthfilterfiriir

I'm trying to develop a filter to remove a 2.2kHz tone from a voice recording (.wav). I'm looking at a lot of responses, but not finding anything that's working.
https://www.mathworks.com/matlabcentral/answers/317340-how-to-filtre-an-audio-signal-with-low-pass-filtre
This seems to be a good approach, but I need a bandpass filter.
Would someone help me through this? The .wav and a frequency spectrum are provided. This is how I extracted the frequency plot.
clc, clear all, close all;
[y,Fs] = audioread('HornAudioECE450.wav');
stepSize = 1/Fs;
L = length(y);
t = 0:stepSize:(length(y)*stepSize – stepSize);
f = linspace((-Fs/2),(Fs/2),L);
figure()
plot(t,y);
Y = fftshift(abs(fft(y)./2));
plot(f,Y);

Best Answer

You need to use a notch filter. See: Remove the 60 Hz Hum from a Signal (link) for an example.
I prefer to design my own filters, so try this:
Fs = 44100; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Wp = ([-5 5]+2.2E+3)/Fn; % Stopband Frequency (Normalised)
Ws = ([-10 10]+2.2E+3)/Fn; % Passband Frequency (Normalised)
Rp = 1; % Passband Ripple (dB)
Rs = 50; % Stopband Ripple (dB)
[n,Ws] = cheb2ord(Wp,Ws,Rp,Rs); % Filter Order
[z,p,k] = cheby2(n,Rs,Ws,'stop'); % Filter Design, Sepcify Bandstop
[sosn,gn] = zp2sos(z,p,k); % Convert To Second-Order-Section For Stability
figure(3)
freqz(sosn, 2^16, Fs) % Filter Bode Plot
filtered_signal = filtfilt(sosn, gn, original_signal); % Filter Signal