IIR Filter Design with Butterworth and Chebyshev Type I Filters
📖 Scenario: You are working on a project to clean noisy sensor data. To do this, you need to design digital filters that remove unwanted frequencies.Two common filters are Butterworth and Chebyshev Type I filters. They help keep the important signals while reducing noise.
🎯 Goal: You will create two digital filters using scipy.signal: a Butterworth filter and a Chebyshev Type I filter. Then, you will print their filter coefficients.
📋 What You'll Learn
Use scipy.signal.butter to create a Butterworth filter
Use scipy.signal.cheby1 to create a Chebyshev Type I filter
Set filter order to 4
Set cutoff frequency to 0.3 (normalized frequency)
Print the filter coefficients for both filters
💡 Why This Matters
🌍 Real World
Digital filters like Butterworth and Chebyshev are used in audio processing, sensor data cleaning, and communication systems to remove noise and unwanted signals.
💼 Career
Understanding how to design and use IIR filters is important for roles in signal processing, data analysis, and embedded systems engineering.
Progress0 / 4 steps
1
Create filter order and cutoff frequency variables
Create a variable called order and set it to 4. Create another variable called cutoff and set it to 0.3.
SciPy
Hint
Use simple assignment like order = 4 and cutoff = 0.3.
2
Import butter and cheby1 functions from scipy.signal
Import butter and cheby1 from scipy.signal.
SciPy
Hint
Use from scipy.signal import butter, cheby1 to import both functions.
3
Create Butterworth and Chebyshev Type I filters
Use butter with order and cutoff to create a lowpass Butterworth filter. Save the output as b_butter and a_butter. Use cheby1 with order, ripple of 1, and cutoff to create a lowpass Chebyshev Type I filter. Save the output as b_cheby and a_cheby.
SciPy
Hint
Use butter(order, cutoff, btype='low') and cheby1(order, 1, cutoff, btype='low').
4
Print the filter coefficients
Print the variables b_butter, a_butter, b_cheby, and a_cheby each on a separate line.
SciPy
Hint
Use four print statements, one for each coefficient array.
Practice
(1/5)
1. What is the main difference between a Butterworth and a Chebyshev IIR filter in scipy.signal?
easy
A. Butterworth filters are FIR, Chebyshev filters are IIR.
B. Butterworth filters have ripples, Chebyshev filters have a smooth response.
C. Butterworth filters are only for high-pass, Chebyshev only for low-pass.
D. Butterworth filters have a smooth frequency response, Chebyshev filters have ripples in the passband.
Assuming filter types are limited to passband types
2. Which of the following is the correct way to design a 4th order Butterworth lowpass filter with cutoff frequency 0.3 (normalized) using scipy.signal.butter?
easy
A. b, a = butter(0.3, 4, btype='low')
B. b, a = butter(4, 0.3, btype='low')
C. b, a = butter(4, 0.3, type='lowpass')
D. b, a = butter(order=4, cutoff=0.3, kind='low')
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 B
Quick Check:
Order first, cutoff second, btype='low' = A [OK]
Hint: Order first, cutoff second, btype='low' in butter() [OK]
Common Mistakes:
Swapping order and cutoff parameters
Using wrong keyword names like 'type' or 'kind'
Passing cutoff frequency as first argument
3. What will be the output shape of the coefficients when running this code?
from scipy.signal import cheby1
b, a = cheby1(3, 1, 0.4, btype='high')
medium
A. (3,), (3,)
B. (3, 3), (3, 3)
C. (4,), (4,)
D. (2,), (2,)
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 C
Quick Check:
Length = order + 1 = 4 [OK]
Hint: Coefficients length = order + 1 [OK]
Common Mistakes:
Assuming length equals order
Expecting 2D arrays instead of 1D
Confusing numerator and denominator shapes
4. Identify the error in this code snippet for designing a Chebyshev type I filter:
from scipy.signal import cheby1
b, a = cheby1(5, 0.5, 0.2, btype='bandpass')
medium
A. The cutoff frequency should be a list or tuple for bandpass, not a single float.
B. The ripple parameter is missing and required.
C. The order parameter should be a float, not integer.
D. The btype 'bandpass' is not supported by cheby1.
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 A
Quick Check:
Bandpass cutoff needs two frequencies = C [OK]
Hint: Bandpass cutoff must be two frequencies in a list/tuple [OK]
Common Mistakes:
Passing single float for bandpass cutoff
Confusing ripple parameter position
Using unsupported btype values
5. You want to design a Chebyshev type I lowpass filter with order 6, 0.5 dB ripple, and cutoff frequency 0.25. Which code snippet correctly creates the filter and applies it to a signal x using scipy.signal.lfilter?
hard
A. from scipy.signal import cheby1, lfilter
b, a = cheby1(6, 0.5, 0.25, btype='low')
y = lfilter(b, a, x)
B. from scipy.signal import cheby1, lfilter
b, a = cheby1(6, 0.5, 0.25, btype='high')
y = lfilter(a, b, x)
C. from scipy.signal import butter, lfilter
b, a = butter(6, 0.25, btype='low')
y = lfilter(b, a, x)
D. from scipy.signal import cheby1, lfilter
b, a = cheby1(0.5, 6, 0.25, btype='low')
y = lfilter(b, a, x)
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 A
Quick Check:
Correct order and lfilter usage = A [OK]
Hint: Order, ripple, cutoff in cheby1; lfilter(b, a, x) [OK]
Common Mistakes:
Swapping order and ripple parameters
Using butter instead of cheby1
Swapping b and a in lfilter
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.