Bird
Raised Fist0
SciPydata~5 mins

IIR filter design (butter, cheby1) in SciPy

Choose your learning style10 modes available
Introduction

IIR filters help clean signals by removing unwanted noise or parts. Butterworth and Chebyshev filters are common ways to design these filters.

You want to remove noise from a sound recording.
You need to smooth sensor data before analysis.
You want to keep only certain frequencies in a signal, like bass or treble.
You are working on real-time signal processing where fast filtering is needed.
Syntax
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).

Examples
Creates a 4th order Butterworth low-pass filter with cutoff at 1000 Hz for a signal sampled at 8000 Hz.
SciPy
b, a = butter(4, 1000, btype='low', fs=8000)
Creates a 3rd order Chebyshev type 1 high-pass filter with 1 dB ripple and cutoff at 2000 Hz.
SciPy
b, a = cheby1(3, 1, 2000, btype='high', fs=8000)
Sample Program

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.

SciPy
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()
OutputSuccess
Important Notes

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.

Summary

IIR filters help remove unwanted parts of signals.

Butterworth filters are smooth and simple.

Chebyshev filters can be sharper but have ripples.

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.

Solution

  1. Step 1: Understand Butterworth filter characteristics

    Butterworth filters are designed to have a maximally flat frequency response in the passband, meaning no ripples.
  2. Step 2: Understand Chebyshev filter characteristics

    Chebyshev filters allow ripples in the passband to achieve a sharper cutoff compared to Butterworth filters.
  3. Final Answer:

    Butterworth filters have a smooth frequency response, Chebyshev filters have ripples in the passband. -> Option D
  4. Quick Check:

    Butterworth smooth, Chebyshev ripples = D [OK]
Hint: Butterworth = smooth, Chebyshev = ripples [OK]
Common Mistakes:
  • Confusing which filter has ripples
  • Thinking Butterworth is FIR
  • 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

  1. 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.
  2. 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.
  3. Final Answer:

    b, a = butter(4, 0.3, btype='low') -> Option B
  4. 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

  1. 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.
  2. Step 2: Calculate length for order 3

    For order 3, length is 3+1 = 4, so both b and a have shape (4,).
  3. Final Answer:

    (4,), (4,) -> Option C
  4. 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

  1. 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.
  2. Step 2: Verify other parameters

    Order as integer and ripple (second parameter) are correctly provided; btype 'bandpass' is valid.
  3. Final Answer:

    The cutoff frequency should be a list or tuple for bandpass, not a single float. -> Option A
  4. 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

  1. Step 1: Verify cheby1 parameters order

    Order is first parameter (6), ripple second (0.5), cutoff third (0.25), and btype='low' for lowpass.
  2. Step 2: Check lfilter usage

    lfilter takes numerator coefficients (b), denominator coefficients (a), and signal (x) in that order.
  3. 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
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard