IIR filters help clean signals by removing unwanted noise or parts. Butterworth and Chebyshev filters are common ways to design these filters.
IIR filter design (butter, cheby1) in SciPy
from scipy.signal import butter, cheby1 # Butterworth filter design b, a = butter(order, cutoff_freq, btype='low', fs=sample_rate) # Chebyshev type 1 filter design b, a = cheby1(order, ripple, cutoff_freq, btype='low', fs=sample_rate)
order controls filter sharpness; higher means sharper cutoff.
cutoff_freq is the frequency where filtering starts (in Hz).
b, a = butter(4, 1000, btype='low', fs=8000)
b, a = cheby1(3, 1, 2000, btype='high', fs=8000)
This code creates two filters: a Butterworth low-pass and a Chebyshev high-pass. It then plots their frequency responses so you can see how they affect different frequencies.
import numpy as np import matplotlib.pyplot as plt from scipy.signal import butter, cheby1, freqz # Sample rate and desired cutoff frequencies (Hz) sample_rate = 8000 cutoff_low = 1000 cutoff_high = 2000 # Design Butterworth low-pass filter b_butter, a_butter = butter(4, cutoff_low, btype='low', fs=sample_rate) # Design Chebyshev type 1 high-pass filter with 1 dB ripple b_cheby, a_cheby = cheby1(3, 1, cutoff_high, btype='high', fs=sample_rate) # Frequency response for Butterworth w_butter, h_butter = freqz(b_butter, a_butter, fs=sample_rate) # Frequency response for Chebyshev w_cheby, h_cheby = freqz(b_cheby, a_cheby, fs=sample_rate) # Plot frequency responses plt.figure(figsize=(8, 5)) plt.plot(w_butter, 20 * np.log10(abs(h_butter)), label='Butterworth Low-pass') plt.plot(w_cheby, 20 * np.log10(abs(h_cheby)), label='Chebyshev High-pass') plt.title('Frequency Response of IIR Filters') plt.xlabel('Frequency (Hz)') plt.ylabel('Amplitude (dB)') plt.ylim(-60, 5) plt.grid(True) plt.legend() plt.show()
Butterworth filters have a smooth response with no ripples in the passband.
Chebyshev type 1 filters allow ripples in the passband but have a sharper cutoff.
Always specify the sample rate (fs) to use frequencies in Hz directly.
IIR filters help remove unwanted parts of signals.
Butterworth filters are smooth and simple.
Chebyshev filters can be sharper but have ripples.
Practice
scipy.signal?Solution
Step 1: Understand Butterworth filter characteristics
Butterworth filters are designed to have a maximally flat frequency response in the passband, meaning no ripples.Step 2: Understand Chebyshev filter characteristics
Chebyshev filters allow ripples in the passband to achieve a sharper cutoff compared to Butterworth filters.Final Answer:
Butterworth filters have a smooth frequency response, Chebyshev filters have ripples in the passband. -> Option DQuick Check:
Butterworth smooth, Chebyshev ripples = D [OK]
- Confusing which filter has ripples
- Thinking Butterworth is FIR
- Assuming filter types are limited to passband types
scipy.signal.butter?Solution
Step 1: Recall butter function signature
The function signature is butter(N, Wn, btype='low', analog=False, output='ba'), where N is order and Wn is cutoff frequency.Step 2: Check correct parameter usage
b, a = butter(4, 0.3, btype='low') uses butter(4, 0.3, btype='low'), which matches the signature correctly.Final Answer:
b, a = butter(4, 0.3, btype='low') -> Option BQuick Check:
Order first, cutoff second, btype='low' = A [OK]
- Swapping order and cutoff parameters
- Using wrong keyword names like 'type' or 'kind'
- Passing cutoff frequency as first argument
from scipy.signal import cheby1 b, a = cheby1(3, 1, 0.4, btype='high')
Solution
Step 1: Understand cheby1 output
The function returns numerator (b) and denominator (a) coefficients arrays each of length N+1, where N is filter order.Step 2: Calculate length for order 3
For order 3, length is 3+1 = 4, so both b and a have shape (4,).Final Answer:
(4,), (4,) -> Option CQuick Check:
Length = order + 1 = 4 [OK]
- Assuming length equals order
- Expecting 2D arrays instead of 1D
- Confusing numerator and denominator shapes
from scipy.signal import cheby1 b, a = cheby1(5, 0.5, 0.2, btype='bandpass')
Solution
Step 1: Check bandpass cutoff frequency format
For bandpass filters, cutoff frequency must be a sequence (list or tuple) of two frequencies, not a single float.Step 2: Verify other parameters
Order as integer and ripple (second parameter) are correctly provided; btype 'bandpass' is valid.Final Answer:
The cutoff frequency should be a list or tuple for bandpass, not a single float. -> Option AQuick Check:
Bandpass cutoff needs two frequencies = C [OK]
- Passing single float for bandpass cutoff
- Confusing ripple parameter position
- Using unsupported btype values
x using scipy.signal.lfilter?Solution
Step 1: Verify cheby1 parameters order
Order is first parameter (6), ripple second (0.5), cutoff third (0.25), and btype='low' for lowpass.Step 2: Check lfilter usage
lfilter takes numerator coefficients (b), denominator coefficients (a), and signal (x) in that order.Final Answer:
from scipy.signal import cheby1, lfilter b, a = cheby1(6, 0.5, 0.25, btype='low') y = lfilter(b, a, x) -> Option AQuick Check:
Correct order and lfilter usage = A [OK]
- Swapping order and ripple parameters
- Using butter instead of cheby1
- Swapping b and a in lfilter
Ready to prove it?
Pass the test and this pattern moves unknown
