📖 Scenario: Imagine you are working on a communication system that sends sound signals. To send the sound digitally, you need to sample the continuous sound wave at certain points in time and then reconstruct it back to a smooth wave at the receiver.This project will help you understand how sampling and reconstruction work using simple data science techniques.
🎯 Goal: You will create a simple signal, sample it at a fixed rate, reconstruct the signal using interpolation, and then display the original and reconstructed signals to see how well the process works.
📋 What You'll Learn
Create a continuous signal using a mathematical function
Define a sampling rate to pick points from the signal
Use interpolation to reconstruct the signal from samples
Plot the original and reconstructed signals for comparison
💡 Why This Matters
🌍 Real World
Sampling and reconstruction are key steps in converting real-world signals like sound and images into digital form and back, used in phones, radios, and streaming.
💼 Career
Understanding these concepts is important for roles in signal processing, telecommunications, audio engineering, and data science involving time series data.
Progress0 / 4 steps
1
Create the continuous signal
Create a variable called time_continuous that holds 1000 points evenly spaced between 0 and 1 seconds using np.linspace(0, 1, 1000). Then create a variable called signal_continuous that is a sine wave with frequency 5 Hz using np.sin(2 * np.pi * 5 * time_continuous).
Signal Processing
Hint
Use np.linspace to create the time points and np.sin with the formula for a sine wave.
2
Define the sampling rate and sample the signal
Create a variable called sampling_rate and set it to 20. Then create a variable called time_samples that holds points from 0 to 1 seconds spaced by 1 / sampling_rate. Finally, create signal_samples by sampling signal_continuous at the indices corresponding to time_samples.
Signal Processing
Hint
Use np.arange to create sample times and sample the sine wave at those times.
3
Reconstruct the signal using interpolation
Import interp1d from scipy.interpolate. Create an interpolation function called reconstruct_func using interp1d(time_samples, signal_samples, kind='linear'). Then create signal_reconstructed by applying reconstruct_func to time_continuous.
Signal Processing
Hint
Use linear interpolation to reconstruct the signal from samples.
4
Plot the original and reconstructed signals
Import matplotlib.pyplot as plt. Plot time_continuous vs signal_continuous with label 'Original Signal'. Plot time_continuous vs signal_reconstructed with label 'Reconstructed Signal' using a dashed line. Add a legend and show the plot.
Signal Processing
Hint
Use plt.plot to draw both signals and plt.legend() to show labels.
Practice
(1/5)
1. What is the main purpose of sampling in communication systems?
easy
A. To convert a continuous signal into discrete values
B. To amplify the signal strength
C. To filter out noise from the signal
D. To encrypt the signal for security
Solution
Step 1: Understand the role of sampling
Sampling takes a continuous-time signal and measures its amplitude at discrete time intervals.
Step 2: Identify the purpose in communication
This process allows the signal to be represented digitally for processing and transmission.
Final Answer:
To convert a continuous signal into discrete values -> Option A
Quick Check:
Sampling = Continuous to discrete conversion [OK]
Hint: Sampling means turning smooth signals into numbers [OK]
Common Mistakes:
Confusing sampling with filtering
Thinking sampling increases signal strength
Mixing sampling with encryption
2. Which of the following is the correct Nyquist sampling rate formula for a signal with maximum frequency f_max?
easy
A. f_s > f_max / 2
B. f_s > 2 * f_max
C. f_s = f_max
D. f_s < f_max / 2
Solution
Step 1: Recall Nyquist theorem
The Nyquist rate states the sampling frequency must be greater than twice the highest frequency in the signal.
Step 2: Apply to formula
So, f_s > 2 * f_max ensures no loss of information during sampling.
Final Answer:
f_s > 2 * f_max -> Option B
Quick Check:
Nyquist rate = 2 * max frequency [OK]
Hint: Sample faster than twice the highest frequency [OK]
Common Mistakes:
Using sampling rate less than max frequency
Confusing less than and greater than signs
Ignoring the factor of 2 in Nyquist rate
3. Given a continuous signal with maximum frequency 3 kHz, what is the minimum sampling frequency to avoid aliasing? Choose the correct Python code output.
f_max = 3000
f_s = 2 * f_max
print(f_s)
medium
A. 6000
B. 1500
C. 3000
D. 9000
Solution
Step 1: Calculate minimum sampling frequency
Using Nyquist, minimum sampling frequency is twice the max frequency: 2 * 3000 = 6000 Hz.
Step 2: Check Python code output
The code multiplies 3000 by 2 and prints 6000, matching the calculation.
Final Answer:
6000 -> Option A
Quick Check:
2 * 3000 = 6000 [OK]
Hint: Double the max frequency to get sampling rate [OK]
Common Mistakes:
Printing max frequency instead of double
Dividing instead of multiplying
Confusing units (Hz vs kHz)
4. Identify the error in the following Python code snippet for reconstructing a signal using sinc interpolation:
import numpy as np
def reconstruct_signal(samples, t, T):
x_recon = 0
for n in range(len(samples)):
x_recon += samples[n] * np.sinc((t - n*T))
return x_recon
# samples = [1, 2, 3], t = 1.5, T = 1
print(reconstruct_signal([1, 2, 3], 1.5, 1))
medium
A. np.sinc argument should be normalized by pi
B. Loop should iterate over t values, not samples
C. x_recon should be initialized as an array, not zero
D. The function should return samples instead of x_recon
Solution
Step 1: Understand np.sinc function
In numpy, np.sinc(x) = sin(pi*x)/(pi*x), so input is already normalized by pi.
Step 2: Check argument passed to np.sinc
The code passes (t - n*T) directly, which is correct because np.sinc expects normalized input.
Step 3: Identify error
Actually, the argument is correct; the error is that x_recon is initialized as 0 (a scalar), but the function expects to handle array inputs for t for vectorized reconstruction.
Step 4: Correct error
x_recon should be initialized as np.zeros_like(t) if t is an array, but since t is scalar here, initialization is fine.
Step 5: Reconsider options
np.sinc argument should be normalized by pi says argument should be normalized by pi, but numpy's sinc already does that, so no need to normalize.
Step 6: Final conclusion
No error in normalization; the code is correct for scalar t. The main issue is if t is array, initialization fails.
Final Answer:
x_recon should be initialized as an array, not zero -> Option C
Quick Check:
Accumulator initialization must match output type [OK]
Hint: Remember numpy sinc is normalized by pi already [OK]
Common Mistakes:
Assuming np.sinc needs manual pi normalization
Initializing accumulator incorrectly for arrays
Confusing loop variable roles
5. You have a signal sampled at 8 kHz with maximum frequency 5 kHz. What problem will occur during reconstruction, and how can it be fixed?
hard
A. Signal will be noisy; fix by applying a low-pass filter after sampling
B. Signal will be delayed; fix by adjusting reconstruction timing
C. No problem; sampling rate is sufficient for reconstruction
D. Aliasing will occur; fix by increasing sampling rate above 10 kHz
Solution
Step 1: Compare sampling rate and Nyquist rate
Nyquist rate = 2 * max frequency = 2 * 5 kHz = 10 kHz. Sampling rate is 8 kHz, which is less than Nyquist rate.
Step 2: Identify consequence of insufficient sampling
Sampling below Nyquist rate causes aliasing, where higher frequencies appear as lower frequencies, distorting the signal.
Step 3: Determine solution
To avoid aliasing, increase sampling rate above 10 kHz.
Final Answer:
Aliasing will occur; fix by increasing sampling rate above 10 kHz -> Option D
Quick Check:
Sampling rate < Nyquist rate causes aliasing [OK]
Hint: Sample above twice max frequency to avoid aliasing [OK]
Common Mistakes:
Assuming 8 kHz is enough for 5 kHz max frequency
Confusing noise with aliasing
Ignoring Nyquist sampling theorem
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.