📖 Scenario: You are working with sound signals recorded from a microphone. These signals are stored as lists of numbers representing sound wave amplitudes over time. To understand the frequencies present in the sound, you will use the Fast Fourier Transform (FFT) algorithm.
🎯 Goal: Build a simple program that takes a list of sound wave amplitudes, applies the FFT algorithm to find the frequency components, and displays the result.
📋 What You'll Learn
Create a list called signal with 8 specific amplitude values.
Create a variable called n to store the length of the signal.
Write a function called fft that implements the FFT algorithm recursively.
Call the fft function with the signal and store the result in frequency_components.
Print the frequency_components list.
💡 Why This Matters
🌍 Real World
FFT is used in audio processing, image analysis, and communications to find the frequencies inside signals.
💼 Career
Understanding FFT is important for roles in data science, signal processing, and engineering where analyzing time-series data is common.
Progress0 / 4 steps
1
Create the signal data
Create a list called signal with these exact values: 0, 1, 0, -1, 0, 1, 0, -1.
Signal Processing
Hint
Use square brackets [] to create a list and separate values with commas.
2
Set the length of the signal
Create a variable called n and set it to the length of the signal list using the len() function.
Signal Processing
Hint
Use len(signal) to find how many items are in the list.
3
Write the FFT function
Write a recursive function called fft that takes a list x and returns its FFT. Use the divide-and-conquer approach: if the length of x is 1, return x. Otherwise, split x into even and odd indexed parts, recursively call fft on each, and combine the results using complex exponentials with cmath.exp. Use cmath.pi and cmath.exp for calculations.
Signal Processing
Hint
Use slicing x[0::2] for even indices and x[1::2] for odd indices. Use a for loop from 0 to n//2 to combine results.
4
Calculate and print the frequency components
Call the fft function with the signal list and store the result in a variable called frequency_components. Then print frequency_components.
Signal Processing
Hint
Use frequency_components = fft(signal) and then print(frequency_components).
Practice
(1/5)
1. What is the main purpose of the Fast Fourier Transform (FFT) algorithm in signal processing?
easy
A. To compress the signal data for storage
B. To convert a signal from time domain to frequency domain
C. To filter out noise from the signal
D. To increase the amplitude of the signal
Solution
Step 1: Understand FFT role and compare options
FFT transforms time-domain signal to frequency domain. A matches exactly; B is compression, C filtering, D amplification.
Final Answer:
To convert a signal from time domain to frequency domain -> Option B
Quick Check:
FFT = Time to Frequency conversion [OK]
Hint: FFT changes signal view from time to frequency fast [OK]
Common Mistakes:
Confusing FFT with noise filtering
Thinking FFT compresses data
Assuming FFT amplifies signals
2. Which of the following is the correct way to import the FFT function from NumPy in Python?
easy
A. from numpy import fft
B. import numpy.fft as fft
C. import fft from numpy
D. from numpy.fft import fft
Solution
Step 1: Recall and match Python import syntax
Correct for specific function: 'from numpy.fft import fft' (C). A imports submodule, B aliases submodule (requires fft.fft()), D invalid.
Final Answer:
from numpy.fft import fft -> Option D
Quick Check:
Correct import syntax = from numpy.fft import fft [OK]
Hint: Use 'from module import function' to import FFT [OK]
Common Mistakes:
Using 'import fft from numpy' which is invalid syntax
Importing whole numpy.fft as fft causing confusion
Trying 'from numpy import fft' which imports the module, not function
3. Given the Python code:
import numpy as np
signal = np.array([1, 0, -1, 0])
fft_result = np.fft.fft(signal)
print(np.round(fft_result, 2))
What is the output?
medium
A. [0.+0.j 0.+2.j 0.+0.j 0.-2.j]
B. [0.+0.j 0.+0.j 0.+0.j 0.+0.j]
C. [0.+0.j 2.+0.j 0.+0.j 2.+0.j]
D. [0.+0.j 1.+0.j 0.+0.j 1.+0.j]
Solution
Step 1: Compute and verify FFT output
np.fft.fft([1,0,-1,0]) corresponds to a sine wave component, resulting in imaginary parts at k=1 and k=3. The output is [0.+0.j 0.+2.j 0.+0.j 0.-2.j], matching [0.+0.j 0.+2.j 0.+0.j 0.-2.j].
Final Answer:
[0.+0.j 0.+2.j 0.+0.j 0.-2.j] -> Option A
Quick Check:
FFT sine wave = imaginary components at k=1,3 [OK]
Confusing cosine signal with sine (imaginary output)
Confusing zeros with non-zero frequency components
Rounding incorrectly or not at all
4. Consider this Python code snippet:
import numpy as np
signal = [1, 2, 3, 4]
fft_result = fft(signal)
print(fft_result.real)
It raises an error. What is the most likely cause?
medium
A. signal should be a NumPy array, not a list
B. np.fft.fft does not have a real attribute
C. Missing import statement for fft
D. print statement syntax is incorrect
Solution
Step 1: Trace code execution for error
fft(signal) raises NameError: 'fft' undefined. Import is numpy as np (use np.fft.fft); no direct fft import (e.g., from numpy.fft import fft). A, B, D unrelated.
Final Answer:
Missing import statement for fft -> Option C
Quick Check:
Undefined fft = missing import [OK]
Hint: Import fft properly: from numpy.fft import fft [OK]
Common Mistakes:
Not importing the fft function when using fft()
Thinking .real is invalid on FFT output
Confusing print syntax errors
5. You have a noisy signal sampled at 1000 Hz stored in a NumPy array data. You want to remove frequencies above 100 Hz using FFT. Which approach correctly achieves this?
hard
A. Compute FFT, zero out components with frequency > 100 Hz, then inverse FFT
B. Compute FFT, keep only first 100 components, then inverse FFT
C. Apply FFT and multiply all values by 0.1 to reduce noise
D. Use FFT to find max frequency and subtract it from signal
Solution
Step 1: Outline correct FFT low-pass filtering
FFT to freq domain (use fftfreq for bins), zero coeffs where |freq| > 100 (fs=1000, cutoff index ~100/500=0.2*N), ifft back. Matches B precisely; A ignores freq mapping, C/D ineffective.
Final Answer:
Compute FFT, zero out components with frequency > 100 Hz, then inverse FFT -> Option A
Quick Check:
Zero high freq + ifft = low-pass filter [OK]
Hint: Zero unwanted FFT frequencies, then inverse transform [OK]
Common Mistakes:
Confusing component count with frequency
Scaling FFT values instead of zeroing
Misusing FFT to subtract frequencies directly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.