Digital Sound & Music: Concepts, Applications, & Science, Chapter 5, last updated 6/25/2013

49

for simplicity, include some C++ features like dynamic allocation with new and the ability to

declare variables anywhere in the program.)

int f = 440;

int r = 44100;

double s = 1;

int b = 8;

double* y = new double[r*s];

for (int t = 0; t r * s; t++)

y[t] = sin(2*PI*f*(t/(r*s)));

To quantize the samples in y to a bit depth of b, we do this:

int sample_max = pow(2, b-1) – 1;

short* y_quantized = new short[r*s];

for (int i = 0; i r * s; i++)

y_quantized[i] = floor(y * sample_max);

The suggested programming exercise linked with this section uses code such as

this to implement Algorithm 5.1 for aliasing and to experiment with

quantization error at various bit depths.

5.3.7 The Mathematics of Dithering and Noise Shaping

Dithering is described in Section 5.1.2.5 as the addition of low-amplitude random noise to an

audio signal as it is being quantized. The purpose of dithering is to prevent neighboring sample

values from quantizing all to the same level, which can cause breaks or choppiness in the sound.

Noise shaping can be performed in conjunction with dithering to raise the noise to a higher

frequency where it is not noticed as much. Now let’s look at the mathematics of dithering and

noise shaping.

First, the amount of random noise to be added to each

sample must be determined. A probability density function

can be used for this purpose. We’ll use the triangular

probability density function graphed in Figure 5.39 as an

example. This graph depicts the following:

There is 0 probability that an amount less than 1 and

greater than 1 will be added to any given sample.

As x moves from 1 to 0 and as x moves from 1 to 0,

there is an increasing probability that x will be added

to any given sample.

Thus, it’s most likely that some number close to 0 will be added as dither, and the highest

magnitude value to be added or subtracted is 1. If you were to implement dithering yourself in

MATLAB or a C++ program (as in the exercises associated with this section), you could create a

triangular probability density function by getting a random number between 1 and 0 and

another between 0 and 1 and summing them.

MATLAB

Exercise:

Dithering &

Noise Shaping

in MATLAB

Programming

Exercise:

Dithering &

Noise Shaping

in C++

Programming

Exercise:

Experimenting

with

Quantization

Error in C++

Programming

Exercise:

Simulating

Sampling and

Quantization in

C++

Programming

Exercise:

Reading and

Writing Sound

Files in C++