diff --git a/iirFilter.m b/iirFilter.m new file mode 100644 index 0000000..4ffca0a --- /dev/null +++ b/iirFilter.m @@ -0,0 +1,60 @@ +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