
Learn signal processing and image processing fundamentals and master Python-based implementation from scratch, moving from theory and intuition to advanced techniques with numerical examples.
Learn to adjust the lecture pace from moderate to higher or lower speeds, using a simple control, with a test video demonstration, and explore outcomes, events, and coin-flip random experiments.
Explore a Python crash course focused on essential modules for implementing signal processing techniques, covering basics of programming and fundamental knowledge to program in Python.
Install Python using the Anaconda individual edition by downloading the exe and completing the setup. Launch Anaconda Navigator and open Jupyter Notebook to begin coding for this course.
Install essential python packages, including matplotlib, numpy, scipy, and pandas, using the Anaconda prompt with guided conda install steps and prompt confirmations.
Learn how to use Jupyter Notebook for Python coding, create and rename notebooks, run cells with run or shift+enter, and manage code with variables, comments, markdown headings, and kernel controls.
Python acts as a calculator, performing addition, subtraction, multiplication, and division. Learn to compute exponents, square roots, and modulo operations, and apply parentheses within the Bodmas order of operations.
Assign values like a = 3 and b = 4 to perform arithmetic and powers, show single-point updates, and learn comparison and logical operators such as and or.
Explore Python conditional statements using if, else, and elif, with and/or logic and comparisons, illustrated through practical examples and variable-based outcomes.
Import numpy and create one-dimensional and two-dimensional arrays, inspect shapes and data types, and find max, min values and their indices in Python.
Explore numpy arrays with arange and linspace to generate 1d and 2d arrays, understand upper bound exclusion, inclusive bounds, and reshape rules preserving element counts.
Generate zeros, ones, and identity matrices with numpy, and create random numbers from normal and uniform distributions. Index and slice 1D and 2D arrays, extract submatrices and end elements, reshape.
Learn to plot and visualize data with matplotlib.pyplot and NumPy, generating x and y with linspace, and customizing plots with color, size, labels, legends, and titles.
Plot a sine wave with numpy and matplotlib, then set axis limits, ticks, and labels. Customize style, grids, markers, and legend for a clearer visualization.
Create and arrange subplots using NumPy and Matplotlib, building 2x2 layouts with even spacing. Compare continuous sine waves and discrete samples via plot and stem.
Plot and visualize with Matplotlib by applying rc parameters to globally set line width, line style, and figure size across subplots and sine waves.
Explore lists in Python, including creating lists with brackets, and storing heterogeneous elements. Learn to index, slice, append, pop, reverse, and sort, and build nested lists and matrices.
Explore for loops in Python using range, indentation, and if conditions to print sequences, generate even/odd numbers, filter by divisibility, build lists with append, and sum numbers.
Explore nested for loops in Python to drive outer and inner iterations, build and populate matrices and boards, and generate patterns with conditional logic and numpy placeholders.
Explore fundamentals of signal processing, including analog-to-digital conversion, continuous-time and discrete-time signals, and sampling. Apply Nyquist sampling theorem to understand reconstruction of signals from discrete samples.
Explore the basics of signal processing, including manipulating signals, converting between time and frequency domains, and processing continuous signals with analog to digital and digital to analog conversions.
Explore how analog signals become digital via sampling, quantization, and coding in an analog-to-digital converter, producing discrete time, quantized, and digital signals.
Perform analog-to-digital conversion in Python by sampling a 0.85^T analog signal, then quantizing to defined levels and visualizing discrete and quantized signals with NumPy and Matplotlib.
this lecture covers coding the quantized signal to a digital signal, using at least a four bit coder for eleven levels from 0 to 1, after sampling and quantization.
Explore fundamental continuous time signals, including unit impulse, time-shifted impulses, unit step, ramp, sinusoidal waves, and unit exponential decay, with emphasis on time shifting and analytical treatment.
Learn to generate and plot continuous time signals in Python, including unit impulse, unit step, ramp, sine, and exponential signals, using numpy, scipy, and matplotlib, with time shifts.
Discover fundamental discrete time signals—unit impulse, unit step, unit ramp, sinusoidal samples, and unit exponential—and master time shifting via delay and advancement.
Generate and plot discrete time signals in Python using NumPy, Matplotlib, and SciPy, including unit impulse, unit step, time delay and advance, and discrete sine and exponential signals.
Learn to sample a continuous signal into discrete form and reconstruct it to recover information, using Nyquist to set the frequency at least twice the maximum—five times yields better reconstruction.
Demonstrate sampling and reconstruction in Python with a 20 Hz sine, show failure below Nyquist, and success at 50 Hz and 100 Hz, including a two-sine example.
Explore the convolution concept, its equation and calculation steps, then apply convolution to denoise signals, detect edges, and learn the convolution theorem using Python.
Represent discrete time signals with sequential and graphical methods, and derive the convolution sum using flipping and shifting of the kernel x2, with x1 as the signal.
Demonstrates a step-by-step numerical convolution on two discrete-time signals x1 and x2, flipping the kernel, shifting, multiplying, and summing to produce the output sequence.
Demonstrate full mode convolution in signal processing, deriving an output length of seven from a five-sample x1 and three-sample x2, and introduce same mode as a follow-up before Python implementation.
Learn to implement full-mode convolution in Python by flipping the kernel, applying zero-padding to the input, and performing shifting, multiplication, and summation with numpy and matplotlib.
Learn to perform full and same mode convolution in Python using NumPy convolve, comparing it with a for-loop implementation. Explore flipping, shifting, multiplication, and addition, and visualize identical results.
Denoise a noisy sinusoidal signal by convolving it with a 50-point moving average kernel, achieving about 70–80% noise reduction while preserving the signal pattern.
Explore edge detection through convolution by applying a zero-sum edge detector kernel to a signal with edges, producing smooth transitions and revealing edge locations.
Explore the convolution theorem, showing how time-domain convolution equals frequency-domain pointwise multiplication, demonstrated with Python using NumPy, SciPy FFT, and inverse FFT to compare results.
Explore signal denoising using three filters: moving average, Gaussian mean, and median filters to recover the signal from noise. Compare linear and non-linear approaches and applications to spiky noise.
Learn how moving average filters denoise signals by averaging neighboring samples, exploring symmetric and non-symmetric implementations, and how filter order and length influence smoothing and edge effects in signal processing.
Implement a moving average filter in Python to denoise a noisy sinusoidal signal. Generate noise, apply a 61-sample window (order 30), and explore edge effects.
Design and apply a Gaussian mean filter to denoise signals with a kernel derived from full width at half maximum, using zero padding to fix edge effects.
Learn to implement a Gaussian mean filter in Python. Build and normalize the kernel, apply zero padding to avoid edge effects, and convolve to filter a noisy signal.
Explore the median filter as a nonlinear denoising tool. It replaces each point with the median of neighbors, using odd or even window lengths and sorted data.
Apply a median filter in Python to denoise a noisy 2 Hz signal sampled at 256 Hz, using NumPy and Matplotlib, and compare with mean filter while noting edge effects.
Apply the non-linear median filter to remove spiky noise and recover signals, using threshold settings to denoise and implement the method in Python.
Remove spikes from a signal with a median filter in Python; read spike.csv with pandas, convert to numpy, set a 50 threshold, and locate spikes with numpy.where.
Apply a median filter to remove spiky noise from a 2D signal, using a 50 threshold to identify spikes and filter only spike regions for signal recovery.
Define complex numbers as the sum of real and imaginary parts, using Python's j to denote the imaginary unit and plotting them on the real–imaginary plane.
Learn to create complex numbers in Python with NumPy and Matplotlib, extract real and imaginary parts via np.real and np.imag, and visualize them on the complex plane.
Learn to perform addition, subtraction, and multiplication of complex numbers by combining real and imaginary parts, and apply j^2 = -1 to obtain the final result -1 + 31 j.
Multiply the numerator and denominator by the complex conjugate of the denominator, use a^2 minus b^2 to simplify, and extract the real and imaginary parts to complete the division.
Explore complex number operations in Python, including addition, subtraction, multiplication, and division, with numpy for complex conjugates, and verify results align with manual theory.
Calculate the magnitude and phase of a complex number using sqrt(a^2+b^2) and arctan(b/a), illustrating with 5+6 to yield 7.81 and 50.19 degrees, with Python in the next video.
Learn to compute the magnitude and phase of a complex number in Python, using numpy for the angle and converting from radians to degrees, with 5+6i as an example.
Generate a complex sine wave from a complex exponent, using theta = two pi f t plus phi, showing real and imaginary parts for signal processing in Python.
Generate a complex sine wave in Python using numpy and matplotlib, from 0 to 10 s, plotting real and imaginary parts while exploring theta and 90-degree phase differences.
Explore the frequency concept, build waves from sine, cosine, and dc components, and learn the Fourier transform in Python, including multiplex signals, amplitude and power spectra, and the inverse transform.
Learn how the Fourier transform converts time-domain signals to frequency-domain representations, model signals with sine and cosine waves, and build complex waves with DC components in Python.
Generate sine waves in Python, combine them into complex waves using sine, cosine, and a DC component, and visualize the results to prepare for Fourier transform analysis.
Learn the mechanism of the Fourier transform by modeling a multiplex signal with sine waves and dot products, reveal frequencies, address symmetry, and convert indices to frequencies with amplitude correction.
Master step-by-step coding of the Fourier transform in Python, generating sinusoidal signals with complex sine waves, applying amplitude corrections, and converting indices to hertz using Nyquist.
Master the fast Fourier transform (FFT) in scipy to compute the Fourier transform efficiently, avoiding lengthy for-loops, while handling amplitude normalization and Nyquist frequency for a multiplex signal.
Learn to compute the Fourier transform of a multiplex signal containing sine, cosine and a DC component using FFT, with proper amplitude correction and frequency unit conversion up to Nyquist.
Learn to compute the amplitude and power spectrum of a signal in Python using the Fourier transform, demonstrated with a 2, 4, 6 Hz multiplex.
Demonstrate generating a sinusoidal signal, compute its Fourier transform with FFT, then apply the inverse Fourier transform to recover the original time-domain signal, illustrating the lossless nature of the transform.
Demonstrate how the Fourier transform interprets stationary versus amplitude-wise non-stationary signals, using two-second windows to show how amplitude and frequency affect energy distribution and interpretability.
The lecture demonstrates how the Fourier transform accurately interprets stationary signals in Python, while non-stationary signals produce ambiguous frequency representations, illustrating their energy spread around the target frequency.
Explore digital filtering in signal processing, cover design steps, zero shift filters to avoid phase shift, and implement low pass, high pass, band pass, and band stop filters in Python.
Discover why digital filters enable signal separation and restoration using spectrally separable frequency content. Compare finite and infinite impulse response filters, focusing on convolution and stability.
Master the steps of designing fir filters, including frequency domain shapes, cutoffs, transition width, and window or least squares methods for low pass, high pass, band pass, and band stop.
Design a fir filter with the least squares method by defining cutoffs, transition width, and an integer, odd order; build the time-domain kernel and evaluate its frequency response against target.
Design a fir filter with the window method in four steps: define frequency-domain shape and cutoff; generate the time-domain filter; evaluate its frequency response; adjust the order to match.
Explore how to design a zero shift FIR filter using a low pass prototype, covering signal generation, frequency-domain shaping, and applying linear vs zero-shift filtering to avoid phase delay.
Design a low pass FIR filter using least squares to remove noise, with a 20 Hz cutoff at a 1024 Hz sampling rate, then validate the frequency response and denoise.
Design and implement a low pass filter in python to remove noise from a sinusoidal signal with a least-squares kernel, 20 hz cutoff, transition width 0.15, and zero phase shift.
Design and apply a high pass filter by defining the frequency-domain shape with cutoff frequency and transition width, constructing the time-domain kernel, and observing its Fourier transform.
Learn to design and apply a high pass filter in Python using a least square method, analyze its frequency response, and remove low-frequency content from a noisy signal.
Design a bandpass FIR filter by defining a six-point frequency shape with 30 and 50 Hz cutoffs, then apply the least-squares kernel to a signal.
Design and apply a bandpass FIR filter in Python to isolate 30 and 50 Hz signals. Analyze time and frequency effects and tune order and transition width for smoother results.
Design low pass, high pass, and band pass filters using the window method, and design a band stop filter with both window and least squares methods to practice filter design.
Design filters with the Butterworth method, following five design steps, and build low-pass, high-pass, and bandpass filters. Compare IIR and FIR stability.
Investigate infinite impulse response filters, their recursive design and instability, and apply a Butterworth workflow to define parameters, generate coefficients, determine impulse responses, and evaluate in the frequency domain.
Design a bandpass butterworth iir filter in python using numpy and scipy, generate coefficients with signal.butter, and derive the impulse and frequency responses to compare with the desired shape.
Design a Butterworth low pass filter with cutoff 30 Hz and order 11, then apply it to a noisy signal and evaluate impulse and frequency responses to remove high-frequency noise.
Design a high pass Butterworth filter (order 11, cutoff 30 Hz) for a 50 Hz signal with noise, and analyze impulse response and spectrum.
Design a Butterworth bandpass filter to isolate a 30–40 Hz band from a noisy signal, and evaluate its impulse response and frequency-domain performance.
Compare fir and iir filters: firs have finite impulse response and non-recursive stability, while iirs have infinite impulse response and recursive, data-dependent stability; firs offer higher design flexibility.
Design a band stop filter using the Butterworth method, reusing the same parameters and signals used for the band pass filter. Post questions in the section if you need help.
Explore Google Colab for running Python code, either from scratch or a Jupyter notebook, with a Gmail account, 15 GB free space, preinstalled libraries, and free CPU and GPU access.
Master Google Colab basics by mounting Drive, uploading files, and setting the path to run notebooks. Add code and text cells and load datasets with pandas and matplotlib.
Learn to run code in Google Colab with a CPU runtime, import key libraries, and access the iris dataset from seaborn without mounting drives, including basic plots and species.
Learn how to read your dataset in Python coding in Colab without mounting drive, upload datasets, check runtime, import libraries, and inspect data shapes and samples.
This course will bridge the gap between the theory and implementation of Signal and Image Processing Algorithms and their implementation in Python. All the lecture slides and python codes are provided.
Why Signal Processing?
Since the availability of digital computers in the 1970s, digital signal processing has found its way in all sections of engineering and sciences.
Signal processing is the manipulation of the basic nature of a signal to get the desired shaping of the signal at the output. It is concerned with the representation of signals by a sequence of numbers or symbols and the processing of these signals.
Following areas of sciences and engineering are specially benefitted by rapid growth and advancement in signal processing techniques.
1. Machine Learning.
2. Data Analysis.
3. Computer Vision.
4. Image Processing
5. Communication Systems.
6. Power Electronics.
7. Probability and Statistics.
8. Time Series Analysis.
9. Finance
10. Decision Theory
Why Image Processing?
Image Processing has found its applications in numerous fields of Engineering and Sciences.
Few of them are the following.
1. Deep Learning
2. Computer Vision
3. Medical Imaging
4. Radar Engineering
5. Robotics
6. Computer Graphics
7. Face detection
8. Remote Sensing
9. Agriculture and food industry
Course Outline
Section 01: Introduction of the course
Section 02: Python crash course
Section 03: Fundamentals of Signal Processing
Section 04: Convolution
Section 05: Signal Denoising
Section 06: Complex Numbers
Section 07: Fourier Transform
Section 08: FIR Filter Design
Section 09: IIR Filter Design
Section 10: Introduction to Google Colab
Section 11: Wavelet Transform of a Signal
Section 12: Fundamentals of Image Processing
Section 13: Fundamentals of Image Processing With NumPy and Matplotlib
Section 14: Fundamentals of Image Processing with OpenCV
Section 15: Arithmetic and Logic Operations with Images
Section 16: Geometric Operations with Images
Section 17: Point Level OR Gray level Transformation
Section 18: Histogram Processing
Section 19: Spatial Domain Filtering
Section 20: Frequency Domain Filtering
Section 21: Morphological Processing
Section 22: Wavelet Transform of Images