FIR filtering using firpm

19 views (last 30 days)
JOHN
JOHN on 21 Jun 2013
Commented: RAN on 10 Oct 2024
Hello, i've been asked to make a bandpass FIR filter, in order to filter a wav file. Firstly the wav file had saple rate Fs=20000 and i had to convert it at Fs=8000. I did that using these commands: [zeroA, Fs] = wavread('C:\Users\matlab\sounds\ZA');% to load file ZA.wav Z=zeroA(1:2.5:end);%to convert the sample rate. Now i have to design a band pass FIR filter using the command firpm, in order to eliminate the DC at 60hz and the high frequency noise. the filter features are: stopband: 0=<|F|<=100 Hz, transition zone: 100=<|F|<=200 Hz, passband: 200=<|F|<=4000 Hz. Then i have to filter the wav file whith this FIR filter. I woulb be grateful if you could help me. Thanks in advance.

Answers (1)

Akshat Dalal
Akshat Dalal on 22 Aug 2024
Hi John,
You can use the 'firpm' function to create a bandpass FIR filter to eliminate DC at 60 Hz and high-frequency noise. The steps for designing the filter and applying it to a WAV file are given below:
  1. Design the Bandpass FIR Filter: Given your specifications, you need to create a filter that stops frequencies below 100 Hz and above 4000 Hz, with a transition band from 100 Hz to 200 Hz on the low end. This can be achieved using the 'firpm' function in MATLAB. Please refer to the following documentation for more information: https://www.mathworks.com/help/signal/ref/firpm.html
  2. Apply the Filter to the WAV File: Once you have designed the filter, you can apply it to your downsampled WAV file using the filter function. Please refer to the following documentation for more information: https://www.mathworks.com/help/matlab/ref/filter.html
I am also attaching a sample code for the above steps:
% Define filter specifications
Fs = 8000; % Sampling frequency
Fstop1 = 100; % First stopband edge
Fpass1 = 200; % First passband edge
Fpass2 = 4000; % Second passband edge
Fstop2 = 4100; % Second stopband edge
Astop1 = 60; % First stopband attenuation (dB)
Apass = 1; % Passband ripple (dB)
Astop2 = 60; % Second stopband attenuation (dB)
% Normalize frequencies to Nyquist frequency (Fs/2)
nyquist = Fs / 2;
frequencies = [0 Fstop1 Fpass1 Fpass2 Fstop2 nyquist] / nyquist;
amplitudes = [0 0 1 1 0 0];
weights = [10^(Astop1/20) 1 10^(Astop2/20)];
% Design the filter using firpm
n = 100; % Filter order (adjust as needed)
b = firpm(n, frequencies, amplitudes, weights);
% Load and downsample the WAV file
[zeroA, originalFs] = audioread('C:\Users\matlab\sounds\ZA.wav');
Z = zeroA(1:2.5:end); % Downsample to 8000 Hz
% Filter the signal
filtered_signal = filter(b, 1, Z);
% Save the filtered signal to a new WAV file
audiowrite('C:\Users\matlab\sounds\ZA_filtered.wav', filtered_signal, Fs);
Hope this helps!

Products

Community Treasure Hunt

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

Start Hunting!