Discrete Fourier Transform (DFT) in Signal Processing - Time & Space Complexity
We want to understand how the time needed to compute the Discrete Fourier Transform changes as the input size grows.
How does the number of calculations increase when we analyze longer signals?
Analyze the time complexity of the following code snippet.
for k in range(N):
X[k] = 0
for n in range(N):
angle = -2 * pi * k * n / N
X[k] += x[n] * (cos(angle) + 1j * sin(angle))
This code computes the DFT of a signal with N points by summing over all input points for each output frequency.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Nested loops multiplying and summing complex exponentials.
- How many times: Outer loop runs N times; inner loop runs N times for each outer loop.
Each time we double the input size, the number of calculations grows much faster because of the nested loops.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 100 |
| 100 | 10,000 |
| 1000 | 1,000,000 |
Pattern observation: The operations grow roughly by the square of the input size.
Time Complexity: O(N2)
This means the time to compute the DFT grows proportionally to the square of the number of input points.
[X] Wrong: "The DFT calculation time grows linearly with input size because it just loops once."
[OK] Correct: The DFT uses two nested loops, so the total work multiplies, not just adds, making it grow much faster than linear.
Understanding how the DFT scales helps you explain why faster algorithms like FFT are important and shows your grasp of algorithm efficiency.
"What if we used a Fast Fourier Transform (FFT) algorithm instead? How would the time complexity change?"
Practice
Solution
Step 1: Understand signal domains
The time domain shows how a signal changes over time, while the frequency domain shows the signal's frequency components.Step 2: Role of DFT
DFT transforms a signal from the time domain into the frequency domain, revealing hidden frequencies.Final Answer:
Converts the signal from time domain to frequency domain -> Option AQuick Check:
DFT = Time to Frequency [OK]
- Thinking DFT amplifies signals
- Confusing DFT with noise filtering
- Assuming DFT compresses data
signal using numpy?Solution
Step 1: Identify numpy FFT function
In numpy, the function to compute the Discrete Fourier Transform isfftinside thefftmodule.Step 2: Check correct syntax
The correct call isnumpy.fft.fft(signal). Other options are either non-existent or incorrect function names.Final Answer:
numpy.fft.fft(signal) -> Option BQuick Check:
Use numpy.fft.fft() for DFT [OK]
- Using nonexistent numpy.dft() function
- Confusing module and function names
- Typing transform instead of fft
import numpy as np signal = np.array([1, 0, -1, 0]) dft_result = np.fft.fft(signal) print(np.round(dft_result, 2))
What is the output?
Solution
Step 1: Understand input signal
The signal is [1, 0, -1, 0], a simple 4-point sequence alternating positive and negative values.Step 2: Compute DFT manually or recall pattern
DFT of this sequence results in complex values showing frequency components. The output is [0.+0.j, 0.+2.j, 0.+0.j, 0.-2.j] after rounding.Final Answer:
[0.+0.j 0.+2.j 0.+0.j 0.-2.j] -> Option AQuick Check:
DFT of alternating signal = complex freq components [OK]
- Ignoring imaginary parts in output
- Confusing zero arrays with actual DFT
- Misreading numpy rounding output
import numpy as np signal = [1, 2, 3, 4] dft = np.fft.fft(signal, n=2) print(dft)
Solution
Step 1: Understand parameter n in np.fft.fft
The parameternsets the length of the DFT. If shorter than signal length, signal is truncated.Step 2: Effect of n=2 on signal length 4
Settingn=2truncates the signal from length 4 to 2, losing data and changing the DFT result unexpectedly.Final Answer:
The parameter n=2 truncates the DFT length incorrectly -> Option CQuick Check:
n parameter truncates or pads signal [OK]
- Assuming n pads signal always
- Thinking signal must be numpy array
- Believing np.fft.fft disallows n parameter
[1, 0, 1, 0, 1, 0, 1, 0]. You want to remove high-frequency noise by zeroing out the last 4 DFT coefficients and then reconstruct the signal using inverse DFT. Which Python code snippet correctly performs this?Solution
Step 1: Compute DFT of signal
Usenp.fft.fft(signal)to get frequency components.Step 2: Zero out last 4 coefficients to remove high frequencies
Since signal length is 8, last 4 coefficients aredft[4:]. Setting them to zero removes high-frequency noise.Step 3: Reconstruct signal with inverse DFT
Usenp.fft.ifft(dft).realto get cleaned time-domain signal.Final Answer:
dft = np.fft.fft(signal) dft[4:] = 0 clean_signal = np.fft.ifft(dft).real -> Option DQuick Check:
Zero last half DFT coefficients to filter high freq [OK]
- Zeroing first half instead of last half
- Zeroing wrong slice indices
- Forgetting to take real part after inverse DFT
Ready to prove it?
Pass the test and this pattern moves unknown
