
Master practical digital signal processing in Java, covering deconvolution, DFT/IDFT, FIR and IIR design, windowing, and robust, readable code across architectures.
Download and install the Java Development Kit (JDK) and the IDE, accept the license, install the 64-bit Windows version, and verify with java -version.
Link Java JDK with the IDE, create a new Java project in IntelliJ, configure JDK 11, run hello world, and customize editor font size and dark theme.
Download gnuplot to plot signals for Java digital signal processing, learn to install the 64 bit or 32 bit version from SourceForge, and verify results by plotting functions.
plot signals with gnuplot by writing algorithm output to a file and visualizing input signals, impulse responses, and convolution, including line styles and colors for clear dsp plots.
Plot multiple signals in the same window by configuring quadrants and origin, then compare input, impulse response, and output signals using convolution, DFT, and a six kilohertz low-pass filter.
Explore how statistics and probability underpin signal characterization in DSP, distinguishing continuous signals from discrete digitized signals via analog to digital conversion. Understand signal axes, domains, and sample numbering concepts.
We define the mean as the average of signal amplitudes across samples. We compute standard deviation by squaring deviations, averaging, then square-rooting to measure fluctuating power.
Define the signal-to-noise ratio as the mean over the standard deviation, or the mean over standard deviation times 100, with the coefficient of variation noted as another measure.
Develop a Java dsp signal mean algorithm by building a project, implementing a mean function, and testing with a sine wave using a signals class.
Develop the signal variance algorithm by adding a method that uses the input signal, its mean, and length to compute variance, and rename, build, and run to verify.
Develop the signal standard deviation algorithm in Java by computing the mean and variance, then applying the square root to obtain the standard deviation.
Combine three signal statistical algorithms into the signal statistics class to compute the mean, variance, and standard deviation of a test input signal, with refactoring and usage details.
Learn to implement a robust signal mean algorithm in Java using block-based, loop-unrolled techniques for fast, memory-aware DSP on embedded systems.
Develop a robust signal variance algorithm in Java DSP that processes signals in blocks, computes the mean, and accelerates variance calculation for long signals and embedded microcontrollers.
Develop a robust, faster signal standard deviation (SDD) algorithm in Java, using a block-based approach to compute sum of squares and square of sum for variance.
Develop a robust RMS algorithm in Java to compute the RMS of an input signal using block processing of four samples and the square root of the mean of squares.
Develop and implement a robust signal minimum algorithm for Java digital signal processing, iterating over input blocks to find the minimum value and its index.
Learn how continuous signals are digitized into discrete data using analog-to-digital converters with sample-and-hold and quantizers, and how digital-to-analog converters reproduce analog forms.
Apply the Nyquist theorem to sample analog signals, using anti-alias filtering before ADC and accurate reconstruction to avoid aliasing in digital signal processing.
Design a passive rc low-pass filter from resistors and capacitors, set its cutoff frequency by resistor and capacitor values, and examine the transfer function.
swap the positions of resistor and capacitor to create a passive high-pass filter; high frequencies pass, low frequencies are attenuated, using f_c = 1/(2πRC) for calculation.
Explore the modified Sallen-Key low-pass filter by combining active op-amp and passive rc elements to achieve a brick-wall like passband with cascaded stages and pole configurations.
Explore how Bessel, Chebyshev, and Butterworth filters optimize different performance parameters, and build multi-stage filters by selecting K-1 and K-2 values to set the R and RF values.
Compare the frequency responses of Chebyshev, Butterworth, and Bessel filters, noting Chebyshev's closest to a brick wall response and Bessel's superior step response for suitable applications.
Explore how information is encoded in time-domain and frequency-domain signals, and how digitization uses anti-aliasing filters; study how sinusoidal components and waveform shapes carry ecg-relevant information.
Explore system homogeneity in DSP, showing that scaling the input scales the output by the same factor, illustrated with a resistor and Ohm's law.
Explore system additivity, where a signal through the system yields the sum of outputs: if x1 and x2 produce y1 and y2, then x1 plus x2 yields y1 plus y2.
Understand shift invariance: shifting the input yields the same shift in output; test with sinusoidal fidelity, where a sine input yields sine output at the same frequency in linear systems.
Explore impulse decomposition, which breaks a signal into component signals where each component contains one nonzero sample with zeros elsewhere, enabling impulse responses and convolution.
Explore step decomposition in Java digital signal processing, breaking signals into thin components with zero-leading samples and constant tails, and how it characterizes signals by sample differences and system responses.
Explore convolution in DSP by examining how input signals, impulse responses, and outputs relate through decomposition, superposition, and the delta function.
Explore how a delta function, the unit impulse, yields a system's impulse response, and how any input can be represented as shifted, scaled deltas using homogeneity and shift invariance.
Learn how convolution derives an output signal from an input by decomposing the input into impulses, scaling and shifting the impulse response, and summing the results.
The lecture demonstrates convolution of a four-point input signal with a nine-point impulse response, yielding a consistent output and proving that convolution is commutative.
Analyze how a single output sample y of six is influenced by multiple shifted impulse responses and input samples, and apply the convolution sum equation and the deconvolution sum.
Develops a convolution algorithm to combine an input signal with an impulse response, using calculations and loops. Tests plotting outputs using a Matlab-generated six kilohertz low pass impulse response.
Explore the identity property of convolution by examining the delta function as the impulse response, showing how convolving with delta preserves or shifts signals and scales with k.
Learn the running sum and first difference as discrete analogues of integration and differentiation, and how discrete convolution supports difference equations in digital filters and infinite impulse response design.
Develop a running sum algorithm in Java for digital signal processing, converting an input signal to an output signal and illustrating testing, plotting, and smoothing applications.
Develop the first difference algorithm and compare its output with the running sum, then plot input signals and differences to illustrate its role and applications in Java DSP.
Explore how Fourier analysis decomposes signals into sinusoids, focusing on the discrete Fourier transform for digitized signals and on the Fourier series and Fourier transform for periodic and continuous signals.
Explore how the discrete Fourier transform converts a time-domain signal into frequency-domain components, revealing sine-wave amplitudes and the role of real and complex representations.
Explore dft basis functions, using cosine and sine waves to represent frequency domain amplitudes and synthesize time-domain signals; the frequency parameter k equals the number of cycles.
Deduce the inverse DFT from the synthesis equation by reconstructing a time-domain signal as a sum of cosine and sine basis waves weighted by X(k) and X(-k).
Implement the discrete Fourier transform in Java, converting a time-domain signal to its frequency-domain real and imaginary parts and magnitude; test with 1 khz and 15 khz signals.
Develop the inverse dft algorithm from real and imaginary parts of the frequency domain signal to recover the time-domain signal, then test with a dft workflow and plot results.
Demonstrates converting an ECG signal to the frequency domain with a 640-point DFT, then reconstructing the time-domain signal with the inverse DFT, using MATLAB and a practical coding workflow.
Explore the duality between time and frequency domains, where a single point yields a sinusoid in the other domain, and convolution in one domain relates to multiplication in the other.
Explore the frequency domain representations in rectangular and polar notation, highlighting magnitude and phase relationships for DFT samples. Compare which form suits computation versus interpretation of signal characteristics.
Explore spectral analysis using the DFT to extract phase, frequency, and amplitude from 256-point signals, apply windowing, and identify noise, interference, and a fundamental 13 Hz with harmonics.
Explore how a system's impulse response defines its frequency response via the Fourier transform, linking time-domain convolution to frequency-domain multiplication and revealing resolution via DFT.
Explore complex numbers as an extension of ordinary numbers, representing them with real and imaginary parts on the complex plane, and prepare for use in fast transforms and dsp applications.
Represent complex numbers in polar form. Convert to rectangular form by computing magnitude and angle, deriving real and imaginary parts using r cos theta and r sin theta.
Explore Euler's relation and the exponential form to multiply and divide complex numbers. See how these concepts underpin DSP representations and operations.
Explore how complex numbers efficiently represent sinusoid signals in dsp, using omega equals two pi f, and how a sinusoid maps to a single complex expression encoding amplitude and phase.
Represent systems using complex numbers to analyze how a continuous input signal passes through a system and yields a distinctive output signal with characteristic changes.
Explore how the discrete Fourier transform uses real or complex numbers, extends the forward transform to complex parameters, and decomposes signals into complex exponentials with X(k) and normalization factor.
Learn how sine waves are written as complex exponentials, derive equivalent cos and sin forms, and recognize that positive and negative frequencies together form a complete waveform.
Explore the complex discrete Fourier transform equation using Pullen notation, mapping time-domain signals x(n) to frequency-domain X(k) as complex numbers from 0 to N-1.
Compare real dft and complex dft, showing real signals yield two real frequency components in real dft, while complex dft uses positive and negative frequencies.
With a programming based approach, this course is designed to give you a solid foundation in the most useful aspects of Digital Signal Processing (DSP) in an engaging and easy to follow way. The goal of this course is to present practical techniques while avoiding obstacles of abstract mathematical theories. To achieve this goal, the DSP techniques are explained in plain language and computer code, not simply proven to be true through mathematical derivations.
Still keeping it simple, this course comes in different programming languages and hardware architectures so that students can put the techniques to practice using a programming language or hardware architecture of their choice. This version of the course uses the Java programming language.
With each dsp topic we shall develop two versions of the same algorithm. One version shall be focused on code readable and the other version shall focus on robustness and execution speed- we shall employ programming techniques such loop unrolling and Multiply- Accumulate (MAC) to accomplish this.
By the end of this course you should be able build a complete DSP library in java, develop the Convolution Kernel algorithm in Java, develop the Discrete Fourier Transform (DFT) algorithm in Java, develop the Inverse Discrete Fourier Transform (IDFT) algorithm in Java, design and develop Finite Impulse Response (FIR) filters in Java, design and develop Infinite Impulse Response (IIR) filters in Java, develop Windowed-Sinc filters in Java, build Modified Sallen-Key filters, build Bessel, Chebyshev and Butterworth filters, develop the Fast Fourier Transform (FFT) algorithm in Java, even give a lecture on DSP and so much more. Please take a look at the full course curriculum.