📖 Scenario: You have recorded a simple signal representing sound waves over time. You want to find out the main frequencies present in this signal to understand its composition.
🎯 Goal: Build a program that computes the Discrete Fourier Transform (DFT) of a given signal and displays the frequency components.
📋 What You'll Learn
Create a list of signal values representing amplitude over time.
Set the length of the signal as a variable.
Write code to compute the DFT using the formula for each frequency component.
Print the magnitude of each frequency component.
💡 Why This Matters
🌍 Real World
DFT is used in audio processing, image analysis, and communications to find frequency components in signals.
💼 Career
Understanding DFT is essential for roles in signal processing, data analysis, and engineering fields involving time-series data.
Progress0 / 4 steps
1
Create the signal data
Create a list called signal with these exact values: 1, 0, -1, 0 representing amplitude over time.
Signal Processing
Hint
Think of the signal as a list of numbers showing how loud the sound is at each moment.
2
Set the signal length
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 points are in the signal.
3
Compute the DFT
Create an empty list called dft. Use a for loop with variable k from 0 to N-1. Inside it, create a variable sum_val set to 0. Use another for loop with variable n from 0 to N-1. Update sum_val by adding signal[n] * complex(cos(-2 * pi * k * n / N), sin(-2 * pi * k * n / N)). After the inner loop, append sum_val to dft. Use from math import cos, sin, pi at the top.
Signal Processing
Hint
Use two loops: one for each frequency k, one for each time point n. Calculate the angle and add the complex product to sum_val.
4
Print the magnitude of frequency components
Use a for loop with variable k from 0 to N-1. Inside the loop, print the string Frequency k: magnitude where magnitude is the absolute value of dft[k] using abs().
Signal Processing
Hint
Use abs() to get the size of each complex number and print it with the frequency index.
Practice
(1/5)
1. What does the Discrete Fourier Transform (DFT) primarily do to a signal?
easy
A. Converts the signal from time domain to frequency domain
B. Amplifies the signal amplitude
C. Filters out noise from the signal
D. Compresses the signal data size
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 A
Quick Check:
DFT = Time to Frequency [OK]
Hint: DFT = time to frequency conversion [OK]
Common Mistakes:
Thinking DFT amplifies signals
Confusing DFT with noise filtering
Assuming DFT compresses data
2. Which of the following is the correct Python syntax to compute the DFT of a 1D array signal using numpy?
easy
A. numpy.dft(signal)
B. numpy.fft.fft(signal)
C. numpy.fft.dft(signal)
D. numpy.fft.transform(signal)
Solution
Step 1: Identify numpy FFT function
In numpy, the function to compute the Discrete Fourier Transform is fft inside the fft module.
Step 2: Check correct syntax
The correct call is numpy.fft.fft(signal). Other options are either non-existent or incorrect function names.
Final Answer:
numpy.fft.fft(signal) -> Option B
Quick Check:
Use numpy.fft.fft() for DFT [OK]
Hint: Use numpy.fft.fft() to compute DFT [OK]
Common Mistakes:
Using nonexistent numpy.dft() function
Confusing module and function names
Typing transform instead of fft
3. Given the Python code:
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?
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: 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 A
Quick Check:
DFT of alternating signal = complex freq components [OK]
Hint: Look for imaginary parts in DFT of alternating signals [OK]
Common Mistakes:
Ignoring imaginary parts in output
Confusing zero arrays with actual DFT
Misreading numpy rounding output
4. Identify the error in this Python code snippet for computing DFT:
import numpy as np
signal = [1, 2, 3, 4]
dft = np.fft.fft(signal, n=2)
print(dft)
medium
A. np.fft.fft does not accept the parameter n
B. The signal must be a numpy array, not a list
C. The parameter n=2 truncates the DFT length incorrectly
D. The print statement syntax is incorrect
Solution
Step 1: Understand parameter n in np.fft.fft
The parameter n sets the length of the DFT. If shorter than signal length, signal is truncated.
Step 2: Effect of n=2 on signal length 4
Setting n=2 truncates 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 C
Quick Check:
n parameter truncates or pads signal [OK]
Hint: Check if n parameter matches signal length [OK]
Common Mistakes:
Assuming n pads signal always
Thinking signal must be numpy array
Believing np.fft.fft disallows n parameter
5. You have a noisy signal sampled at 8 points: [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?
hard
A. dft = np.fft.fft(signal)
dft[0:4] = 0
clean_signal = np.fft.ifft(dft).real
B. dft = np.fft.fft(signal)
dft[:4] = 0
clean_signal = np.fft.ifft(dft).real
C. dft = np.fft.fft(signal)
dft[2:] = 0
clean_signal = np.fft.ifft(dft).real
D. dft = np.fft.fft(signal)
dft[4:] = 0
clean_signal = np.fft.ifft(dft).real
Solution
Step 1: Compute DFT of signal
Use np.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 are dft[4:]. Setting them to zero removes high-frequency noise.
Step 3: Reconstruct signal with inverse DFT
Use np.fft.ifft(dft).real to get cleaned time-domain signal.