61 lines
1.9 KiB
Matlab
61 lines
1.9 KiB
Matlab
function [signal_filtered, Z, P] = iirFilter(N, cutoffFreq, signal, samplingFreq, filterType)
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% function [signal_filtered, Z, P] = iirFilter(N, cutoffFreq, signal, samplingFreq, filterType)
|
|
% ex.: [signal_filtered, Z, P] = iirFilter(6, [5 20], x, 200, 1)
|
|
%
|
|
% Task:
|
|
% To create and apply an IIR filter (Butterworth or Chebyshev)
|
|
% Supports low-pass or band-pass depending on the cutoffFreq input.
|
|
%
|
|
% Inputs:
|
|
% -N: order of the filter
|
|
% -cutoffFreq: scalar (for low-pass) or 2-element vector [low high] for bandpass
|
|
% -signal: input signal to be filtered
|
|
% -samplingFreq: sampling frequency in Hz
|
|
% -filterType: 1 = Butterworth, 2 = Chebyshev type I
|
|
%
|
|
% Outputs:
|
|
% -signal_filtered: filtered signal
|
|
% -Z: filter zeros
|
|
% -P: filter poles
|
|
%
|
|
% Author: Tikea TE
|
|
% Date: 16/04/2025
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% Design the filter
|
|
if filterType == 1
|
|
if length(cutoffFreq) == 1
|
|
[b, a] = butter(N, cutoffFreq / (samplingFreq / 2), 'low');
|
|
elseif length(cutoffFreq) == 2
|
|
[b, a] = butter(N, cutoffFreq / (samplingFreq / 2), 'bandpass');
|
|
else
|
|
error('cutoffFreq must be scalar or 2-element vector');
|
|
end
|
|
elseif filterType == 2
|
|
Rp = 10; % ripple for Chebyshev filter
|
|
if length(cutoffFreq) == 1
|
|
[b, a] = cheby1(N, Rp, cutoffFreq / (samplingFreq / 2), 'low');
|
|
elseif length(cutoffFreq) == 2
|
|
[b, a] = cheby1(N, Rp, cutoffFreq / (samplingFreq / 2), 'bandpass');
|
|
else
|
|
error('cutoffFreq must be scalar or 2-element vector');
|
|
end
|
|
else
|
|
error('Filter type must be 1 (Butterworth) or 2 (Chebyshev)');
|
|
end
|
|
|
|
% Analyze zeros/poles
|
|
[Z, P] = zeroPole(a, b, 1);
|
|
|
|
% Show frequency response
|
|
figure;
|
|
freqz(b, a, N, samplingFreq);
|
|
title('Frequency response');
|
|
grid on;
|
|
|
|
% Apply filter to signal
|
|
signal_filtered = filter(b, a, signal);
|
|
|
|
end
|