Pole-zero analysis helps us understand if a system will behave well or become unstable. It shows where the system's key points (poles and zeros) are on a graph.
Pole-zero analysis for stability in Signal Processing
H(z) = (z - zero1)(z - zero2)... / (z - pole1)(z - pole2)...
Poles are values of z that make the denominator zero.
Zeros are values of z that make the numerator zero.
H(z) = (z - 0.5) / (z - 0.9)
H(z) = (z - 0.3)(z + 0.4) / (z - 0.8)(z - 0.7)
This code plots poles and zeros on the complex plane with the unit circle. It then checks if all poles are inside the unit circle to decide stability.
import numpy as np import matplotlib.pyplot as plt # Define poles and zeros zeros = [0.5, -0.4] poles = [0.8, 0.7] # Plot unit circle theta = np.linspace(0, 2*np.pi, 400) x = np.cos(theta) y = np.sin(theta) plt.figure(figsize=(6,6)) plt.plot(x, y, 'k--', label='Unit Circle') # Plot zeros plt.scatter(np.real(zeros), np.imag(zeros), marker='o', facecolors='none', edgecolors='b', s=100, label='Zeros') # Plot poles plt.scatter(np.real(poles), np.imag(poles), marker='x', color='r', s=100, label='Poles') plt.title('Pole-Zero Plot for Stability Analysis') plt.xlabel('Real Part') plt.ylabel('Imaginary Part') plt.grid(True) plt.axis('equal') plt.legend() plt.show() # Check stability: all poles must be inside unit circle stable = all(abs(p) < 1 for p in poles) print(f"System is {'stable' if stable else 'unstable'}.")
For discrete systems, poles inside the unit circle mean stability.
Zeros affect the system's frequency response but not stability directly.
Poles on or outside the unit circle mean the system can become unstable.
Pole-zero plots show key points of a system on the complex plane.
Stability depends on where poles lie relative to the unit circle.
Plotting helps visualize and decide if a system will behave well.
Practice
Solution
Step 1: Understand pole location and stability
Poles inside the unit circle mean the system's response decays over time.Step 2: Relate pole location to system behavior
Since poles are inside the unit circle, the system output will not grow unbounded.Final Answer:
The system is stable -> Option AQuick Check:
Poles inside unit circle = stable system [OK]
- Confusing poles inside with outside the unit circle
- Thinking zeros affect stability directly
- Ignoring the unit circle boundary
Solution
Step 1: Identify correct markers for poles and zeros
Poles are usually marked with 'x' in red, zeros with 'o' in blue.Step 2: Match syntax with matplotlib scatter function
plt.scatter([0.5, 0.5], [0.5, -0.5], marker='x', color='r'); plt.scatter([0.8], [0], marker='o', color='b') uses plt.scatter with correct markers and colors for poles and zeros.Final Answer:
plt.scatter([0.5, 0.5], [0.5, -0.5], marker='x', color='r'); plt.scatter([0.8], [0], marker='o', color='b') -> Option AQuick Check:
Correct markers and colors for poles and zeros [OK]
- Swapping markers for poles and zeros
- Using plt.plot with wrong format strings
- Plotting zeros at wrong coordinates
Solution
Step 1: Check each pole's location relative to the unit circle
One pole is at 0.9 (inside), the other at 1.1 (outside) the unit circle.Step 2: Determine stability from pole locations
Since a pole lies outside the unit circle, the system is unstable regardless of zeros.Final Answer:
Unstable because one pole is outside the unit circle -> Option DQuick Check:
Any pole outside unit circle = unstable [OK]
- Ignoring poles outside the unit circle
- Confusing zeros with poles for stability
- Assuming zeros affect stability directly
import matplotlib.pyplot as plt poles = [0.7+0.7j, 0.7-0.7j] zeros = [0.9] plt.scatter(poles.real, poles.imag, marker='x', color='r') plt.scatter(zeros.real, zeros.imag, marker='o', color='b') plt.show()
Solution
Step 1: Identify data types of poles and zeros
Poles and zeros are Python lists of complex numbers, which do not support .real or .imag attributes directly.Step 2: Fix by converting lists to numpy arrays
Convert poles and zeros to numpy arrays to access .real and .imag properties without error.Final Answer:
Error because poles and zeros are lists, need numpy arrays for .real and .imag -> Option BQuick Check:
Lists lack .real/.imag; use numpy arrays [OK]
- Trying to access .real on Python lists
- Ignoring missing plt.show()
- Using wrong marker symbols
Solution
Step 1: Understand stability and pole radius
Poles closer to origin (smaller magnitude) mean faster decay and better stability.Step 2: Compare given pole movements
Move poles to [0.4, 0.5j, -0.5j] moves poles closer to origin (0.4 and 0.5j), reducing magnitude from original values.Step 3: Confirm other options increase or keep magnitude same
Options B and C move poles farther or slightly farther from origin, reducing stability; A is no change.Final Answer:
Move poles to [0.4, 0.5j, -0.5j] -> Option CQuick Check:
Smaller pole radius = better stability [OK]
- Moving poles outside unit circle
- Changing zeros instead of poles
- Not reducing pole magnitude
Ready to prove it?
Pass the test and this pattern moves unknown
