Bird
Raised Fist0
Signal Processingdata~7 mins

Discrete Fourier Transform (DFT) in Signal Processing

Choose your learning style10 modes available
Introduction

The Discrete Fourier Transform (DFT) helps us find the different frequencies inside a signal. It changes a signal from time view to frequency view so we can understand its hidden patterns.

When you want to find the main tones in a music clip.
To analyze vibrations in machines to detect problems early.
When studying how heartbeats change over time in medical data.
To compress images or sounds by focusing on important frequencies.
When filtering noise out of a recorded sound.
Syntax
Signal Processing
X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-i 2 \pi k n / N}  \text{ for } k = 0, 1, ..., N-1

x[n] is the input signal at time n.

X[k] is the output frequency component at index k.

Examples
This example shows a simple signal with one value 1 and the rest 0. The DFT will find its frequency components.
Signal Processing
import numpy as np
x = [1, 0, 0, 0]
N = 4
X = [sum(x[n] * np.exp(-2j * np.pi * k * n / N) for n in range(N)) for k in range(N)]
Using numpy's fft function to quickly compute the DFT of a signal.
Signal Processing
import numpy as np
x = np.array([1, 2, 3, 4])
X = np.fft.fft(x)
Sample Program

This program creates a signal made of two sine waves at 5 Hz and 20 Hz. It calculates the DFT to find these frequencies and prints the main ones. Then it shows a graph of the frequency strengths.

Signal Processing
import numpy as np
import matplotlib.pyplot as plt

# Create a simple signal: sum of two sine waves
fs = 100  # sampling frequency
T = 1     # seconds
N = fs * T  # total samples

t = np.linspace(0, T, N, endpoint=False)
# Signal with 5 Hz and 20 Hz frequencies
x = 0.7 * np.sin(2 * np.pi * 5 * t) + 0.3 * np.sin(2 * np.pi * 20 * t)

# Compute DFT using numpy fft
X = np.fft.fft(x)

# Frequency bins
freqs = np.fft.fftfreq(N, 1/fs)

# Take only positive frequencies and their magnitudes
pos_mask = freqs >= 0
freqs = freqs[pos_mask]
magnitudes = np.abs(X[pos_mask])

# Print main frequency components
for f, mag in zip(freqs, magnitudes):
    if mag > 10:
        print(f"Frequency: {f:.1f} Hz, Magnitude: {mag:.2f}")

# Plot the magnitude spectrum
plt.stem(freqs, magnitudes, use_line_collection=True)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('DFT Magnitude Spectrum')
plt.show()
OutputSuccess
Important Notes

The DFT output is complex numbers; magnitude shows strength, and angle shows phase.

DFT assumes the signal repeats, so edges can cause artifacts called spectral leakage.

For faster calculations on large data, use Fast Fourier Transform (FFT) algorithms.

Summary

DFT changes a signal from time to frequency view.

It helps find hidden frequencies in data like sound or vibrations.

Use libraries like numpy to compute DFT easily and visualize results.

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

  1. 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.
  2. Step 2: Role of DFT

    DFT transforms a signal from the time domain into the frequency domain, revealing hidden frequencies.
  3. Final Answer:

    Converts the signal from time domain to frequency domain -> Option A
  4. 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

  1. Step 1: Identify numpy FFT function

    In numpy, the function to compute the Discrete Fourier Transform is fft inside the fft module.
  2. Step 2: Check correct syntax

    The correct call is numpy.fft.fft(signal). Other options are either non-existent or incorrect function names.
  3. Final Answer:

    numpy.fft.fft(signal) -> Option B
  4. 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

  1. Step 1: Understand input signal

    The signal is [1, 0, -1, 0], a simple 4-point sequence alternating positive and negative values.
  2. 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.
  3. Final Answer:

    [0.+0.j 0.+2.j 0.+0.j 0.-2.j] -> Option A
  4. 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

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

    The parameter n=2 truncates the DFT length incorrectly -> Option C
  4. 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

  1. Step 1: Compute DFT of signal

    Use np.fft.fft(signal) to get frequency components.
  2. 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.
  3. Step 3: Reconstruct signal with inverse DFT

    Use np.fft.ifft(dft).real to get cleaned time-domain signal.
  4. Final Answer:

    dft = np.fft.fft(signal) dft[4:] = 0 clean_signal = np.fft.ifft(dft).real -> Option D
  5. Quick Check:

    Zero last half DFT coefficients to filter high freq [OK]
Hint: Zero last half DFT coefficients to remove high frequencies [OK]
Common Mistakes:
  • Zeroing first half instead of last half
  • Zeroing wrong slice indices
  • Forgetting to take real part after inverse DFT
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