Digital Filter Instructions from IKEA?
This is a wordless example of a folded FIR filter. Swedish “Bygglek” = build and play.
Setting Carrier to Noise Ratio in Simulations
Setting the right Gaussian noise level is easy once you know the math. This post derives simple, practical equations to compute noise density and the rms noise amplitude needed to achieve a target carrier to noise ratio at a receiver output. It shows how to get the noise-equivalent bandwidth from a discrete-time filter, how to compute N0 and sigma, and includes a MATLAB set_cnr function to generate the noise vector.
Add a Power Marker to a Power Spectral Density (PSD) Plot
Read absolute power directly from a PSD plot with a simple MATLAB helper. The author presents psd_mkr, a function that computes the PSD with pwelch and overlays a power marker in three modes: normal for narrowband tones, band-power for integrated power over a specified bandwidth, and 1 Hz for noise density readings. Examples show how bin summing, window loss, and scalloping are handled for accurate measurements.
Find Aliased ADC or DAC Harmonics (with animation)
If a sinewave drives an ADC or DAC, device nonlinearities create harmonics that can fold back as aliases above Nyquist. This post shows a simple Matlab model, using an NCO, a static nonlinearity, and a DFT to generate spectra and reveal aliased harmonics, with animated illustrations to make aliasing intuitive. The approach works for both ADC and DAC measurement setups and highlights realistic effects like quantization noise.
Compute Images/Aliases of CIC Interpolators/Decimators
CIC filters provide multiplier-free interpolation and decimation for large sample-rate changes, but their images and aliases can trip up designs. This post supplies two concise Matlab functions and hands-on examples to compute interpolator images and decimator aliases, showing spectra and freqz plots. Readers will learn how interpolation ratio and number of stages alter passband, stopband, and aliasing behavior.
Design Square-Root Nyquist Filters
A multirate signal processing textbook presents a neat method for designing square-root Nyquist FIR filters that combine zero ISI with strong stopband attenuation. This post walks through the principle that matched transmit and receive filters need square-root Nyquist responses, gives the key design relations for excess bandwidth and stopband edge, and includes a Matlab implementation to produce practical FIR matched filters for QAM-style systems.
Third-Order Distortion of a Digitally-Modulated Signal
Amplifier third-order distortion is a common limiter in RF and communications chains, and Neil Robertson walks through why it matters using hands-on MATLAB simulations. He shows how a cubic nonlinearity creates IMD3 tones, causes spectral regrowth and degrades QAM constellations, and gives practical notes on estimating k3, computing ACPR from PSDs, and sampling considerations.
Second Order Discrete-Time System Demonstration
Want a hands-on way to see how continuous second-order dynamics appear in discrete time? Neil Robertson converts a canonical H(s) to H(z), shows z-plane pole mapping for different damping ratios, and walks through impulse-invariance scaling and zero placement. The post includes a MATLAB function so_demo.m that computes numerator and denominator coefficients, plots poles, and compares impulse and frequency responses so you can experiment with sampling effects.
A Simplified Matlab Function for Power Spectral Density
Neil Robertson provides a tiny Matlab wrapper around pwelch that simplifies PSD computation by preselecting a Kaiser window, default overlap, and converting units from W/Hz to dBW/bin. Call psd_simple(x,nfft,fs) to get PdB and a frequency vector, with nfft controlling whether DFT averaging is used. The post includes examples showing the effect of averaging and explains the Kaiser window processing loss.
Fractional Delay FIR Filters
You can realize arbitrary fractional-sample delays with standard FIR filters by shifting a sinc impulse response and removing symmetry, then windowing the result. This post shows a practical window-method implementation using Chebyshev windows, gives Matlab functions (frac_delay_fir.m and frac_delay_lpf.m) in the appendix, and walks through examples that demonstrate the delay, magnitude trade-offs, and how increasing taps widens the flat-delay bandwidth.
Digital PLL's, Part 3 -- Phase Lock an NCO to an External Clock
Phase-locking a numerically controlled oscillator to an external clock that is unrelated to system clocks is practical and largely unexplored. Neil Robertson presents a time-domain digital PLL that converts the ADC-sampled clock into I/Q with a Hilbert transformer and measures phase error with a compact complex phase detector. The post shows loop-filter coefficient formulas and simulations that reveal how ADC quantization and Gaussian clock noise map into NCO phase noise and how loop bandwidth shapes the result.
Phase or Frequency Shifter Using a Hilbert Transformer
A Hilbert transformer converts a real input into an analytic I+jQ pair, enabling phase shifts and frequency shifts while keeping real inputs and outputs. This article shows Matlab implementations (31-tap FIR with Hamming or Blackman windows), derives y = I cosθ - Q sinθ for phase and frequency shifting, and highlights practical limits from finite taps and coefficient/NCO quantization.
Multiplierless Half-band Filters and Hilbert Transformers
This article provides coefficients of multiplierless Finite Impulse Response 7-tap, 11-tap, and 15-tap half-band filters and Hilbert Transformers. Since Hilbert transformer coefficients are simply related to half-band coefficients, multiplierless Hilbert transformers are easily derived from multiplierless half-bands.
Simple but Effective Spectrum Averaging
In this article, I provide a Matlab function that performs exponential PSD averaging, using first-order infinite impulse response (IIR) filtering to continuously average the PSD bins. This approach works well for computing the spectrum of a long-duration signal over time, because the spectrum is constantly updated as new PSD’s are computed. Conveniently, the time constant of the PSD averaging is determined by the single adjustable parameter α. I also provide a Matlab function for conventional (unweighted) PSD averaging. Neither function requires any canned code other than the Fast Fourier Transform (FFT), although I do use the Matlab hann window function for convenience.
A Simplified Matlab Function for Power Spectral Density
Neil Robertson provides a tiny Matlab wrapper around pwelch that simplifies PSD computation by preselecting a Kaiser window, default overlap, and converting units from W/Hz to dBW/bin. Call psd_simple(x,nfft,fs) to get PdB and a frequency vector, with nfft controlling whether DFT averaging is used. The post includes examples showing the effect of averaging and explains the Kaiser window processing loss.
Demonstrating the Periodic Spectrum of a Sampled Signal Using the DFT
This post makes a basic DSP principle tangible by computing the DFT over an extended set of bins and plotting the results. It demonstrates that a sampled signal's spectrum repeats every sampling rate, explains the k-to-frequency mapping, and contrasts common bin ranges such as 0..N-1 and -N/2..N/2-1. The write-up also highlights symmetry for real sequences and recommends using the FFT for efficiency.
Learn About Transmission Lines Using a Discrete-Time Model
A simple discrete-time approach makes lossless transmission-line behavior easy to simulate and visualize. The post introduces MATLAB functions tline and wave_movie to model uniform lossless lines with resistive terminations, compute time and frequency responses, and animate travelling waves. A microstrip pulse example shows how reflections produce ringing and how source matching nearly eliminates it, making this a practical learning tool.
Decimators Using Cascaded Multiplierless Half-band Filters
In my last post, I provided coefficients for several multiplierless half-band FIR filters. In the comment section, Rick Lyons mentioned that such filters would be useful in a multi-stage decimator. For such an application, any subsequent multipliers save on resources, since they operate at a fraction of the maximum sample frequency. We’ll examine the frequency response and aliasing of a multiplierless decimate-by-8 cascade in this article, and we’ll also discuss an interpolator cascade using the same half-band filters.
Model Signal Impairments at Complex Baseband
Neil Robertson presents compact complex-baseband channel models for common signal impairments, implemented as short Matlab functions of up to seven lines. Using QAM examples and constellation plots, he demonstrates how interfering carriers, two-path multipath, sinusoidal phase noise, and Gaussian noise distort constellations and affect MER. The examples are lightweight and practical, making it easy to test receiver diagnostics and prototype adaptive-equalizer scenarios.
Design IIR Highpass Filters
Neil Robertson walks through a compact, six-step procedure to synthesize IIR Butterworth highpass filters using pre-warping and the bilinear transform. The post gives the pole transformations, the placement of N zeros at z=1, the scaling to unity gain at fs/2, and a ready-to-run MATLAB hp_synth implementation that reproduces MATLAB's butter results.
Compute the Frequency Response of a Multistage Decimator
This post shows a practical way to compute the full frequency response of a multistage decimator by representing every stage at the input sample rate. The author walks through upsampling lower-rate FIR coefficients, convolving to form the overall impulse response, and taking a DFT, then demonstrates how aliasing and stopband placement affect the aliased components. Example Matlab code and plots illustrate each step.
The Discrete Fourier Transform and the Need for Window Functions
The FFT alone can mislead: capturing a finite-length signal with a rectangular window smears energy across frequency, producing spectral leakage that hides real components. This post explains the origin of leakage, shows how tapered windows such as the Hanning window suppress sidelobes, and demonstrates the tradeoff between sidelobe suppression and mainlobe widening while covering practical tips on zero-padding and record length.
Canonic Signed Digit (CSD) Representation of Integers
Canonic Signed Digit (CSD) encoding slashes the number of nonzero bits in integer coefficients, enabling multiplierless FIR filters implemented with shifts and adds. This post uses MATLAB code to demonstrate CSD rules, show how negative values work, and plot the distribution of signed digits as bit width changes. It finishes with practical techniques to minimize signed digits per coefficient for area and power efficient filter designs.
DAC Zero-Order Hold Models
This article provides two simple time-domain models of a DAC’s zero-order hold. These models will allow us to find time and frequency domain approximations of DAC outputs, and simulate analog filtering of those outputs. Developing the models is also a good way to learn about the DAC ZOH function.
Demonstrating the Periodic Spectrum of a Sampled Signal Using the DFT
This post makes a basic DSP principle tangible by computing the DFT over an extended set of bins and plotting the results. It demonstrates that a sampled signal's spectrum repeats every sampling rate, explains the k-to-frequency mapping, and contrasts common bin ranges such as 0..N-1 and -N/2..N/2-1. The write-up also highlights symmetry for real sequences and recommends using the FFT for efficiency.
Compute Modulation Error Ratio (MER) for QAM
Neil Robertson shows how to define and compute Modulation Error Ratio (MER) for QAM using a simplified baseband model and decision-slice errors. The post derives per-symbol and averaged MER formulas, explains when MER tracks carrier-to-noise ratio under AWGN and matched root-Nyquist filters, and provides example Pav values for QAM-16 and QAM-64 plus a Matlab script and practical tips.
ADC Clock Jitter Model, Part 1 -- Deterministic Jitter
Clock jitter on ADC sample clocks corrupts high-frequency signals, and this post builds a practical MATLAB model to show exactly how deterministic (periodic) jitter maps into phase modulation and discrete sidebands. The author explains a parabolic-interpolation approach using twice-rate samples, demonstrates examples from single tones to pulses, and matches simulation spectra to closed-form sideband formulas so engineers can predict jitter effects.
Design IIR Band-Reject Filters
This post walks through designing IIR Butterworth band-reject filters and provides two MATLAB synthesis functions, br_synth1.m and br_synth2.m. br_synth1 accepts a null frequency plus an upper -3 dB frequency, while br_synth2 takes lower and upper -3 dB frequencies. The author demonstrates an example where a 2nd-order prototype yields a 4th-order H(z), prints b and a coefficients, and plots the response using freqz.
The Discrete Fourier Transform as a Frequency Response
Neil Robertson shows that the discrete frequency response H(k) of an FIR filter is exactly the DFT of its impulse response h(n). He derives the continuous H(ω) and discrete H(k) using complex exponentials for a four-tap FIR, then replaces h(n) with x(n) to recover the general DFT formula. The post keeps the math simple and calls out topics left for separate treatment, such as windowing and phase.
ADC Clock Jitter Model, Part 2 – Random Jitter
Neil Robertson shows how to simulate ADC sample-clock random jitter in Matlab, moving from band-limited Gaussian noise to wideband and close-in phase noise. The post highlights practical artifacts such as aliasing of wideband clock noise, the 20*log10 dependence of jitter sidebands on input frequency, and why cubic interpolation plus a custom noise_filter produces accurate rms and spectral results engineers can trust.







