An 8-bit sine wave and a 27 dB SFDR improvement ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌
View in Web Browser

Hi Dana,

Dithering is absolutely crucial if you generate any kind of digital signal.

The 2 images below show what happens if you generate an 8-bit 1kHz sine-wave with and without dithering.

The difference is huge! Without dithering, you only have 58dB of SFDR (Spurious Free Dynamic Range). With dithering, this improves to 85dB!

So, how do you generate the right kind of dithering?

You have to add a tiny bit of white noise to each sample with an amplitude of 0.5 LSB, or half the amplitude of a bit. This is called RPDF, Rectangular Probability Density Function.

Some signals need more to break up the spurious tones. In that case you add 2 of these independent RPDF noise sources. This is called TPDF, where the T stands for Triangular.

So why does this work?

Without dithering, the error (the difference between the ideal signal and the digital signal) is periodic, creating tones. 

When you add a little bit of noise, this periodicity is broken up as you can see in the second image.

This tiny difference is enough to completely get rid of spurious tones!

You do lose a little bit of SNR in the process. RPDF costs around 3dB and TPDF around 4.8dB, but, your SFDR improves by 27dB for RPDF and 24dB for TPDF in this example.

So far, this assumes you have headroom to add fractional noise (+/-0.5LSB). But in many real systems, you don’t. An alternative is to make noise using a 1-bit PRBS (Pseudo Random Bit Sequence) and add that to your signal. This is a 1-bit signal where the probability of a 0 or a 1 is equal.

At the bottom of this email, I have python example code to generate a wav file with the 1kHz 8-bit signal from this demo. I used these WAV files to create the spectrum images (capture signal with a QA403 and process it in python to make the spectrum plots to for better images).

Best regards and happy designing,

Hans Rosenberg

P.S. I you want to learn more about electronics and you haven't seen my free mini-course on Electromagnetic PCB Design yet, you can get access here: https://www.hans-rosenberg.com/minicourse_account_email?cid=24733e03-585f-4167-aa5b-6b71ee96c48b

 

 

This is the python program which generates the WAV files:

import numpy as np
from scipy.io import wavfile
import math as math

# SET SIGNAL PARAMETERS
Fs=48000 # Sample rate
F=1000 # signal frequency
As=125 # signal amplitude
time=300 #duration of signal in seconds
dither=0 # 0=no, 1=RPDF, 2=TPDF

# Create the signal
N=Fs*time
t=np.arange(0,N)
t=t*1/Fs
signal=np.sin(2*math.pi*F*t);
signal=signal*As

# combine them
if dither==0:
    signal=signal
elif dither==1:
    # This is Rectrangular Probability Density Function (RPDF)
    # RMS value is 0.5/sqrt(3) = 0.289LSB
    signal=signal+np.random.uniform(-0.5, 0.5, N)
elif dither==2:
    # This is triangular Probability Density Function (TPDF)
    # RMS value is sqrt(2)*0.5/sqrt(3) = 0.408LSB (adding 2 uncorrelated noise sources)
    signal=signal+np.random.uniform(-0.5, 0.5, N)+np.random.uniform(-0.5, 0.5, N)

# Round to integers, critical not to use rounding to floor or ceiling, this will give distortion.
signal = np.rint(signal).astype(np.int16)
# Multiply to achieve full range
signal = signal * 256

# create stereo signal
stereo = np.stack((signal, signal), axis=-1) # L = R = mono signal
# Make filename and write
filename = 'signal256_0dither.wav'
wavfile.write(filename, Fs, stereo.astype(np.int16))

Unsubscribe | Sent by Hans Rosenberg
Duivenvoorde 11 • Amstelveen, Noord-Holland • 1187 DJ