0% found this document useful (0 votes)
184 views

Understanding FFT Applications Second Edition

Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
184 views

Understanding FFT Applications Second Edition

Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 289

Understanding

SECOND EDITION
EXTENSIVEL Y REVISED

Applications

A Tutorial for
Students & Working Engineers

Anders E. Zonst
Citrus Bess
Titusville, Florida
Publishers Cataloging-in-Publication Data

lonst, Anders E
Understanding FFT Applications-A Tutonal for Laymen, Students, Technicians and
Working Engineers/ A E lonst
p em
Includes bibliographical references and index
1 Fourier analysis 2 Founer transfonnations
3 Digital signal processing I Title

QA403 Z658 2004 5 15 7'23 97 -662 17


ISBN 0-9645 68 1-4-4

Library of Congress Catalog Card Number: 97-66217

All rights reserved. No part of this book may be reproduced, transmitted


or stored by any means, electronic or mechanical, including photocopying,
photography, electronic or digital scanning and storing, in any form, with­
out written consent from the publisher. Direct all inquiries to Citrus Press,
Box 10062, Titusville, FL 32783.

Copyright ©1997, 2004 by Citrus Press

International Standard Book Number 0-9645681-4-4

Printed in the United States of America 987 6 543 2 I


ACKNOWLEDGEMENTS

My oid friend John Granville refused to critique the first edition


of this book, and when I asked why, he volunteered an impromptu informal
criticism (i.e., tirade-sorry I asked). Nonetheless, when I was asked to
revise the manuscript for a second edition, John's criticism came back to
haunt me. As I read the book in preparation for this revision, all of the
minor shortcomings became major, and in the end the task of revision also
became major.
N ow, except for a few changes which address John's specific
criticisms, he has had no direct input to this revision; nonetheless, I must
acknowledge he was the primary driving force behind this extensively
revised edition. Thanks a lot John.
I would also like to say thanks to the readers who bothered to send
comments, but especially to my friend in Seattle, Mr. Larry DeShaw.
I must, once again, give a special thanks to the staff of Citrus
Press..J hope you're adequately compensated.
Finally, I must acknowledge the support of my wife, who tolerates
my moody behavior, and my neglect, when I am involved in these projects.
It's one thing to promise support and quite another to live it through the
years....

AZ - 30 April 2003
CONTENTS

Prologue vii
Foreword IX

PART I - MATHEMATICAL REVIEW

Chapter 1 About the Sinusoid


Chapter 2 The Nature of the Sinusoid 7
Chapter 3 The Mathematically Unique Sinusoid 18

PART II - TRANSIENT CIRCUIT ANALYSIS

Chapter 4 Network Analysis 31


Chapter 5 Circuit Analysis Program 37
Chapter 6 Transient Analysis 47

PART III - THE SPECTRUM ANALY ZER

Chapter 7 Speeding Up the FFT 67


Chapter 8 The Inverse PFFFT 83
Chapter 9 The Spectrum Analyzer 91

PART IV - AUDIO APPLICATIONS

Chapter 10 The Sampling Rate 105


Chapter 11 Digital High Fidelity Audio
Part 1 - Frequency Related Problems 121
Part 2 - Amplitude Related Problems 136
Chapter 12 Changing Playback Rate 145

PART V - IMAGE APPLICATIONS

Chapter 13 The Two Dimensional FFT 158


Chapter 14 2-D Transform Familiarization 166
Chapter 15 Fourier Optics 174
Chapter 16 Image Enhancement 185
vi Contents

APPENDICES

Appendix 1.1 Average Value 199


Appendix 4.1 Differentiation & Integration via Xfonns 201
Appendix 6.1 Transient Analysis Program 205
Appendix 7.1 Positive Frequency Stretching 206
Appendix 7.2 The Small Array FFT 209
Appendix 9.2 About the Fractional Frequency FFT 211
Appendix 9.3 One Deci-Bel 213
Appendix 9.4 Spectrum Analyzer II 215
Appendix 10.0 Negative Frequencies 221
Appendix 11.1 Oversample Demonstration 225
Appendix 11.2 Oversampling II 227
Appendix 11.3 Digital Audio Analyzer 229
Appendix 12.1 Playback Speedup 235
Appendix 12.2 Music Synthesizer 245
Appendix 13.1 The 2-D FFT Program 253
Appendix 14.1 2-D Functions 258
Appendix 15.1 Fourier Optics Routines 263
Appendix 16.1 Image Enhancement Program 265
Appendix 16.2 Improving SignallNoise 275

Bibliography 277
Index 278
PROLOGUE

Quietly, a revolution is taking place in one little corner of


advanced mathematics-the FFT is coming down from the Ivory Tower
and into the practical world. Texts such as Bracewell's, Gaskill's, and
Brigham's are obviously steps in this revolution; yet most colleges and
universities teach this pretty much as they did 50 and 100 years ago.
Seeing this evolution clearly, I try to cut directly to the chase, and bring
this technology to anyone who has a modest mathematical background.
These books will be useful to undergraduate engineers (and, indeed, many
high school students); but also to working engineers (and engineering
managers) who, in their formal education, were given a glimpse of this
technology that did more to intimidate than illuminate.
W hen one works in technology for a number of years it becomes
apparent that, if something works, there's usually a fairly simple reason
why. Surely there are subtle relationships, but once you discover the
secret, they' re not all that difficult...the secret lying, more often than not,
in grasping a previously unfamiliar concept. These, in fact, are what I try
to convey here-fundamental concepts underlying the DFTIFFT.
These are not textbooks. There is much in the textbooks that's
deliberately left out. If, howeveJ; you understand the concepts presented
here you will get much more from a formal course than just memorization
of equations you don't understand.
Much more important than the above considerations, howeveJ; is
the fact that this revolution concerns a way of "seeing" the world we live
in. We begin to recognize the two domains of all the variations on Fourier
are just different ways of seeing the objectively real world (our perception
of sound, for example, is very much a frequency domain phenomenon).
By the time we reach the presentation of 2-D transforms this dual aspect
of perception and understanding grows cleare!; and our grasp of this world
we live in grows stronger. This is something that should be understood by
more than just a few people with advanced degrees-we should all
understand this-it paves the way to comprehension of much that occurs
in our daily lives...and hints at much in more obscure areas.
I cannot promise this will be easy, but if you are reading this
prologue it's virtually certain you can understand this...if you're willing to
put in a little work. Precious little is required in the way of prerequisites,
except that you be intelligent enough to be interested in this sort of thing.

A. E. Zonst
INTRODUCTION

This companion volume to Understanding the FFT assumes the


reader is familiar with the material of that book. It's written in five parts
covering a range of topics from transient circuit analysis to two­
dimensional transforms. It's an introduction to some of the many
applications of the FFT, and it's intended for anyone who wants to explore
this technology- but primarily for those who have read my first book and
now want to experiment with this tool.
The presentation is unique in that it avoids the calculus almost
(but not quite) completely. It's a practical "how-to" book, but it also
presents a down-to-earth understanding of the technology underlying the
discrete Fourier transform (DFT) and the fast Fourier transform (FFT).
This book develops computer programs in BASIC which actually
work, and the reader is strongly encouraged to type these into a computer
and run them. Some of these computer programs are short routines used
to illustrate a relationship or theorem, but mostly they are computer
programs that actually perform the application being developed. This is a
major feature of this book-unless we understand how to develop, write
and apply the computer programs, we never quite understand this subject.
The aim is to show how this technology applies to practical problems.
The reader should understand that presentations are frequently
started at an elementary level. This is just a technique to establish the
foundation for the subsequent discussion, and the material comes quickly
to the problem at hand (usually). The book is written in an informal,
tutorial style, and should b e manageable by anyone with a solid
background in high-school algebra, trigonometry, and complex arithmetic.
I have tried to include the mathematics that might not be included in a
high-school curriculum; so, if you managed to work your way through the
first book, you should be able to handle this one.
This book was written because, having presented the FFT in my
first b o o k ( Un derstanding t h e FFn at t h e l e v el of h i g h school
mathematics, it became apparent I might have led many readers into the
swamp and abandoned them there. Furthermore, the discovery that this
material could be presented at this level led me to see the desirability of
doing so. Unfortunately, it wasn't clear at the outset what should be
included in this book and, consequently, the manuscript sort of grew
naturally.... As was pointed out to me later, the lack of organization made
the first edition difficult, and I have attempted to correct that sort of
mistake here. Most prominent, in this regard, is the improved coherence
and readability of the book.
CHAPTER 1

ABOUT THE SINUSOID

1.0 INTRODUCTION

A detailed study of the discrete Fourier transform (DFT) is, as we


shall see, primarily a study of sinusoids. Applications of the DFT and FFT
concern the systematic manipulation of groups, or bands of sinusoids, but
we must also study single, individual sinusoids if we hope to get to the
bottom of the phenomena that are so intriguing.
The sine function is commonly introduced by Eqn. (1.1). We all
know what this means-it simply says we are to take the sine of the
argument in parentheses. But this equation hides the very thing we must
- - - - ---- - - - - - - - - ( 1. 1)

where: Ao = AmplItUde
4> = Phase
f = frequency
understand here-it hides the transition from argument to sine function.
To understand the intriguing phenomena of Fourier's transform we must
understand this transition, so let's go back to the beginning and trace the
path that gets us to an understanding of this profound relationship.

1 . 1 SINUSOIDS

The sine of an angle cP (the Greek letter phi, pronounced as in


"Phi, phi, fo, fum. . . " ) is defined using a right triangle, and is the ratio of
the side opposite the angle cP to the hypotenuse (Fig. 1.1). The cosine of
cP is the ratio of the adjacent side (i.e., X) to the hypotenuse.

YIR=Sin'
XIR = Cos,
R = Hypotenuse

Figure 1.1 - Sine and Cosine Definition


2 Chapter 1

If the hypotenuse is of unit length, the side opposite the angle will
be exactly equal to the sine-and the adjacent side will equal the cosine.
In Figure 1.2 the unit hypotenuse is also the radius of a circle; so, if we
rotate this radius (like the spoke of a wheel), ¢ will move through all
Rotatloa Sample PoiaQ

-- . -

Startiag
Positloa
Figure 1.2 - Sinusoid Generation
possible angles. We may plot the successive values of the sine function
(i.e., the vertical component of the radius) against the value of ¢ as the
radius rotates. [Figure 1.2 also illustrates a characteristic ofdigital (i. e.,
discrete data) systems. While the angle ¢ changes continuously. and the
sine function is also continuous, we can only sample a finite number of
points in a digital system. Note the symmetry of the sampled data-we
have 16 (i. e., 24) data points. This will be useful in illustrating various
points, but 2N data points (where N is an integer) is completely composed
offactors of 2, which provides maximum efficiency in the FFT. Its not
imperative, however, that 2N data points be used in a DFT.]
The term sinusoid includes both the sine and cosine function. The
cosine may be generated by starting with the radius in the vertical position
(Figure 1.3). It's apparent the only difference between Fig. 1.2 and 1.3 is
Sia(.+ 90')a Cos •

. ---

Figure 1.3 - Cosine Generation


Sinusoids 3

thephase (i.e., the starting angle) of the functions. The phase angle can be
any value from zero to 211", of course, and we include all possible phase
angles under the term sinusoid.
We may also note that, if the rate of rotation is constant, the angle
cp may be expressed as a function of time. We need only convert this time
variable into radians, scaled to 211" for each revolution:

cp(t) = 211"tiT (1.2)


where: cp(t) angle as a function of time (in radians)
t time (usually measured in seconds)
T = period of one revolution
In electrical work the reciprocal of T (i.e., the frequency of completing
rotations per unit time) is most often used and designated as f= lIT. The
expression 211"fis used so often that we usually shorten Eqn. (1.2) to:

cf>(t) = wt (1.3)
where: w = 211"f or 211"IT

We will talk more about this argument of sinusoids later, but for now let's
continue our present discussion.

111)- Sln(ml++)

-1-

Figure 1.4 - Time-Based Sinusoid

Since the term sinusoid includes all possible phase angles, we


must include a term for phase in our time-based argument (Fig. 1.4):

f(t) Sin(wt + cp) (1.4)


where: cp starting (or phase) angle.
4 Chapter 1

1.2 THE ARGAND DIAGRAM

Figure 1.4 depicts two distinctly different diagrams. The one on


the left is for plotting rotation and the one on the right depicts a vertical
displacement for some linearly increasing variable (i.e., time). [Note: We
have made time the common parameter between these diagrams, but time
is not the cause of anything. It's only a common parameter Equations
that are functions of a common parameter are called parametric equations.]
Imaginary The diagram on the left is
Axis P1(x + iy) known as an A rgand diagram , I and we
i2
must talk a little about it. The hori-
il zontal axis is the real axis and the
Real
2
- -1 1 2 Axis
vertical is the imaginary axis. The
I
-+--+---1--I--�"- reason for this nomenclature is that, if
we allow multiplication by -1 rotates
-il
Pz(-x -iy) a phasor from the positive real axis to
-i2 the negative (1800 in Argand's dia-
gram), then we may hypothesize there
is some similar constant (designated as
Figure 1 .5 Argand Diagram
-
i) which will rotate a phasor halfway
to the negative real axis (i.e., 900 to the imaginary axis). Clearly, then,
multiplying by i twice must rotate the phasor to the negative real axis:

iXi = ;2 = -l
so that:
i =v-l ---------------------------- (1.5)

but since no real number squared produces a negative number we allow


this must be an imaginary number. Mathematicall� the use of i =v-l to
rotate numbers onto the imaginary axis is completely consistent. A key
point here is that Argand diagrams plot rotational phenomena-they plot
magnitudes and rotation. The use of i = v-I allows a consistent
mathematical description of rotation-but let's talk about rotation.. ..

I Jean Robert Argand ( 1 768-1 822), who developed a geometrIcal interpretation

of complex numbers .. but after Casper Wessel ( 1 745-1 8 1 8) Long before Argand and
Wessel, Rafael Bombelli (born ca. 1 530) saw the necessity of recognizing the existence
of numbers such as v-I but allowed they were "imaginary numbers " Hamilton ( 1 805-
1 865) did much to clear up the confusion with complex numbers. Arnold Dresden has
suggested removing the stigma of the term imaginary by replacing it with normal.
Sinusoids s

1.3 ABOUT ROTATION

Sinusoids are functions of an angle (i.e., of rotation). That is, the


argument of a sinusoid (wt + cf» describes a quantity of rotation. Rotation
is fundamentally different from straight line or linear motion. With linear
motion we change position, but with rotation per se we only change
direction. If we stop in the middle of Kansas and ask the way to San Jose,
the farmer will consult the weather vane at the top of his barn, rotate 90°
counter-clockwise, and point. Note that no distance is implied-distance
is moved only if we specify a radius, and all circular distance depends on
the length of that radius.
The tip of a rotating radius traces-out a
circumference of a circle-the length of which is
3.1415926535897932384626433832795028 ... (i.e., 11")
times the length of the diameter (i.e., 2 x radius). But,
to make this comparison, we must straighten the
circular circumference into a linear d istance-
otherwise we're comparing apples to oranges. Figure 1.6
We measure rotation itself by specifying an angle. We more or
less arbitrarily define a full circle of rotation as having 360° and measure
all other rotations as fractions of this 360°. There's nothing very special
about 360°-we could have chosen 400 "grads" and then each quadrant
would contain 100 grads, but these arbitrary definitions don't include
much, mathematicall� of the cyclical nature of rotation. Once we turn a
full circle we ' ve done all there is to do (except to repeat the operation).
This "quantum" of rotation has no equivalent in Imear motion, and it would
be nice if our mathematics included this phenomenon.
Nonetheless, our understanding of rotation is aided by considering
the geometry of cirr:les. If we divide the circular length of the circumfer­
ence of any circle by the linear length of the radius of the same circle, the
centimeters in the circumference (numerator) will be cancelled by the
centimeters in the radius (denominator), and we obtain a dimensionless
number 211" ...but this isn't quite correct! We have just divided the distance
around the circle by a linear distance, and there must still be a quality of
curvature or rotation implicit in this quotient. W hat we have really done
is divide 6.28 ... circular centimeters by one centimeter, yielding 211"
cirr:ular or 211" rotation. To be consistent, any time we multiply this 211"
6 Chapter 1

rotation constant by a linear distance, we must reintroduce the rotational


quality. The term 211' radians indicates a length on the circumference
normalized to the radius-which is a quantity of rotation-an angle.
The term radian, then, implies the attribute of rotation, and 211'
radians now serves the same function as our arbitrary 360°, and becomes
a sort of quantum constant relating rotation to pure numbers. That is, it's
apparent that we can take any fraction of these 211' radians just as we took
a fraction of 360°. Half a circle contains 11' radians, a quarter contains 11'12,
etc., etc.; however, whole number multipliers serve only to count the
number of full rotations. W ith the 211' radians term factored, we may use
pure, linear, real numbers to measure the quantity of rotation.
So, a 1 cm radius yields a circumference of 211' cm, which is the
same number of cm as radians, so the angle in radians is precisely equal to
the distance included in the arc along the circumference. Clearly then, if
we divide the distance along any circumference by the radius we get the
included angle. It's apparent, then, for very small angles, the sine of the
angle (as well as the tangent) will approximately equal the angle itself.
This comes about from the fact
Arc on Circum ference Sin ro � ro
= ro that, as we consider smaller and
smaller segments of a circle, they
look more and more like straight
lines (see F i g u r e 1.7). I f an
astronomer wants to resolve two
Figure 1.7
features on the moon that are 114
mile apart, he will know immediately his telescope must be capable of
resolving 0.251250,000 = 1 x 10-<; radians (actually, astronomers measure
small angles in arc minutes and arc seconds, which is obviously better: ;-)
Of interest a little later, it's apparent that as the angle approaches zero,
Sin(cJ» approaches zero, but the ratio of Sin(cJ»/cJ> will approach 1.0.
If we multiply 211' radians by a pure dimensionless number, there
will be no length associated with the product...it will yield a quantity of
pure rotation (i.e., an angle). When we divide the independent variable t
(i.e., elapsed time since the start of our sinusoid) by the time required to
complete one cycle T (i. e., the period of a cycle) the dimensions of time
cancel, and we obtain a purely numerical proportion, and if we multiply
this by 211' radians, we will obtain the angular position.
CHAPTER 2

THE NATURE OF THE SINUSOID

A straight line, for example, has simple characteristics-it has a


slope and an offset. As we change the independent variable x the
dependent variable y changes proportional to the slope in a linear manner:
The slope, then, is the dominant characteristic of a straight line, and when
we provide for an added constant (i.e., offset) we have said all there is to
say about straight lines-we have described their nature. Parabolas, on the
other hand, are similar to straight lines except that the slope changes at
every point on the curve. The differential calculus studies the phenomenon
of slope, and as we understand this phenomenon we begin to understand
the nature of curves such as parabolas. So, in this sense, what is the nature
of the curves we call sinusoids.
The most famous function in the mathematics of the calculus is,
perhaps, the function whose derivative is equal to itself-the curve whose
slope is equal to itself-which we know to as e'. This unique function
describes relationships such as population growth [the rate of growth of a
population must be proportional to the number of couples procreating (i.e.,
the population itself)]. Now, the phenomenon of things changing at a rate
proportional to their own magnitude is ubiquitous in nature (e. g.,
compound interest, charging capacitors, etc., etc. ) and so we are not
surprised to find that this exponential function. e', is ubiquitous in our
mathematical descriptions of nature. As we grasp the underlying concept,
we grasp the nature of this function.
The exponential function is of considerable interest to us, for, as
we shall see shortly, sinusoids are built on this e' function. We might
anticipate, then, that sinusoids will have characteristics not completely
dissimilar to exponential functions (i.e., their derivatives might resemble
themselves in some way). Being nothing but a peculiar sununation of these
e' functions, we might imagine the nature of a sinusoid will be relatively
simple...and indeed it is (but perhaps not so simple as you might think).
Nonetheless, the nature of these sinusoids remained beyond our reach for
most of our recorded history, and even today relatively few understand
their profound nature. Now, as we said, these sinusoids are only a simple
summation of the natural growth function e', and as such they can't be all
that difficult. Let's take a look.
8 Chapter 2

MACLAURIN'S SERIES

We noted in the first book that we can approximate functions such


as e', sin(x), cos(x), etc., using the Maclaurin series, which has the fonn:

fix) = flO) + fto)x + f'tO)x2/2 + f"(0)x3/(2'3) + ... (2.2)

where ftO).!'tO), etc. are the 1st, 2nd, etc., derivatives, evaluated for an
argument of zero. We will show how simple it is to use this series via
three examples. The first is e'-the function whose derivative is equal to
itself. Now, anything raised to the zero power is equal to 1. 0, so this
makes Maclaurin's series for e' very easy to evaluate---every derivative
will yield a coefficient of 1.0 (when evaluated for an argument of zero) so:

You may prove this is correct by taking the derivative of this series of
tenns-the result will be the same as the original series-the derivative of
this function is equal to itself.
The next function we approximate is the sine function. We know
the value of a sine function is 0.0 at an argument of zero, and its derivative
(a cosine function) is 1.0 for an argument of zero. The second derivative
(a minus sine function) again yields 0.0 (for an argument of zero) and the
third derivative (a minus cosine) is -1.0 (at zero), etc., etc. We therefore
obtain a Maclaurin series for the sine function:

sin(x) = x - �/6 + x5/120 + .... (2.4)

Similarly the cosine function yields a series of:

cos(x) = 1 - �/2 + x4/24 + .... --------- (2.5)

Note that the sine function contains all the odd powers of x while the
cosine contains all the even powers. Most interestingly, e' contains both
the odd and even tenns, which suggests we might somehow obtain the e'
function by summing the sine and cosine functions. In fact, we find these
functions combine very neatly as follows:

from which we may factor out the two series:


Nature of Sinusoids 9

---------- - - (2. 7)

and:
isin(x) = ix - ix3/6 + ixs/l 20 + . . . . ------ - - ---- (2.8)
That is:

e ix = cos(x) + isin(x) ---- - ---------- - (2.9)

If we multiply this by A and substitute 0 for x we get:

/y
Ae i8 = ACos(O) + i ASin(O) - - - - - - - - - - - - - (2.10)

Now, from our development of


sinusoids and Argand diagrams in
Chapter 1, it's apparent the sine and
cosine are the components of a unit -+-+-+---!"'--....:.f+to
..- -l-..... X
length rotating vector (we will refer to
rotating vectors as phasors), and it's
further apparent we may write the Ac = AoCoscjl
components of any phasor as: As = AoSincjl
j{O) = ACos(O) + i ASin(O) - - - - - - - - - - - - - - (2.10A)

We frequently write j{O) as A !.fl. but it's apparent ei8 is a much better
expression for a phasor (or vector). The i in front ASin(O) implies this
component lies on the imaginary axis while ACos(O) lies on the real axis­
we are dealing with the Argand mode of projection-the same we used in
Fig. (1.1) on the first page to define the sine and cosine functions.
Note that the angle goes in the exponent of ei8 _ in vector
multiplication we will multiply the magnitudes and add the angles.

Clearly, then, e i8 is the mathematical expression for a phasor (or


vector); however, we may repeat the above exercise for e raised to -ix:

e'lX = cos(x) - isin(x) - ------------ - -- (2.12)

and by adding and subtracting (2.9) and (2.12) we may determine:

cos(x) = (elX + e4/2 - - - - ----------- - - - (2.13)

and:
10 Chapter 2

------------------ (2.14)

So, what have we derived here? Back on the first page we


lamented that simply writing Sin(8) and Cos(8) hides the mathematics that
underlie these functions, and here we have partially exposed the underlying
math ... but what do we really have here? W hat do the expressions on the
right side of the above equations really mean?
We know the imaginary exponents in the right hand side of (2.13)
and (2.14) imply these are functions in the Argand plane-eixterms imply
phasors. If we plot the right hand side of (2.13) on an Argand diagram we
get Fig. 2.2 at right. From this it's Cos(4)) Cos(-4» =

apparent the imaginary components


Sin@ -Sin(-4» =

of these phasors will always cancel


�-------+--�--.
while the real components add' to
twice the cosine of cp. As cp varies
from 0 to 27r the cosine of cp is
traced out on the real axis. As we .
Fig. 2.2 - Complex Conjugates e'", + e''"
k now, we may t h en express th·IS
cosine function parametrically [as a function of the parametercp (or time)]
in the usual Cartesian coordinate plane. It's apparent we will likewise get
a projection of the sine function on the imaginary axis if we subtract the
two exponential terms (see Eqn. 2.14).

2.1 THE "SELFISH" NATURE OF SINUSOIDS

The exponential expressions for sinusoids derived above expose


much about the nature of these functions. We noted that e' was a most
unique function (being the function whose derivative equals itself), and
here we see how sinusoids are constructed from these functions; so, do the
derivatives of sinusoids really have similar characteristics.
In fact, direct examination of the sine function reveals this
expected relationship. We know the vertical projection of a unit radius
generates a sinusoid as it rotates, and it's also apparent any length of arc
along the circumference of a unit radius circle must be equal to the

I An expression containing two tenns is a "binomial " Two binomials of the

fonn a + b and a b are "conjugates." Complex numbers of the fonn a + ib and a ib


- -

go by the impressive moniker "complex conjugates." Addition would yield 2a and


multiplication would yield aI + bI :. (Cose/> +iSimp)(Cose/> -iSinc/»
= I
Nature of Sinusoids 11

included angle in radians. Now,


the slope of a function is the rise
over the run, but with sinusoids the
run (i.e., change of the independent
variable) is the arc encompassed

*
9=90+c!>
(see Fig. 2.3). -1"'------+-

We note the displacement =Sin( 90+ c!»

of the tip of the radius is always at


Fig. 2.3 - The Slope of a Sinusoid
right angles to itself, so the direc-
tion of motion is equal to the angle of the radius plus 90° (i.e., cp + 90°).
From Figure 2.3 it's apparent that:

(2.15)

[Note: it' s apparent that the hypotenuse of the little triangle (on which we
base our equation for slope) in Fig 2.3 is equivalent to a radius that has
rotated past 90°. The vertical projection of a radius is
the sine of the angle cp, but I:!.y/I:!.cp is the change in the
F----\---., sine function divided by the change in the independent
variable-it's the slope of the sinusoid. Furthermore,
as is apparent from Figs. 1.2 and 1.3, the sine of (cp +
90°) is a cosine function. The slope, or derivative, of
a sine wave is just a cosine wave.

(2.16)

Clearly, Figures 1.2 and 1 .3 are the same


t----+----' thing except for the 90° displacement-we are only
looking at different segments of the same curve. Just
as clearly, then, if the derivative of a sine wave is just
another sinusoid displaced by 90°, the derivative of a
cosine wave must also be a sinusoid displaced by 90°
I---+---\---

� wave must yield a minus cosine and the 4th brings us


3rdDerivative
(i.e., a minus sine wave). The 3rd derivative of a sine

back to our original sine function.


This is the relationship we wanted to expose: if e' is the function
whose derivative equals itself, then sinusoids (since they are composed of
e' functions) exhibit a similar characteristic in that their 2nd derivatives
equal themselves (multiplied by -1); furthermore, their 4th derivatives are
12 Chapter 2

completely identical to themselves. This relationship is more clearly seen


if we simply take the derivatives of Eqns. (2.13) and (2.14):

dcos(x)/dx = Yl d(elX + e-j/dx = Yl[i(elX - e-j]


= _(elX - e-jl2i --------------------- (2. 17)
and:

dsin(x)/dx = Yli d(eix - e-IX)/dx = i(eix - e-jl2i


= (elX + e-jl2 -------------------- (2. 18)

2.2 THE UNIVERSALITY OF SINUSOIDS

Just as e' (i.e., the law of natural growth) describes very


fundamental relationships in our world, its offspring (i.e., sinusoids) are
likewise profound. In mechanical engineering, for example, there are
three fundamental phenomena in physically real linear systems (i.e.,
inertial mass, spring force, and energy loss mechanisms.
Now, these three elements do completely different things.
Friction, for example, being the pre-eminent example of energy loss,
attenuates a "signal" (e.g., the torque applied to a shaft supported by
bushings will be reduced by the friction of these bearings). This
phenomenon is represented mathematically as a multiplied coefficient.
The other two elements (inertia and springs) are, as we said,
completely different-we can illustrate the inertia/spring functions by
clamping the end of a ruler to the edge of a desk (with the palm of one
hand) and "twanging" the suspended end (the thumb of your other hand
serving as twanger). The ruler vibrates in a sinusoidal motion at its eigen­
frequenz. We all know the reason this happens is because the energy
continues to be transferred from the spring element to the inertial element
and back (air resistance providing the dominant energy loss mechanism in
this case). We note the drivingfunction for this experiment is the twang
given by your thumb (even without a lot of detailed analysis it's apparent
something more interesting than bearing friction is going on here).
W hat is going on here? Well, according to Sir Isaac, if we apply
a force to an unrestricted mass it will not just move-it will accelerate. It
will accelerate in the direction ofthe force regardless of whether the force
is directed with, against, or perpendicular to the present direction of
motion. It's implicit that if there's no force, there's no acceleration-and
vice-versa. Recognizing that acceleration is the rate of change of velocity,
Nature of Sinusoids 13

we state the above mathematically as:

F= rnA = rn dvldt (2.19)


where. F= force
rn = mass
A = acceleration
dvldt = rate of change of velocity = A
It was Robert Hook, however, who told us (even before Sir Isaac
revealed the nature of inertia) that when we stretch a spring, the elongation
is proportional to how hard we pull. That is, the distance the ruler bends
is proportional to the force applied by your thumb. Mathematicall� this
is another very simple relationship:

F= Kilx (2.20)

where' K = spnng constant


ilx = increment spring has stretched
We have a small problem here-the equation for force on a spring is
expressed in terms of position (or distance), while the equation for force
on a mass is written for acceleration or rate of change of velocity. This
presents no real problem of course, for just as acceleration is the rate of
change of velocity, we know velocity is the rate of change of position vs.
time. It's therefore apparent that acceleration is the 2nd derivative of
position vs. time:

F = rn drldf = mx " (2.21)


where: dr1df = 2nd derivative of position vs. time
"
x = drldf

Okay, now we can compare oranges to oranges, but since mass


involves the 2nd derivative it's a little like comparing Florida oranges to
"some other place's" oranges. Now, 01' Newt also told us that for every
action there's always an equal and opposite action. Clearly, in any closed
system (such as our twanged ruler), the sum of all the forces at any time
must be equal to zero (i.e., force is the action we speak of and, when
summed (so long as we account for all of the forces), this equal and
opposite characteristic must yield zero). If we ignore the force of the
energy losses in our twanged ruler example we can write the equation:
14 Chapter 2

acceleratingforce - spring force = 0


mx" -Kl:u =0 (2.22)

This simple little equation tells us the following: As we bend the


end of the ruler via force from our thumb, the molecules of the ruler are
pulled from their equilibrium position creating an opposing restoringforce
(equal and opposite). W hen we slip our thumb over the edge, suddenly all
of the restoring force is applied to acceleration of the mass (of the ruler)
according to Eqn. (2.22). The ruler accelerates; which, in time, generates
a velocity; which, in time, moves the ruler toward the position of
equilibrium (i.e., where ilx = 0). As the ruler moves toward the position
ilx = 0 the spring force diminishes [Eqn. (2.20)], and consequently the
acceleration decreases [Eqn. (2.19)] until, at ilx = 0, there is no force
anywhere in this system (remembeI; we are ignoring wind resistance).
Now, the ruler's mass is still in motion and, unless some force
acts on that mass, it will continue in that motion; howeveI; the motion of
the ruler immediately begins to wind the spring in the opposite direction,
and force is (again) generated. This restoring force acts to accelerate the
mass of the ruler in the opposite direction (i.e., slowing the velocity). As
the ruler continues to deflect and the spring force increases, the negative
acceleration (being proportional to the force) must increase, and velocity
is quickly brought to zero. Clearly, the deflection of the ruler is at its
greatest (there being no velocity to carry it farther), so the restoring spring
force is at its greatest (negative), which means the acceleration is at its
greatest-only velocity is zero. From here we go through the identical
scenario in the opposite direction....all this from Equation (2.22).2
But the cause for celebration doesn't end here-in electrical
engineering inductance is analogous to inertial mass-a capacitor mimics
a spring-and resistance is analogous to friction. Consequently, if we
replace min Eqn. (2.22) with L (the term for electrical inductance), and K
with lIC (where C is the symbol for electrical capacitance) we get the most
fundamental equation for an electrical circuit response. Similar conceptual
elements are found in fluid dynamics, acoustics.. .in fact, this general
equation is found throughout engineering. Unfailingly we come up with
what is called a second order. linear. diff erential equation-Eqn. (2.22).

2
physicists sincerely search for an equation of everything, and we sincerely
wish them well; but, here, in this model of mechanical motion (if we only include the
element of fnction) we very nearly have a mechanical motion equation for everything.
Nature of Sinusoids 15

2.3 EIGENFUNCTIONS

The word eigen (pronounced eye'-gun) comes from the German


language and is translated as "own", "peculiar," "self," or "specific."
German words, howeveI; are properly defined in German (just as English
words are defined in English), and a direct translation of words is greatly
aided by examples of common usage. The word "Nutz" (pronounced
noots), for example, means usefulness; so "eigen-nutz" denotes the notion
we refer to as self-interest. Even more enlightening, "eigen-nutzig"means
"selfish." "Eigen-frequenz" denotes the phenomenon American engineers
refer to as naturalfrequency. The German word "Lob" (long 0 as in low)
means praise, and "Eigen-lob" is, of course, self-praise.
W hat, then, is an eigen-/unction?

2.4 STURM-LIOUVILLE

The general applicability of trigonometric series was something


Fourier hadn't proven when he used this technique to solve his famous
problem in heatflow in the early-nineteenth century. By mid-nineteenth
century things had progressed and two mathematicians (lC.F. Sturm and
Joseph Liouvillei worked on the general solution of these second order
ordinary differential equations (equations of this form are now called
Sturm-Liouville equations). If, in Equation (2.22), we move the Kf(x)
expression to the right-hand side:

M}'(x) Kf(x) (2.22A)


then: M},(x)IK f(x) (2.22B)

where the constants M and K are not necessarily mass and springs. In this
form we see (since M and K are constants), the second derivative off(x) is
equal to itself (modified at most by a multiplied constant)!
Now, we know a function whose 2nd derivative is equal to itself
multiplied by a constant. Not only does the second derivative of a sine
wave equal itself (multiplied by a constant -1) but so does the 2nd
derivative of a cosine wave. On successive differentiations, these functions
are self-generating! You may begin to see where all this is going, but let's

In Russia, this work is attnbuted to theprominenl Russian mathematician, V.A.


3
Steklov
16 Chapter 2

consider another relationship apparent in our development of Eqn. (2.22).


In the preceding illustration, the driving function is the twang from your
thumb, and the response function is the oscillatory motion of the ruler. We
note specifically that the response function doesn't look like the driving
jUnction. That is, the twang we give the ruler is (more or less) an impulse;
but the response is (more or less) a sinusoid. This is, in fact, more often
the case than not-we don't expect the response to look like the driving
function-the response is frequently a sinusoid regardless of the shape of
the driving function.
So, what happens if we drive the system with a sinusoid? The
only possible operations a linear system can perform on the input function
are attenuation, differentiation, and integration. We also know that
sinusoids reproduce themselves on differentiation and integration (as
opposed to, say, square waves which yield completely different functions
via these operations). Since attenuation only scales a function, if we drive
a linear system with a sinusoid, we will get a sinusoid out. The most that
can happen is that we shift the phase or change the amplitude, but if we put
a sinusoid in we get a sinusoid out! The sinusoid is an eigenfunction of a
linear system.
"These eigenfunctions," says Sturm (in a heavy Swiss/German
accent), "Herr Fourier can ein Trrrrransformer mit build! "
"Mais oui! But of course," says Liouville (in a light SwisslFrench
accent). "Yet only when bound- up by our conditions-n 'est- ce pas?"
"Conditions? What conditions?" [we ask with a blank expression].
Why boundary conditions? Consider this-we know another
function whose 2nd derivative is equal to itself (as are all of its
derivatives): e'. But e' is not an eigenfunction of linear systems because
it doesn't satisfy the boundary conditions. Specifically, the boundary
conditions demand that thefunction (or its derivatives) equal zero at the
end points (i. e. . its boundaries) . Sine and cosine waves meet these
conditions-real exponentials do not (ever get the feeling these guys are
playing with loaded dice?) We know that a sine wave begins with a value
of zero, and if we scale the argument properly (i.e., select the right
frequency), we know we can make it equal zero at the end point too. If we
do this we also know that any integer multiple of this particular scaling
factor (i.e., harmonics of this fundamental) will also begin and end with
zero-and likewise qualify as eigenfunctions. Furthermore, since the
Nature of Sinusoids 17

derivatives of cosine waves will be zero at their beginning and ending


points, they too qualify as eigenfunctions. W hat about e'? Sorry....
Our primary interest in Sturm-Liouville is exposing the relevance
of eigenfunctions to real world, lineal; time invariant (e.g., spring/mass/­
friction) systems. Understand that the sinusoid really is an eigenfunction
of real world linear systems. If we drive our circuit with a sinusoid (at a
given frequency), we will get a sinusoid out (at the same frequency).
When we twang a ruler it really does oscillate in a sinusoidal motion. On
the other hand, it's apparent to anyone who has ever run a square wave
through a low pass filter that square waves are not eigenfunctions oflinear
systems-what you get out is not what you put in. For that mattel; neither
are the other wave shapes that are grossly different from sinusoids.
So, why do Sturm and Liouville state their demands in such a
round-about way? Simply because eigenfunctions may be any variation on
a sinusoid that meets the Sturm-Liouville boundary conditions! For
example, the Laplace transform uses an exponentially decaying sinusoid
described as e-{p+i(J) (you will recognize that this is a sinusoid multiplied a
real exponential function e P e i(J) This is not the only variation that
· • · .

qualifies as an eigenfunction, of course, and we shall discover others as we


progress through this book.
We begin to see a little of the nature of these sinusoids, but there
is considerably more. W hen we work with them mathematically we
discover they exhibit very unique characteristics, and we will only
underst and their true nature when we begin to understand these
mathematically unique characteristics.
CHAPTER 3

THE MATHEMATICALLY UNIQUE SINUSOID

If we have sinusoids exactly in phase, we can obviously add them


by simply summing their amplitude coefficients; but, clearly, we can t
simply add sinusoids when they have different phases (if the phase equals

Figure 3 . 1 - In Phase Sinusoids

±180° addition becomes subtraction-see Fig. 3.4).


We can break a phasor into sine and cosine components, and it's
apparent that, if the phasor rotates, the sinusoid generated is equal to the
sum of the sinusoids generated by the phasor components'. That is, the

Y 'i Y

Rc= RoCos,
R.= RoSin,
Figure 3.2 - Rotating Phasor Components

'As a phasor's components rotate they too may be broken into components.
Clearly the summation of a phasor's components must yield the original phasor regardless
of how these are rotated; therefore, the sum ofy axis projections of the components must
equal the y axis projection of the phasor at all rotations.
The Unique Sinusoid 19

components o f static phasors will lie along the horizontal and vertical axes
and therefore we may add the phasor components (which lie on the same
axis). We may thus add sinusoids of arbitrary phase by complex addition

--:t:Jts;�=��:';$-
:::
(i.e., add imaginary components to imaginary, and real with real).
Complex
_ Sinusoid

Figure 3.3 - Complex Sinusoids

3.1 SUMMATION OF UNEQUAL FREQUENCY SINUSOIDS

The above scheme for addition works well when we deal with
sinusoids of the same frequency; however, it will obviously not work when
the sinusoids to be added are of different frequency (since the phase will
constantly change). This is illustrated in Fig. 3.4--note that the value of
the summation constantly changes as we progress along the wave.
This remarkable result is
fI
known as "beat frequency modula­
tion." As the phase between the two
sinusoids slowly walks, the ampli­
tudes first add, then subtract, then
add again. Having completed 3600
of phase shift they can only repeat
v
this cycle. Note that the resultant
(
fI waveform is still essentially a sinu­
A soid, albeit an amplitude modulated
f\ A A sinusoid. The term "beat frequency"

V comes from the distinctive beating


V V V sound of two musical tones which
v are not quite in tune. The beating
effect is obvious, but a more subtle,
Figure 3.4 - Summation of Sinusoids unique characteristic of sinusoids is
also working here. Note that the
20 Chapter 3

summation of two cosine waves, for example, equals:

f(t) = Cos(21r!Jt) + Cos(21rJ;tJ - -- - --------- (3.1)

These two sinusoids start in-phase but immediately begin walking out-of­
phase. The next time they will be back in-phase will be when the higher
frequency sinusoid has completed one full cycle more than the lower
frequency sinusoid, but this equation becomes much more interesting when
we consider its trigonometric identity:

Cos(A) + Cos(B) = 2[Co s('h (A +B))Cos('h (A-B))] (3.2A)

substituting the tenns used in (3.1):

COS(27Tftt) + Cos(27Tff) = 2 [ Cos (2'7Tt I, +12 )Cos(2'7Tt I, -/2)] (3.2)


2 2

Let's hold off discussing this equation for a


moment. .. except to note that the result of
summing two sinusoids of different frequen­
cy is equivalent to multiplying two sinusoids H-+++-t+t+t+-I-+II-+-I-+-t+t-H
of suitably selected frequencies. Surely this
result is unique to sinusoids...but let's not
get ahead of ourselves....
Let's take a candid look at what
happens when we multiply two sinusoids. If
we multiply one sinusoid (of high frequency) 1---+-----1--­
by a second (of lower frequency) we must
obtain the pattern shown at right. It is more
or less obvious that, when we multiply two
sinusoids together in this manner, the
"envelope" of the higher frequency sinusoid
will take the shape of the lower. The most H-+-H-"'tA-t+t-+-t-+-iH--t'lf-t++-H
interesting thing here, of course, is that the
resulting modulation pattern is quite similar
to the envelope obtained in Fig. 3.4. In fact,
the modulated waveform shown here is Figure 3.5 _ Modulation
identical to the waveform obtained by
summing those sinusoids. That is, modulation (i.e., multiplication of one
The Uniq ue Sinusoid 21

sinusoid b y another) produces what w e call "sidebands" about the


modulated signal.
We may show this side-band relationship of modulated signals by
employing another well known trigonometric identity:

=
Cos(A +B)+Cos(A -B ) (3 .3 A)
Cos(A)Cos(B)
2

If A = 211"fc' and B = 211"(0. l fc) then the above becomes:


Cos (2'7Tl.l!,) +Cos(2'7TO.91") (3 . 3)
Cos(27TfJCos(2'7T(0.1fJ) = c 1c
2

Eqns. (3.2) and (3.3) show the same thing. W hen we multiply sinusoids,
two new side band sinusoids are produced (note that the original sinusoids
disappear and the two new sidebands are ofdifferentfrequency than either
of the sinusoids multiplied together).
This unique aspect of sinusoids has profound significance. This
curious result (i.e., of sinusoid multiplication) is the underlying mechanism
of convolution (which plays such a prominent role in understanding and
applying Fourier analysis). It will be worth digging a little deeper here.

3.2 SINUSOID MULTIPLICATION

Back on page 11 we noted multiplication of complex exponentials


(i.e., vector or phasor multiplication) required multiplication of the
magnitudes and summation of the angles. On page 1 2 we gave the
geometric interpretation of Equations (2.13) and (2.14) which generate
pure sinusoids. Let's now look at a similar geometric interpretation of
phasor multiplication.
Multiplication is only a
process of repeated addition. If we
1x J 1 + 1 + 1 or J + J
=
multiply a vector (of magnitude 2)
lying along the X axis by another
vector (of magnitude 3) also on the -t----1-- ------t6-­
J
X axis, the resultant is obtained by
Figure 3.6
summ ing 2 into an "accumulator" 3
times. This is precisely the operation we perform in elementary school
multiplication, but consider the example of a vector of magnitude 3 on the
X axis and another of magnitude 2 on the Yaxis. We must now multiply
22 Chapter 3

a quantity of 2 with 7r/2 radians rotation by


6
a quantity of 3. Now, one of the numbers is 3 x 2/!nt 2/!nt
=

being added to itself and the other tells how + 21!JJt

+ 21!JJt
many times to sum it into the accumulator.
According to our development of complex = 6mt
addition, we would take our 2 on the Y axis 2 Angle is not multiplied
and sum it into the pot three times yielding
6 on the Yaxis. It would be silly to think +----3----­
the angle should be multiplied by 3. Figure 3.7
If we perform this multiplication
the other way around and sum 3 on the X axis into the pot 2 with 7r/2
radians rotation times, then before we throw 3 on the X axis into the pot,
we must rotate it by 7r/2 radians. The thing we are throwing into the pot
then is 3 at 7r/2 radians-the only way we can actually sum quantities is if
they are aligned (in the same direction). So, first we take 3 10, rotate it by
7r/2, throw it into the pot; then we take 3 10 again, rotate it by 7r/2, and sum
it in-yielding 6 at 7r/2.
Clearly, then, if we have 3
on the Yaxis multiplied by 2 on 3M
the Yaxis we must sum 3 at 90°
i n t o the accu m u lator 2 at 9 0 °
times. We must rotate 3 at 90° by 2M. x 3M (2 x 3)�'
=

the angle of the multiplier, and


sum it into the pot the number of
6LJjjt'
times indicated. If we do it this
Figure 3.8
way the complex quantities being
summed into the pot will always be at the same angle-as they must.
Having reviewed this very basic mechanism, we're now ready to
look at the multiplication of sinusoids (as these were represented back on
page 10). Figure 2.1 allows us to visualize the solitary cosine function in
terms of a simple pair of phasors-we need not invoke thoughts of series
expansions, etc. [Understand here that we must use this representation of
a cosine function-we must use this pair of complex conjugate phasors if
we hope to see what is really happening mathematically when we multiply
two sinusoids.]
So, then, what happens (geometrically) when we multiply two of
these geometrical cosine functions?
The Unique Sinusoid 23

-.....
Magnitude = 0.5

'\

Figure 3.9 - Multiplication of Two Cosines


Each of these cosines has a pair of complex conjugate phasors,
and if we want to multiply these cosine functions, we must multiply one
pair of complex conjugates by the other pair-we must multiply each
phasor of one pair by both phasors of the other. As we have just seen,
when we multiply phasors we multiply their magnitudes and add their
angles; so, if we stop reading and try that scheme on the figure above, it's
apparent we will obtain the following: since the magnitudes of all the
phasors to be multiplied are 0.5, the magnitude of all the products will be
0.5x0.5 0.25. Furthenllore, since we are dealing with complex conjugate
=

pairs (i.e., the angles of the pair belonging to either cosine are the negatives
of each other), the angles of the products will be the sums and differences
of the multiplied phasors' angles (see Fig. 3 .9). We will obtain two new
complex conjugate pairs of phasors (i.e., two new cosine functions) which
are superimposed (i.e., summed together-Fig 3.9). Note carefully that,
if one angle is large and the other small, the two new phasors will group
themselves about the larger angle (i.e., they must be spaced equally ahead
of and behind the larger angle by + and - the smaller angle).
Ok ay, now we rep l ac e the static ang l e cP by our k i n e t i c
representation of an angle wt (i.e., 21fjt) so that our phasors rotate. If the
two frequencies are different, and we multiply our two cosine functions
point by point as the phasors rotate, we will be performing the operation
we described above as modulation. Again, note that the faster moving
phasor (Le., higher frequency of rotation) will immediately obtain a larger
angle, and the products of the multiplication will group themselves about
this faster moving phasor. The frequency of rotation of one complex
conjugate pair will be equal to the higher frequency plus the lower-the
24 Chapter 3

other will be the higher minus the lower. Mathematically:

Cos(27Tfcl+ 27Tflt) + Cos(27Tf}- 27Tflt) (3 .4A)


Cos(27Tfcl)Cos(27Tflt» =

2
Cos(27T'(fo + II)t) + Cos(27T'(fo - II)t) (3 . 4)
Cos(27Tfcl)Cos(27Tflt» -
2
or, in exponential fonn:
= Y.. [e,"21r(fo+fl)t + e-,"21r(fo+fl)t] + Y.. [e,"21r(fo-fl)t + e-,"21r(fo-fl)t] (3 .5 )

where to is the higherfrequency


These new sinusoids (i.e., the products of two other sinusoids) are,
as we said, referred to as sidebands since, in the frequency domain, they
will stand on either side of the higher frequency sinusoid. As we also said,
this mechanism is the basis of convolution, and Fourier analysis itself... as
we will now explain.

3.3 THE FOURIER TRANSFORM

When we simply accept sines and cosines as presented in Chapter


1 , we short-circuit everything we have covered in Chapters 2 and 3 . It's
only when we include the concepts presented above that we obtain a
mathematically consistent understanding of sinusoids. Now that we
understand what really happens we may use the derived equations to
examine Fourier's transfonn and it's application.
First, let's look at multiplication of two real sinusoids of arbitrary
phase (but same frequency):

Cos(wt + <Pt)Cos(wt + �) =

[(ei(WI + ,pI) + e-i(wl + ,pl) (ei(WI + I/ll) + e-i(WI + I/ll) ]/4 (3.6)

[We have omitted magnitudes here since they always factor out and
contribute nothing to the illustration.] You may easily show that the right­
hand side of (3.6) reduces to:

[(el(2WI + ,pl + ,p2) + e-i(2wl + ,pl + ,p2)]/4 + [ei(,p1-</>2) + el(,p2-</>1) ]/4 (3.7)

This is truly a magnificent expression-the two exponential tenns on the


left are just a sinusoid (a half amplitude, phase-shifted cosine wave). When
The Unique Sinusoid 25

we multiply two sinusoids ofarbitrary phase. we get another sinusoid. the


frequency of which is apparently doubled with the phase shifted by the sum
of the phase angles.
In addition to this sinusoid, there are two tenns in the right-hand
set of brackets of Eqn. (3.7). These concern the phase of the sinusoids:
2
ei(
q,1-4>2) + ei(q, -4> 1 ) = [COS(cPl-<P2) +iSin(cP,-<P2)] + [COS(cP2-<P1 ) +iSin(cP2-<P1 )]
Since Sin(<P2-<P,) = -Sin(<p,-<P2)' and COS(<P1 -<P2) = COS(<P2-<P1 ) we have:

e
l(q,1-4>2) + e i(q,2-4> 1 ) = [2COS(<P1 -<P2)] ------------ (3 .8)

These are unit vectors at plus and minus the difference between the phase
angles and are thus complex conjugates (i.e., they generate equal and
opposite imaginary components which cancel-see footnote p. 10).
This relationship may be more apparent from Fig. 2. 1 (p. 1 0).
This cosine term [i.e., Eqn.(3 . 8)] is, in Eqn.(3 . 7), an added constant
proportional to the cosine of the phase difference. When the two sinusoids
are in phase this will be a maximum of 2.O--when they are 90° out of
phase the added constant is zero. Now, when we take the average of the
complete expression (i.e., Eqn. 3.7) over 211" radians, any sinusoid will
contribute zero to the average value, and the added constant [ i . e . ,
Eqn.(3.8)] will be the only thing remaining. It is therefore apparent that
when we multiply a waveform (composed ofa single complex sinusoid) by
a cosine wave ofthe samefrequenc)t the cosine component in the complex
waveform will yield an average value the sine term will yield none. If we
multiply this complex waveform by a sine wave. the sine component ofthe
waveform will yield an average and the cosine will yield none. Equation
(3.7) reveals everything-frequency doubling, phase angles adding,
amplitude divided by two... even orthogonality. A magnificent expression.
We must consider one last technicality here-the multiplication
of a sinusoid by the complex exponential:

------ (3.9)
This is an important exercise, for it represents the most common fonn in
which the Fourier Integral is written:
+ ...

F(w} = f(t} e-iOJl dt ----------- (3. 10)


. ...
26 Chapter 3

where f(t} in (3. 1 0) may be represented by the expression for a single


complex sinusoid as in (3.9). For the Fourier transform, the phase of the
complex exponential (i.e., cP2) is zero, so we may drop this term and
expand Eqn. (3.9) as follows:
{(ei(c.>I + 1/11) + e-i(c.>I 1/II) /2 } eic.J1
+ =
(ei(lc.J1 + 1/11) + e-i(c.Jt) . ei(c.JI) . e-il/l/)/2
and as we explained in the footnote on page 1 0, e-i(WI) . ei(wt) indicates a
product of complex conjugates and is simply equal to 1 . Therefore:

----- (3. 1 1 )
so multiplication of a real sinusoid by the complex exponential ei(wt) results
in a phasor which rotates at 2wt and has a phase angle equal to cPl ' Now,
there is also a vector constant e-H/>112 which, we recognize, breaks into the
components [COS(cPl) - iSin(cPl)]I2. If the sinusoid inf(t} has magnitude
Mn, this operator breaks it into real and imaginary phasor components
(divided by 2).
The integral finds the area under the curve described by the right­
hand side of Eqn. (3. 1 1 ), and the oscillating nature of the first complex
exponential will contribute nothing to the final value. Integration of
Equation (3. 1 1 ) then, must ultimately yield only the phasor of the complex
sinusoid of f(w}. That, of course, is precisely what we expectfrom the
Fourier transform.

3.4 COMPONENT ORTHOGONALITY

Orthogonality is the phenomenon of the product of two sinusoidal


functions yielding an average value of zero (averaged over any number of
full cycles) when either:

1 ) the sinusoids are de-phased by 90° or,


2) the sinusoids are of integer multiple frequencies.
This condition of orthogonality is imperative if we are to resolve functions
into their frequency domain components by the mechanism of the DFT.
We have just shown that, when we multiply two sinusoids of the same
frequency, using the exponential expressions we have derived for sinusoids,
orthogonality for 90° de-phased sinusoids is obtained. We must now
expand that demonstration to show orthogonality for integer multiple
The Unique Sinusoid 27

frequency sinusoids. Before we undertake this demonstration, however, we


must establish some fundamental facts. For example, the average value of
a sinusoid (taken over a full cycle) is zero. If you do not see the validity
ofthis, you are assigned the homework of proving (see Appendix 1 . 1 ) that
the average value of a sinusoid is zero. If you prove otherwise, it will not
be necessary to complete the rest of this chaptet .. you're way ahead of the
rest of us....
Having established that
its average value is zero , i t 's This positive area
equals
reasonably apparent that adding
Ihis neeative area
a full cycle of sinusoid to some
fun c t i o n w i l l n o t c h a n g e the I"------�__��---y
average value of that function
(you may have already foreseen Averale value
equals zero
this profound observation but,
again, if not ... homework).
Finally, before we tackle
Fig 3 . 1 0 - Average Value of Sin(x)
different frequency sinusoids,
let's review orthogonality of same frequency sinusoids. We have
illustrated multiplication of same frequency sinusoids by considering their
exponential form:

Cos(wt + tPt)Cos(wt + �) =

[(e;(WI + 1/>1) + e·;(WI + 1/>1) (e;(WI + 1/>2) + e-;(WI + 1/>2) ]/4 (3.6)

and as we pointed out, the right-hand side of (3.6) reduces to:

i(2"" + �I .. �2) + e-i(2"" + �I .. �2) + ej(�/4>2) + ej(1/>24>1) ]/4


[(e (3.7)

Now, we immediately recognize that the left-most two terms of expression


(3.7) are nothing but a sinusoid:

[(e
'f2W1 + 1/>1 + 1/>2) + e-i(2"" + 1/>1 + 1/>2) ]/4 = �Cos(2wt + cJ>.r) (3. 12)

where cJ>.r = tPt + �

and the right-most two terms yield a constant determined by the phase
difference between the two sinusoids:

(3. 13)
28 Chapter 3

From our introductory remarks, the sinusoid [Eqn. (3. 1 2)] contributes
nothing to the average value of this function, but the average value of a
constant term is j ust the constant term. So, then, the average value of the
product of two sinusoids will depend on the phase relationship between the
two sinusoids-if the two are in phase (i.e., cJ>. � = 0) we will obtain an
average value equal to one-half the product of the amplitudes of the two
sinusoids! If, howeve� the phase relationship is 7r/2 (i.e., cJ>.-<P2 = 90°) the
average value of the product will be zero! This l atter result is the
phenomenon of orthogonality between sine and cosine functions!
So, what about orthogonality between sinusoids of different
frequencies then (which is the real question here)? Returning to our
consideration of the average value of a sinusoid, we reiterate that it is
necessary to deal withfull cycles of a sinusoid for the average value to be
zero. We can always satisfy this requirement by scaling the frequency term
so that exactly one full sinusoid fits into the domain of the function we are
working with. That is, if our sinusoid is given by Cos(27rfot), and the
domain is t = 0 to To, we simply makefo = lITo. When t = To then, and we
are at the end of the domain, the value of the argument will equal 27r and
we will have constructed one full cycle of sinusoid (within the domain of
defin ition). It's also apparent that if we limit frequencies to integer
multiples of fo, then every allowed frequency will provide an integer
number of full cycles within the domain, and every sinusoid at an allowed
frequency will have an average value of zero (see Fig. 3 . 9) .
Allowing only integer multiple frequencies then, what happens
when we multiply two sinusoids? Equation (3 .38) must become:

[(ei(WI t/JI) + e-i{WI + t/JIJ) ( ei(nwl + t/J2J + e-i(nwl + t/J2J )] /4


Cos(wt + cJ>.)Cos(nwt + �)
+
(3. 14)
where n takes on integer values only.
We will simplify the situation here by making both cJ>. and cJ>2 zero so they
disappear from the equation. The reason for this will be obvious at the end
of this section. Now when we expand the expression on the right side of
this equation we obtain:

[ei{WI + nWlJ + e-i(WI + nWlJ + ei(WI-nWlJ + e-i(WI-nWlJ] /4 (3 . 1 5)


Factoring wt and collecting terms in the exponentials results in:
[ei[WI(1 + nJ] + e-i[WI(1 + nJ] + ei[WI(I-nJ] + e-i[WI(l-nJ]] /4 (3 . 1 6)
The Unique Sinusoid 29

There ! It is done-it is finished-it is beautiful!


What? You don't see it? Mein Gott im Himmel! You recognize
that the two exponentials on the left-most side are in the form of a cosine
and the two on the right-most side are also of the cosine form. You also
recognize that n is an integer multiple of the fundamental frequency. Look
at this equation ! When n equals 1 .0 we are multiplying sinusoids of the
same frequency. This equation then yields the following:

[( ei{2W1J + e-i{2W1J + ei{O)J + e-i{oJ) ] /4 (3 .17)


Now, eiO + e-iO = 2 (see footnote page 10). Furthermore, the first two
exponentials are a cosine of twice the frequency of the input func­
tions-this is simply the equation for multiplying two sinusoids of the
same frequency that we saw earlier-we already know this.
The really beautiful thing here is that this equation makes the
result of multiplying sinusoids of different frequencies (i.e., when n �)
obvious. What? You don't see that either? Ma-ma mia! When n equals
2, this equation becomes:

(3.18)
Both the left-most pair of exponentials and the right-most pair are cosine
functions! Both of these have an average value of zero! The average value
of the product of a sinusoid multiplied by a second sinusoid of twice the
frequency is zero!
Surely you see what happens when n = 3. No?? Sacre bleu!
[( ei{4W1)J + e-i{4W1J + ei{2W1J + e-i{2W1J)]/4 (3.19)
We still get two cosine waves. Only the frequencies are different. The
product of two sinusoids with a 3: I frequency ratio yields an average value
of zero again.
By now you can probably see where all of this is going. You
do?? Oooooh wow! You recognized the general relationship for the
product of two sinusoids of different frequency (fl and £2) is two other
sinusoids whose frequencies equal (fl + £2) and (fl - £2)? You saw that
only when fl = £2 will the difference equal zero, and only a frequency of
zero yields a constant term? That otherwise, we can keep increasing n until
Arizona freezes over, and we will never again get an average value out of
the product of two sinusoids of integer multiple frequencies? You see,
30 Chapter 3

then, that cosines of differentfrequency must be orthogonal functions.


Now, some of you will recall that we omitted the phase tenn from
our equations at the beginning of this illustration, and you may suppose
that we have cheated by a considerable amount. If thoughts such as these
are floating through your head right now, cheer up-I have a real treat in
store for you. Remember when I said the reason for omitting the phase
terms would become obvious later? Weeell, the mechanics of going
through this illustration with the phase terms is not significantly different
from going through it without the phase terms-we have left the exercise
of orthogonality vs. phase and frequency as "homework." It will count as
part of your grade. Showing what happens to sine waves alone earns a C+.
Those who do not think we have cheated, howeve� and see the
relationship between phase, frequency and orthogonality as intuitively
obvious may continue on.
We still haven't completely exposed the nature of these sinusoids,
but we will revisit this as we progress through the book. As we reveal the
nature of these sinusoids, you will see this really is beautiful. There is a
famous line from Sidney Lanier's "The Marshes of Glynn":

" ... Tolerant plains, that suffer the sea


and the rains and the sun

Ye spread and span


2
like the catholic man
who hath mightily won

God out of knowledge


and good out of infinite pain
and sight out of blindness
and purity out of a stain.

When the pieces fit together so precisely we realize God is indeed


in his heaven and the gears that make the world go 'round are greased and
running smoothly. The problem is man's ignorance.

2
Catholic in the sense of universal-broad in sympathies and interests.
CHAPTER 4

NETWORK ANALYSIS

We ended Understanding the FFT with a d i s c u s s i o n o f


convolution and filters-and that leads us directly to the topic o f network
analysis, filters and, eventually, transient analysis. We assume anyone
who's interested in this will be familiar with circuit analysis, but we'll
review the fundamentals just to get everyone started on the same foot. '

4.1 NETWORK ANALYSIS

1. The voltage drop across a resistor is given by the relationship:


E = IR. This, of course, is Ohm's law-the most fundamental equation of
electrical circuits.
2. The sum ofthe voltage drops across the "load" side of a circuit
must equal the applied voltage. When a voltage is applied to a closed
circuit it causes a current to flow and, by 1. above, a current through a
resistance "drops" a voltage. The applied voltagejorees a current through
the circuit and the dropped voltage pushes back against the applied force;
therefore, the current must become steady when the voltage dropped equals
the voltage applied (i.e., reaction equals action).
3. Several current carrying legs may tie together at a node (Fig.
4.1), but there can be only one voltage at any node! Similarly, there may
be several circuit elements in any leg (i.e., simple series circuit), and


consequently several voltages associated with these elements, but there can
be only one currentflowing in any leg.
Node
With the above fundamentals t
Branch
v" (Ieg)
we can write equations to determine
1/ . I, .
the current that will flow, and the In
t
voltage drops that will result, in terms
of the voltage applied to a circuit and
the voltage dropping elements of the
circuit. Figure 4.1
I
Electncal engineers will be old friends with the frequency domain. Much of
their education is presented directly in the frequency domain, and so they are pre-disposed
to accept the reality of Fourier transforms.
32 Chapter 4

4.2 THE VOLTAGE DIVIDER

© R2 ®
: Vbatt Rl

@ Rl ® R2 ©
Figure 4.2 - Voltage Drop
We may write the following equation for the circuit of Figure 4.2:

VBB = VRI + VR2 (VBB = Vbatt) (4.2A)


I I RI + I I R2 (4.2B)
I I (RI + R2 } (4.2C)

That is, the sum of the voltage drops across the resistors equals the applied
voltage (i.e., the battery voltage) or, stated the other way around, when the
battery voltage is included on the right hand of the equal sign, the voltage
drops around the loop sum to zero:

0 = VR I + VR2 - VBB ------------- (4.2D)

Now, most often, we would know the voltage applied and the
values of the resistors, and would determine the current by an inversion of
Eqn. (4.2C):

--------------- (4.3)

We could then determine the voltage drop across either ofthe two
resistors by simply applying Ohm's law. The configuration of Fig. 4.2 is
commonly used to attenuate a signal and is referred to as a "voltage
divider" (i.e., the two resistors divide the applied voltage between
themselves). The voltage across RI and R2 is given by:

VR I = I I RI = [VBB/(RI + R2)] RI --------- (4.4)


VR2 = I I R2 = [VBB/(RI + R2)] R2 - - - - - - - - - (4.4A)
so that:
- - - - - - - - - - - - (4.4B)
Network Analysis 33

4.3 MESH ANALYSIS

While many circuits take on a "half ladder" appearance (left, Fig.


4.3 }, configurations such as shown on the right side of Fig. 4.3 are not
uncommon. Network analysis of complicated circuits such as these (i.e.,
the determination of currents and voltages in the circuits) is accomplished
RI Rl
RI Rl

RJ R4 R4


R7

Figure 4.3 - Circuit Configurations

via simultaneous equations. The equations themselves are based on the


2
fundamental principles stated above plus Kirchoff's laws. There are two
laws-one says the sum of currents entering and leaving any node must be
zero and the other says the sum ofthe voltage drops around any loop must
be zero. These observations are, of course, very fundamental and apply to
both DC and AC circuits. [If we start from any node, and sum all the
voltage drops around any loop, it's apparent we will end up at the same
node and the same voltage. The sum of the voltage drops, no matter what
path we take, must therefore be equal to zero. Similarly, since the current
entering a node must equal the currents departing that node, the sum of the
currents at any node must be zero. These bits of insight are Kirchoff's
voltage and current laws (published in 1 848).]
In Fig. 4.4 there are three loops (or meshes). To write our
equations we idealize the current flowing in each loop as an independent
current. Under this condition the real current flowing through R I 2 is equal
to the difference between 11 and 12 (since both independent currents flow
through this resistor). RI 2 is therefore called the mutual impedance
between loops I and 2. A similar situation exists for the current flowing
through R23 between loops 2 and 3. The mesh impedance of any loop is the
sum of all the impedances through which the mesh current flows (e.g., the
2
Gustav Robert Kirchoff (pronounced Kirk ' hoj) another "world-class" Gennan
physicist ( 1 824-1 887).
34 Chapter 4

Mesh 1 impedance is equal to R. + Rd. The set of simultaneous equations


is generated by summing the voltage drop around each mesh (i.e., the
applied voltage3 equals the voltage drops due to the mesh current flowing
through the mesh impedance, minus the voltage drops introduced via the
mutual impedances and currents in the other meshes; therefore:

I.(R. + R. 2) -12(R 12) -1)(0) (4.5A)


-1.(R. 2) +12(R. 2+R2+R23) -1)(R2) (4.5B)
-1.(0) -12(R23) +13(R23+R3+�) (4.5C)
RI Rl RJ

/\R4
13 .-/
Figure 4 .4 Mesh Analysis
-

This yields three simultaneous independent equations in three unknowns


which may always be solved for the unknown currents. A great deal of
computation is involved and today circuit analysis is done almost
exclusively on computers. We will look at this shortly, but first we must
talk about "AC" circuits and the unique characteristics peculiar to this
aspect of circuit analysis.4

4.4 AC CIRCUI T ANALYSIS

The "AC" stands for A lternating Current and generally refers to


a sinusoidal driving signal (i.e., sinusoidal voltage source) and a sinusoidal
response (i.e., a sinusoidal current). Besides electrical resistance, there are
two other fundamental elements in ac electrical circuits that l imit
current-inductance and capacitance. These elements are characterizedas
follows: while the voltage across a resistor is proportional to the current
flowing through it, the voltage across an inductor is proportional to the rate

3 A voltage source is always indicated as a simple voltage generator and an

internal impedance It makes no difference whether the voltage is generated by thermal


activity (noise), chemical activity (battery), or whatever-voltage is voltage.
What we have been considenng so far is DC (i.e., direct current) analysis
4
which is a steady currents that flows when we use a battery or DC power supply.
Network Analysis 35

of change (i.e., the derivative) of the current flowing through it, and the
voltage across a capacitor is proportional to the accumulation (i.e., the
integral) of the current flowing into it (or, if you prefe� the charge):

V L = L dildt and V c = lIC I i dt (4.6A&B)

where: L = value of inductance (in Henryss)


V L = voltage dropped across an inductor
C = value of capacitance (in FaradssA)
V c = voltage dropped across a capacitor

It's remarkable that these three elements are the fundamental elements of
passive, linea� time-invariant circuits.6 The above equations are for the
time domain response of these elements, but undergraduate students are
taught about these components in the frequency domain.

4.5 OHM'S LAW FOR AC CIRCUITS

Ohm's law defines resistance as the ratio of voltage to current.


For an ac current, at any given frequency, inductors and capacitors yield
a constant ratio of ac voltage to ac currene-so they will obey this same
relationship. Still, the behavior of these phase shifting, frequency
dependent components is quite a bit different than resistors; and so, instead
of calling their opposition to current flow resistance, we use the term
reactance. The reactance equations are:

XL = j27rjL (4.7)
and: Xc I/j2 7rjC
= (4.8)
where: XL = inductive reactance
Xc = capacitive reactance
L = inductance
C = capacitance
j = i = v- I
S
For Joseph Henry. Born in 1 797, fourteen years after the Amencan
Revolution Ahe was one of the first world class American scientists (after Franklin).

Named in honor of the illustrious Michael Faraday, of course.
6
See Chapter 2, SectIon 2.2.
7
For sinusoids at any given frequency, it's obvious the rate of change is
proportional to amplitude. The quantity of charge accumulated over any half cycle is
likewise obviously proportional to the amplitude and, being discharged on the second half
cycle, must necessanly yield an ac current proportional to amplitude.
36 Chapter 4

The j accounts for the 90° phase shift, of course, and we combine these
reactive elements with resistance just as we combine real numbers with
imaginary numbers. The resulting complex quantity is given the name
impedance and is designated by the symbol Z. For ac circuits, impedance

Z = R + j(211'fL - l /(211"fC» (4.9)

where: 1/j = 1/ v- 1 = (- l - v- 1 .v- 1 )N'- 1 = - 1 - v- 1 = -J

is used just as resistance is for dc circuits. We may plug these expressions


for impedance directly into the simultaneous equations discussed earlier
and analyze AC networks (but, of course, we must use complex arithmetic
and solve the equations on a frequency by frequency basis).
But how, exactly, do we come by Eqns. (4.7) to (4.9)? First of
all, these equations refer to the behavior of cin::uits when driven with
sinusoidal voltages. We obtain Eqns. (4.7) and (4.9) by substituting
sinusoidal driving functions into Eqns. (4.6 A&B).

IL = I sin(wt) --------------------- (4. 1 0)


where: IL = current through the inductor
I = peak value of the sinusoid
w = 211"f = 211"ITo = angular velocity
then:
VL = L dildt = L d(l sin(wt» /dt = wL-I cos(wt)
= jwL-I sin(wt)
and:
XL = VdIL = VL/l sin(wt) = jwL = j27rjL - - - - - - (4.7A)

We may derive Eqn. (4. 8 ) in exactly the same way. The


important thing to note here is that we have now moved our analysis onto
a sinusoidal basis function-we are analyzing what happens when we drive
our circuits with sinusoids. As we know, sinusoids represent a special
case, and a sinusoid applied to the input of a linear circuit will always yield
a sinusoidal response. It's apparent, then, the selection of sinusoids as the
basis function for network analysis is not arbitrary. More intriguing still
is the similarity of sinusoids as the basis function in Fourier analysis-in
the next two chapters we shall expand on this similarity.
CHAPTER 5

AC CIRCUIT ANALYSIS PROGRAM

We will need a program to solve the simultaneous equations


discussed in Chapter 4. Again, you may have no interest in a program to
do network analysis and, so long as you understand we will use this
program to obtain the steady state transfer function of circuits in the next
chaptel; you may skip to the next chapter
The overall operation of the program is as follows: At line l O we
begin initializing, generating constants, and getting user defined constants
such as frequency range, frequency steps and number of meshes. [Note:
the number of meshes (which we call KB) determines the number of
equations and the number of terms in each equation] . At line 1 20 wejump
down to the circuit input routine where all the self and mutual impedances
are input. At line 1 30 we jump down to calculate the transfer function of
the circuit-the business end of the program. At line 140 we print the
Output Menu which allows either drawing the transfer function on the
computer screen or printing out the attenuation/phase vs. frequency to a
printer. . . nothin' to this job.

, ********************************************
, * ACNET 05 - 0 1 - NETWORK MESH ANALY S I S *
I ********************************************
10 SCREEN 9, 1 : COLOR 1 5 , 1 : CLS
1 2 LOCATE 1 , 20 : P R I NT "NETWORK MESH ANALYS I S " : PR I NT PR I NT
20 PI = 3 . 1 41 592653589793#: P I 2 = 2 * P I : E R F L G = 0
30 PR I NT "A UN I T VOLTAGE SOURCE I S ASSUMED FOR MESH 1 1 "
40 I NPUT "ENTER DESI RED FREQUENCY RANGE ( FM I N , FMAX ) " ; FMN , FMX
50 I NPUT "ENTER NUMBER OF FREQUENCY STEPS PER DECAD E " ; D E L F
6 0 FBOT = I N T ( LOG ( FMN ) / LOG ( 1 0 » , COMMON LOG FMN
70 FTOP = I N T ( LOG( FMX) / LOG( 1 0 » , COMMON LOG FMX
80 I F LOG( FMX) / LOG ( 1 0 ) - FTOP > . 000001 THEN FTOP = FTOP + 1
90 FSTEP = 1 0 A ( 1 / DEL F ) , FREQ STEP MULT I P L I E R
1 00 I NPUT "ENTER THE NUMBER OF MESHES"; KB
1 1 0 D I M COMP ( 3 , KB, KB ) , Z ( 2 , KB, KB+1 ) , F ( 2 , « FTOP- FBOT ) * D E L F )+ 1 )
1 20 GOSUB 20000 ' I NPUT C I R CU I T ELEMENTS
130 GOSUB 1 0000 ' CALCULATE X FER I MPEDANCE
140 CLS : LOCATE 2, 20: PR I NT "OUTPUT MENU"
150 P R I NT P R I NT " 1 = PLOT DATA"
155 PR I NT : PR I NT " 2 = PR I NT DATA ( TO SCREE N ) "
160 P R I NT : PR I NT " 3 = OUTPUT T O P R I NTER"
1 70 LOCATE 1 8 , 3: PR I NT "9 = EX I T "
180 PR I NT : PR I NT " I NPUT SELECTON"
1 90 AS = I NKEYS: I F AS = " " THEN 190
200 ON VAL (AS) GOSUB 800, 1 0090, 600, 235 , 235 , 235 , 235 , 235 , 240
38 Chapter 5

230 GOTO 1 40
235 RETURN
240 END

I ***********************************
, * PR I NT OUTPUT TO PR I NTER *
I ***********************************
600 I NPUT "C I RCU I T NAME "; AS
605 LPR I NT DATES, T I ME S : LPR I NT : LPR I N T AS : LPR I NT LPR I NT
610 FO = 1 0 � FBOT : F = F O : PLC = 52
615 FOR I = 1 TO « FTOP - FBOT ) * DEL F ) + 1
620 LPR I NT US I N G "##### . ##_ " ; F ; , PR I NT FREQUENCY
625 LPR I NT U S I NG "##. ####_ "; F ( 1 , I ) * RTERM ; , PR I NT VOLTAGE
630 JS = "+j " : I F SGN ( F ( 2 , I » < 0 T HEN JS = " - j "
635 LPR I NT J S ; : LPR I NT US I NG "##. ####_ "; ABS ( F ( 2 , I )*RTERM ) ;
640 MAG = SQR ( F ( 1 , I ) � 2 + F ( 2 , I ) � 2 )
642 I F MAG = 0 T HEN LPR I N T " 0 . 00000 I 0 . 00" : GOTO 660
644 LPR I NT US I NG "##. ####_ # "; RTERM * MAG; : LPR I NT " I " ;
646 I F F ( 1 , I ) = 0 AND F ( 2 , I ) >= 0 T HEN BTA = P I I 2 : GOTO 655
648 I F F ( 1 , I ) = 0 AND F ( 2 , I ) < 0 T HEN BTA = - P I I 2: GOTO 655
650 BTA = ATN ( F ( 2 , I ) I F ( 1 , I » : I F F ( 1 , 1 ) <0 THEN BTA = BTA+P I
655 LPR I NT U S I NG "### . ##" ; BTA * 1 80 I PI ' PR I NT DEGREES PHASE
660 I F I < PLC T HEN 690 ' CHK END O F PAGE
665 LPR I NT " (MOR E ) "
670 LPR I NT CHRS( 1 2 ) , FORM FEED
675 PLC = PLC + 5 2 ' SET END O F NEXT PAGE
680 FOR LCTR = 1 TO 3 : LPR I NT : NEXT ' PR I NT HEAD SPACE
690 F = FO * FSTEP � I ' SET NEXT FREQUENCY
692 NEXT I ' P R I NT NEXT L I NE
694 LPR I NT CHRS( 1 2 ) , FORM FEED F I NAL PAGE
698 RETURN

, ***********************************
, * PLOT X FER FUNCT I ON *
I ***********************************
800 SCREEN 9, 1 : COLOR 1 5 , 1 : CLS ' SELECT 640 x 350 RESOLUT I ON
810 XO = 2 0 : YO = 20 : YX = 320 : XX = 620 ' 600 x 300 GRAPH
812 L I NE ( X O , Y O ) - ( X O , YX) , DRAW COORD I NATES
814 L I NE ( X O , YX ) - (XX , YX)
820 FREQNO = ( FTOP - FBOT ) * DEL F : YMAX = 0
822 FOR I = 1 TO FREQNO
824 Y1 = SQR ( F ( 1 , I ) � 2 + F ( 2 , I ) � 2 )
826 I F Y 1 > YMAX T HEN YMAX = Y 1
828 NEXT I
830 KX = 600 I FREQNO: KY = 200 I (YMAX * RTERM)
832 LOCATE 8 , 1 : PR I NT YMAX * RTERM
834 Y 1 = RTERM * SQR ( F ( 1 , 1 ) � 2 + F ( 2 , 1 ) � 2 )
836 L I NE ( X O , YX - ( KY * Y1 » - ( XO , Y X - ( KY * Y 1 »
840 FOR I = 1 TO FREQNO
842 Y1 = RTERM * SQR ( F ( 1 , I ) � 2 + F ( 2 , I ) � 2 )
Circuit Analysis Program 39

844 L I NE - ( XO + ( I - 1 ) * KX , YX - ( KY * Y 1 »
846 NEXT
848 LOCATE 24 , 2: P R I NT 1 0A F BOT; : LOCATE 24 , 73 : P R I N T 1 0A F TOP;
850 LOCATE 25, 30 : P R I NT " FREQUENCY"; : LOCATE 25, 2
852 I NPUT AS
854 RETURN
, ***********************************
, * CALCULATE XFER FUNCT I ON *
, ***********************************
1 0000 FO = 1 0 A FBOT : F = F O : FREQ = 0 ' FREQ = DATA PO I NT COUNTER
1 00 1 0 GOSUB 1 1 000 ' CALC I MPEDANCE MAT R I X
1 0020 GOSUB 1 2000 ' SOLVE FOR CURRENTS
1 0040 ' GOSUB 1 3000 ' PR I NT OUT CURRENTS
1 0050 FREQ = FREQ + 1 ' SET FOR NEXT DATA PO I NT
1 0060 F ( 1 , FREQ) = Z( 1 , KB , KB + 1 ) : F ( 2 , FREQ) = Z ( 2 , KB , KB+1 ) , SAVE
1 0070 F = FO * FSTEP A FREQ ' GET NEXT FREQUENCY
1 0080 I F F <= FMX + . 1 T HEN 1 00 1 0 ' JOB DONE?
1 0090 CLS : PLC = 20 ' CLEAR SCREEN FOR PR I NTOUT
1 0 1 00 F = 10 A FBOT ' GET BOTTOM FREQUENCY
1 0 1 1 0 FOR I = 1 TO « FTOP - FBOT ) * DEL F ) + 1
1 0 1 20 PR I NT U S I N G "##### . ##_ "; F; , PR I NT FREQUENCY
1 0 1 30 PR I NT U S I N G "##. ####_ "; F ( 1 , I ) * RTERM; , ? REAL COMPONENT
1 0 1 40 J S = "+j " : I F SGN ( F ( 2 , I » < 0 T HE N J S = " - j "
1 0 1 50 PR I NT " "; JS;
1 0 1 60 PR I NT US I NG "#. ####_ "; ABS( F ( 2 , I )*RTERM ) ; ' PR I NT I MAG I NARY
1 0 1 70 MAG = SQR ( F ( 1 , I ) A 2 + F ( 2 , I ) A 2 ) , F I ND MAGN I TUDE
1 0 1 80 I F MAG = 0 THEN PR I NT " 0 . 0000 10 . 00" : GOTO 1 0240
1 0 190 PR I NT US I NG "#. ####_ # "; RTERM * MAG; : PR I NT " I " ;
1 0200 I F F ( 1 , I ) = 0 AND F ( 2 , I ) >= 0 T HEN B T A = P I I 2 : GOTO 1 0230
1 02 1 0 I F F ( 1 , I ) = 0 AND F ( 2 , I ) < 0 T HEN BTA = - P I I 2: GOTO 1 0230
1 0220 BTA = ATN( F ( 2 , 1 )1 F ( 1 , I » : I F F ( 1 , 1 ) <0 T HEN BTA = BTA+P I
1 0230 PR I NT USING "### . ##" ; BTA * 1 80 I PI ' P R I NT PHASE I N D E G .
1 0240 I F I < P L C T HEN 1 0270 ' SCREEN FULL?
1 0250 PLC = PLC + 20 : PR I NT " (MORE ) "
1 0260 I NPUT "ENTER T O CONT I NUE"; A S ' WA I T FOR USER
1 0270 F = FO * FSTEP A I ' NEXT FREQ
1 0280 NEXT I ' P R I NT NEXT COMPONENT
1 0290 I NPUT "ENTER TO CON T I NUE"; AS ' WA I T
1 0300 RETURN ' WERE OUTA HERE

, ***********************************
, * COMPUTE I MPEDANCE *
I ***********************************
1 1 000 CLS : WF = P I 2 * F ' GET ANGULAR FREQUENCY
1 1 0 1 0 FOR I = 1 TO KB ' FOR ALL MESHES
1 1 020 Z( 1 , I , I ) = COMP O , I , I ) , GET RES I STOR VALUE
1 1 030 I F COMP ( 3 , 1 , 1 ) = 0 T HEN Z ( 2 , 1 , 1 ) = WF*COMP ( 2 , 1 , 1 ) : GOTO 1 1 060
1 1 040 I F F = 0 T HEN Z ( 2 , 1 , 1 ) = - 1 E+ 1 8 : GOTO 1 1 060
1 1 050 Z ( 2 , I , I ) = WF * COMP ( 2 , I , I ) - 1 I ( W F * COMP ( 3 , I , I »
1 1 060 FOR J = I + 1 TO KB ' GET MUTUAL I MPEDANCES
40 Chapter 5

1 1 070 Z ( 1 , I , J ) = - COMP( 1 , I , J ) , MUTUAL RESI STANCE


1 1 080 I F COMP ( 3 , I , J ) = 0 THEN Z ( 2 , I , J ) = - W F*COMP ( 2 , I , J ) : GOTO 1 1 1 1 0
1 1 090 I F F = 0 T HEN Z ( 2 , I , J ) = 1 E + 1 8 : GOTO 1 1 1 1 0 ' FUDGE D C CAP
1 1 1 00 Z ( 2 , I , J ) = - ( W F * COMP ( 2 , I , J ) - 1 / ( W F * COMP ( 3 , I , J » )
11110 Z(2, J , I ) = Z(2, I , J ) : Z( 1 , J , I ) = Z( 1 , I , J )
1 1 1 20 NEXT J ' NEXT MUTUAL I MPEDANCE
1 1 1 30 NEXT I ' NEXT MESH
1 1 1 40 Z ( 1 , 1 , KB + 1 ) = 1 : Z ( 2 , 1 , KB + 1 ) = 0 ' D R I VE PO I NT VOLTAGE
1 1 1 50 FOR I = 2 TO KB ' SET ALL OT HER MESH VOLTAGE SOURCES ( ZERO)
1 1 1 60 Z ( 1 , I , KB + 1 ) = 0: Z ( 2 , I , KB + 1 ) = 0 ' ALL ZERO
1 1 1 70 NEXT I
1 1 250 RETURN

I ***********************************
, * SOLVE FOR CURRENTS *
I ***********************************
1 2000 FOR J = 1 TO KB ' STEP THROUGH ALL D I AGONAL LOCAT I ONS
1 2200 ' GET A " 1 " COE F F I C I EN T ON T HE D I AGONAL
1 2 2 1 0 I F Z ( 2 , J , J ) = 0 T HEN ZRE = 1 / Z ( 1 , J , J ) : Z I M = 0 : GOTO 1 2300
1 2220 I F Z ( 1 , J , J ) = 0 T HEN ZRE = 0 : Z I M = - 1 / Z ( 2 , J , J ) : GOTO 1 2300
1 2230 BTA = ATN ( Z ( 2 , J , J ) /Z( 1 , J , J » : I F Z ( 1 , J , J ) <0 T HEN BTA = BTA+PI
1 2240 BTA = . 5 * S I N ( 2 * BTA)
1 2250 ZRE = BTA / Z ( 2 , J , J ) : Z I M = - BTA /Z ( 1 , J , J ) ' I NVERT Z ( x , J , J )
1 2300 FOR K = J TO KB + 1
1 23 1 0 Z1 = Z( 1 , J , K ) * ZRE - ( Z ( 2 , J , K) * Z I M )
1 23 1 5 Z ( 2 , J , K ) = Z ( 1 , J , K ) * Z I M + ( Z ( 2 , J , K ) * ZRE ) : Z ( 1 , J , K ) = Z 1
1 2320 NEXT K
1 2330 FOR I = 1 TO KB ' GET 0 I N T H I S COL . FOR ALL OTHER EQN S .
1 2340 I F I = J T H E N 1 2400
1 2350 XT = Z ( 1 , I , J ) : YT = Z ( 2 , I , J ) : I F XT =0 AND YT =0 THEN 1 2400
1 2360 FOR K = J + 1 TO KB + l ' DON ' T BOTHER W I T H "ZERO" POS I T I ONS
1 2370 Z( 1 , I , K ) = Z( 1 , I , K) - ( Z ( 1 , J , K ) * XT - ( Z( 2 , J, K ) * YT»
1 2380 Z ( 2 , I , K ) = Z(2, I , K) - ( Z( 1 , J, K) * YT + ( Z( 2 , J, K ) * XT »
1 2390 NEXT K
1 2400 NEXT I
1 2 4 1 0 NEXT J ' REPEAT FOR ALL D I AGONAL POS I T I ON S .
1 2420 RETURN

I ***********************************
, * P R I NTOUT CURRENTS *
I ***********************************
1 3000 CLS : PR I NT
1 30 1 0 FOR I = 1 TO KB
1 3020 PR I NT " 1 " ; I ; "=";
1 3030 PR I NT U S I N G "### . ###" ; Z ( 1 , I , KB + 1 ) ;
1 3040 PR I NT "+j " ;
1 3050 PR I NT U S I N G "### . ###" ; Z ( 2 , I , KB + 1 )
1 3060 NEXT I
1 3080 RETURN
Circuit Analysis Program 41

I ***********************************

, * I NPUT C I RCU I T ELEMENTS *

, ***********************************

20000 PR I NT : PR I NT " I NPUT C I RCU I T ELEMENTS"


200 1 0 PR I NT : GOSUB 21 000 ' PR I NT I NSTRUCT I ONS
20020 FOR I = 1 TO KB
20030 PR I NT : PR I NT " I NPUT VALUES FOR MESH " ; I : PR I NT
20040 PR I NT "ENTER MESH SELF RESI STANCE , I NDUCTANCE , CAPAC I TANCE " ;
20050 I NPUT COMP ( 1 , I , I ) , COMP ( 2 , I , I ) , COMP ( 3 , I , I )
20060 FOR J = I + 1 TO KB
20070 PR I NT "ENTER MESH " ;
20080 PR I NT U S I N G "##_ " ; I ; J ;
20090 PR I NT " MUTUAL RESI STANCE , I NDUCTANCE , CAPAC I TANCE " ;
20 1 00 I NPUT COMP( 1 , I , J ) , COMP ( 2 , I , J ) , COMP ( 3 , I , J )
201 1 0 COMP( 1 , J , I )=COMP ( 1 , I , J ) : COMP ( 2 , J , I )=COMP ( 2 , I , J )
20125 COMP ( 3 , J , I ) = COMP ( 3 , I , J )
20130 NEXT J
20140 NEXT I
201 50 I NPUT "ENTER TERM I NAT I ON RESI STANCE"; RTERM
20160 RETURN
I ***************************************

, * *
I N STRUCT I ONS
, ***************************************

21 000 PR I NT " 1 ) LAYOUT C I RCU I T I NTO MESHES"


21010 PR I NT "2) MESH SELF I MPEDANCE = ";
21015 PR I NT "SER I E S SUMMAT I ON OF ALL I MPEDANCES I N LOOP"
21 020 PR I NT "3) MESH MUTUAL I MPEDANCE = " ;
21 025 PR I NT "COMMON I MPEDANCES BETWEEN LOOPS " : PR I NT
2 1 030 I NPUT "ENTER TO CON T I NUE"; AS
21 040 RETURN

5.1 CIRCUIT INPUT

A note about data input is in order. All mesh self-impedances and


mutual impedances must be reduced to a single series string of resistance,
inductance and capacitance. When summing inductors and resistors within
a loop, simply add them, but series capacitors add as:

A I S mh (milli-henry) inductor is input as O.o I 5 and a 1 2.25JLfd (micro­


farad) capacitor is input as 1 2.25E-6. In all cases the mesh and mutual
impedances are input as R,L,C (e.g., we input 1 000 ohms resistance, I S mh
inductance, and 1 2.25 JLfd capacitance as 1 000, O.o I 5, 1 2.25E-6).
42 Chapter 5

For example, we would input the following six pole Butterworth


circuit as follows: mesh I self impedance (Z l l ) is input as 0, 1 5 .47,
1 7.42E-6 (i.e., zero resistance, 1 5 .47 hy of inductance, and 1 7.42 ILfd of

15.47 8 1 5.47 8 7.528

Ikn

;3../
Figure 5. 1 - 6 Pole Butterworth (fco = 1 6 Hz)
capacitance). The mutual impedance between meshes I and 2 (Z I 2) is
input 0, 0, 1 7.42E-6. Z I 3 is, of course, 0, 0, 0 because there is no mutual
impedance between these loops (that is, the current flowing in loop 3 will
introduce no voltage into loop I , so we multiply 13 by zero in the loop I
equation. Similarly with Z14. We now come to the self impedance of
loop 2 (Z22) and here we have 0, 1 5 .47, and 7.082E-6. The 7.082E-6 is
the series sum ofthe two capacitors in this loop! Z23 is 0, 0, 1 1 .94E-6 and
Z24 is, again, 0, 0, o. Okay, you know how to input the rest of the data.
[Note that we didn't have to input Z2 1 because it's identical to Z 1 2. You
also recognize that the terminating resistance is 1000 ohms.]
No provision is made for entering voltage sources into any of the
loops (since our primary intention is to analyze filter circuits), but this
provision can easily be added (lines 1 1 1 50 - 1 1 1 70). We also assume that
the output will be taken from the last loop (not necessarily true in the
general case). Furthermore, to get the output in terms of voltage, we must
input the termination resistance mentioned above. That is, this program
solves for mesh currents and, to get things back in terms of voltage, the
output mesh current must be multiplied by the filter terminating resistance
(see for example, lines 625, 635, 644, 832, 834, 842, l O BO, 1 0 1 60 or
1 0 1 90). If you want to see the current, simply make this value equal to
1 .0. The frequency range must be specified (in Hz-line 40) and the
number of steps within each decade of frequency must also be specified
(typically 8 to 1 00-line 50). In this program the frequencies are
computed logarithmically to keep the data from becoming excessive;
however, when using this program with the FFT we will have to calculate
frequency in an arithmetic progression.
Circuit Analysis Program 43

5.2 SOLVING THE SIMULTANEOUS EQUATIONS

The heart of this program is the subroutine located at 1 2000


* * * SOLVE FOR CURRENTS***. [Note: in electrical engineering the standard
technique for solving simultaneous equations is Determinants, which is a
side-street off of the main avenue of Matrix A lgebra. We will not use
determinants here but tackle the simultaneous equations directly.]
Our objective is to find the loop currents of Equations (4. 5). We
will do this by reducing the coefficients of all but the self-impedance loop
current to zero in each equation (i.e., we reduce the equations to the form :

VxJZx = I, +0 (S.4A)
Vy/Zy =0 +12 (S 48)
VziVz =0 +0 (S 4C)

where Vx, Zx, Vy, Zy, etc., will be determined in the process. To do this
we employ only the rules that we may multiply both sides of an equation
by equals without changing the equation, and we may add equals to both
sides of an equation without changing the equality. We start with:

VI I,(ZI I ) -12(ZI2) -1)(ZI 3 ) (S SA)


V2 -1,(Z2 1 ) +12(Z22) -1)(Z23) (S S8)
V3 -1,(Z3 1 ) -12(Z32) +1)(Z33) (S.SC)

where Z l 1 , Z22 and Z33 (along the diagonal) are the self impedances of
the loops and Z 1 2, Z 1 3, etc., are the mutual impedances between the loops
as explained earlieI Very well then, we start by dividing both sides of
Eqn. (5. 5A) by Z I 1 . VI becomes V l iZ 1 1 , the coefficient of I . becomes
unity, the coefficient of 12 becomes Z 1 2/Z 1 1 and the coefficient of 13
becomes Z 1 3/Z I I :

V I/ZI I I, -12(ZI 2/ZI I ) -1)(Z I 3/Z I I ) ( S SA,)

Next we turn to Eqn. (5.5B). Here we want to reduce the Z2 1 coefficient


to zero, and we can do this by multiplying a copy of Eqn. (5.5A 1 by Z2 1
and subtracting the result from (5.5B). Since the coefficient of I. has been
normalized to 1 .0, Eqn. (5.5B) will become:

V2-(V I '*Z2 I ) = 0 +12(Z22-(ZI2'*Z2 1 » -1)(Z23-(ZI 3 '*Z2 1 » (S.S8')


44 Chapter 5

where V I ', Z 1 2 ' and Z 1 3 ' are the coefficients shown in Eqn. (5.5A l We
then do the same thing to Eqn.(5.5C) (i.e., we reduce Z3 1 to zero by
subtracting a copy of (5.5A) multiplied by Z3 1 ) yielding:

VI' = I, -I2(ZI2') -1)(Z I 3 ') (5 6A)


V2' = 0 +12(Z22,) -1)(Z23') (5.68)
V3' = 0 -12(Z32') +1)(Z33') (5 6C)

We now tum to Equation (5.6B) and divide all of its terms (on both sides)
by Z22', normalizing the 12 coefficient to unity:

V2" = 0 (5 58")

We then subtract replicas of this equation (multiplied by Z 1 2 ' and Z32'


respectively) from Eqns.(5.6A) and (5.6C) resulting in:

VI" = I, -1)(Z1 3 ") (5 7A)


V2" 0 -1)(Z23") (5 78)
V3" = 0 +I)(Z33") (5 7C)

Finally, we normalize Z33", subtract from the other two eqns., and:

V I '" = I, (5.8A)
V2'" 0 (5 88)
·
V3 ' = 0 (5 8C)

This sort of manipulation is suggestive of Determinant mechanics


(studying Determinants is at least as muchfun as participating in a peanut
butter eating race). One advantage to this algorithm is that it simulta­
neously obtains a solution for all of the unknowns (which may occasionally
be useful). It can be speeded up by solving only for the output mesh
current, but the speed is only doubled (approximately).
Let's look at this exceedingly simple-minded program. We will
step (line 1 2000) through the diagonal elements Z(x,J,J) [x designates the
real/imaginary side of the impedance] of the equations with J specifying
row and column. First we normalize this coefficient to a value of
I .O-that is, we obtain the reciprocal of the diagonal component (lines
1 22 1 0 - 1 2250) and multiply this through the equation (lines 1 2300 -
1 23 20). In our case, it will frequently occur that either the real or
Circuit Analysis Program 45

imaginary component will be zero and, if this is so, our task is greatly
simplified (lines 1 22 1 0 and 1 2220)-otherwise, there is nothing left but to
crunch the numbers. Note that complex quantities make everything
complicated here. To obtain the reciprocal of a complex number we must
convert to polar coordinates; howeve� since we need the result back to
rectangular format, we take short-cuts (lines 1 2230 - 1 2250).

1 2000 FOR J = 1 TO KB ' STEP T HROUGH D I AGONAL - KB = # O F EQN S .


1 22DD ' GET A " 1 " COE F F I C I ENT O N T HE D I AGONAL
1 2202 ' Z ( 2 , J , J ) = I MAGI NARY PART OF I MPEDANCE & Z ( 1 , J , J ) = REAL PART
1 22 1 0 I F Z ( 2 , J , J ) = 0 T HEN ZRE = 1 / Z ( 1 , J , J ) : Z I M = 0 : GOTO 1 2300
1 2220 I F Z( 1 , J , J ) = D T HEN ZRE = 0: Z I M = · 1 / Z ( 2 , J , J ) : GOTO 1 2300
1 2230 BTA = ATN( Z ( 2 , J , J )/Z( 1 , J , J » : I F Z( 1 , J , J ) <0 T HE N BTA = BTA+P I
1 2240 BTA = . 5 * S I N ( 2 * BTA)
1 225D ZRE = BTA / Z ( 2 , J , J ) : Z I M = · BTA /Z ( 1 , J , J ) ' I NVERT Z ( x , J , J )
1 2300 FOR K = J TO KB + 1
1 23 1 D Z1 = Z ( 1 , J , K ) * ZRE - ( Z ( 2 , J , K) * Z I M )
1 23 1 5 Z ( 2 , J , K ) = Z ( 1 , J , K ) * Z I M + ( Z ( 2 , J , K ) * ZRE ) : Z ( 1 , J , K ) = Z 1
1 232D NEXT K

Once we have a " I " on the diagonal we must then get a "0" in this
column for all other equations. We do this, as we said, by subtracting a
copy of the normalized equation (after mUltiplying by the coefficient in the
Jth column) from each equation (lines 1 2330 - 1 24 1 0). We do not want to
subtract the normalized equation from itself, howeve� as that would get a
zero on the diagonal; so, when I = J (line 1 2340) we skip this routine.
Furthermore, we can speed things up considerably by avoiding needless
computation so, if the element is already zero, we forego all the arithmetic
(end of line 1 23 50). Also, we know that all the elements preceding this
column are already zero, and all the elements in this column will be zero
after we perform this routine, so we needn't actually do the arithmetic on
any columns to the left of J + 1 (line 1 2360). [Note: all voltage sources
are located at row position KB + I -see routine at lines 1 1 140- 1 1 1 70]

1 2330 FOR I = 1 TO KB ' GET 0 IN T H I S COL . FOR ALL OTHER EQNS .


1 2340 I F I = J T HEN 1 2400
1 2350 XT = Z( 1 , I , J ) : YT = Z ( 2 , I , J ) : I F XT = 0 AND YT = 0 T HEN 1 2400
1 2360 FOR K = J + 1 TO KB + " DON ' T BOTHER W I T H "ZERO" POS I T I ONS
1 2370 Z( 1 , I , K ) = Z( 1 , I , K) - ( Z ( 1 , J, K ) * XT - ( Z ( 2 , J, K) * Y T »
1 2380 Z ( 2 , I , K ) = Z ( 2 , I , K ) - ( Z ( 1 , J , K ) * Y T + ( Z ( 2 , J , K ) * XT »
1 2390 NEXT K
1 2400 NEXT I
1 24 1 0 NEXT J ' REPEAT FOR ALL D I AGONAL POS I T I ON S .
1 2420 RETURN
46 Chapter 5

When we come out of this routine we will have the mesh current (for every
loop) in the KB+ 1 location of each row. [The real part of the current is
located in the " 1" side of the array and the imaginary part in the "2" side.]
The data output routines are pretty much what they appear to be
so we will not take up time and pages with this trivia. You might want to
run this program and analyze the Butterworth filter shown in Fig. S. l-just
to see if it works.
This program does what all network analysis programs do-it
gives the transfer function ofthe circuit. If, some day, the big work station
is in use, and you need a quick answe� it could come in handy. For us,
howeve� its real purpose will become apparent in the next chapter
CHAPTER 6

GIBBS, FILTERS, AND TRANSIENT ANALYSIS

The network analysis we have considered so far is called Steady


State Analysis. It yields the response of a circuit to constant amplitude
sinusoids. As often than not, howeve� we are interested in the transient
response of the circuit-see Fig. 6. 1 .
The term transient response refers to
the response of a circuit to a sudden
change in the input amplitude. In steady
transient
state
audio work, for example, an oscilla­ response
response
tory response to a sudden change in
amplitude can be very annoying-in 1------4-
servo systems transient response is tim e -
Fig. 6. 1 - Transient/Steady State
paramount.

6.1 BAND LIMITED SIGNALS

We know, via Fourier analysis, that we may decompose signals


into their harmonic components. Now, the size of the frequency spectrum
(i.e., the width of the band offrequencies that make up any given signal),
is referred as its bandwidth. Theoretically, discontinuous waveforms
contain an infinite number of components. A perfect square wave, for
example, requires an infinite number of harmonics, and this implies an
infinite bandwidth. When working with real square waves, howeve� we
will always disregard the harmonics above some arbitrarily high value­
after all, the harmonics are becoming smaller and smaller with increasing
frequency. At some point their contribution to the total signal must
become negligible. I By throwing away all frequency components above
some cutofffrequency we limit the bandwidth and created a band limited
signal. In practice, all physically real signals are band limited; but, in the
art of engineering tradeoff and compromise, the limiting of bandwidth can
be a ticklish job.
------
I
This is true for all physically real wave fonns. In fact, if you look closely at any
real application you will almost certainly find no infinity is really involved. In practice,
limits to resolution and dynamic range leave infinities "suppositions of our imaginations."
48 Chapter 6

6.2 THE GIBBS2 PHENOMENON (THEORy)

Our comment about throwing away the harmonics above some


high frequency leads us to the Gibbs phenomenon. In its classical
manifestation, Gibbs ' phenomenon appears when we try to construct
discontinuous waveforms by summing harmonics. For example, in
constructing a square wave by summing the odd harmonics, we find that
even after a good replica of a square wave Overshoot __

has been obtained, there s t i l l exists a


transient overshoot and ringing at the
transitions (Fig. 6 . 2 ) . If we add more
harm o n i c c o m p o n e n t s , t h e t r a n s i e n t
becomes shorter, but the amplitude remains
Gibbs' Phenomenon
approximately 8.95% of the transition.
Let's use another computer program to
---L--T
-i-
m-e-_
-_
-_
-_
-_
-_
-_
-.--­
illustrate this effect:
Figure 6.2
10 REM * * * GENERATE SQUARE WAVE TRANS I T I ON ***
12 I NPUT "NUMBER OF TERMS" i N ' SELECT NO. OF HARMON I CS TO BE SUMMED
14 CLS
16 PR I NT"T I ME AMP L I TUDE'" PR I NT DATA HEADER
18 PR I NT
19 REM L I NE 20 SETS P I , T I ME I NTERVA L , AND T I ME STEP I NCREMENT
20 PI = 3 . 1 4 1 59265358# : K1 =2*P I /N : K2=P I / ( N*8)
30 FOR I = 0 TO K1 STEP K2 ' K 1 =T I ME I NTERVAL & K2=T I ME I NCREMENT
32 Y=O
40 FOR J=1 TO N STEP 2 ' N=NUMBER OF HARMON I CS SUMMED
42 Y=Y+S I N ( J * I )/J ' SUM I N HARMON I C CONTR I BUT I ON
44 NEXT J ' SUM ALL HARMON I CS
50 PR I NT US I NG "#. ####_ ## " i l /P I , Y*4/P I : REM PR I NT OUTPUT
60 NEXT I ' CALCULATE NEXT DATA PO I NT
70 I N PUT AS ' WA I T

Line 1 2 allows u s to select the number of sine wave components


to be summed into the square wave approximation. Lines 14 through 1 8
print the heading for our data printout. Line 20 defines the constants used
in the program: K l sets the distance we will investigate past the leading
edge of the square wave. Note that this distance is made inversely
proportional to the number of harmonic components summed-the reason
2
Josiah Willard Gibbs ( 1 839-1903) published a solution to this puzzle (Nature,
27 Apnl, 1 899) settling a dispute between A.A. Michelson and A E H Love Once again,
however, the math had been worked out and published 50 years earlier by Henry Wilbraham
Transient Analysis 49

will be apparent shortly. K2 selects the distance between successive data


points on the time base. This particular selection of constants will always
provide 16 data points which portray the leading edge of the square wave.
Lines 30 through 60 perform the familiar routine of summing
sinusoids to reconstruct a square wave. Line 30 sets up a loop which steps
through the time increments I, and line 40 sets up a nested loop which
sums in the value of each harmonic at that point.

FOR 1 00 COMPONENTS FOR 1 000 COMPONENTS

T I ME AMP L I TUOE T I ME AMPL I TUOE

0 . 000000 0 . 000000 0 . 000000 0 . 000000


0 . 001 250 0 . 247868 0 . 000125 0 . 247868
0 . 002500 0 . 483 181 0 . 000250 0 . 483 1 79
0 . 003750 0 . 694527 0 . 000375 0 . 694522
0 . 005000 0 . 872665 0 . 000500 0 . 872654
0 . 006250 1 . 01 1 305 0 . 000625 1 . 0 1 1 288
0 . 007500 1 . 1 07583 0 . 000750 1 . 1 07558
0 . 008750 1 . 1 62 1 70 0 . 000875 1 . 1 62 1 40
0 . 0 1 0000 1 . 1 790 1 3 0 . 001 000 1 . 1 78981
0 . 0 1 1 250 1 . 1 64758 0 . 001 125 1 . 1 64 728
0 . 01 2500 1 . 1 2791 6 0 . 00 1 250 1 . 1 27892
0 . 0 1 3750 1 . 077879 0 . 001 375 1 . 077871
0 . 0 1 5000 1 . 02391 1 0 . 001 500 1 . 02392 1
0 . 0 1 6250 0 . 974208 0 . 001625 0 . 974237
0 . 0 1 7500 0 . 935 1 5 1 0 . 001 750 0 . 935197
0 . 0 1 8750 0 . 91 08 1 0 0 . 00 1 875 0 . 91 0869

If you run this program for 100 and 1 000 frequency components,
you will get the results shown above. Except for "scaling" of the time
interval, there is little difference between these two runs. On adding more
components still, we find the overshoot remains a constant 8 .9% of the
transition amplitude (the transition in the above example is from - 1 to + 1).
Only the time scale will change.
This is known as the Gibbs phenomenon. The overshoot will
apparently remain at 8 . 9%-even when the number of components
increases without limit! This would seem to indicate a series of sinusoids
will never converge to a perfect reproduction of a discontinuous function;
still, we should not lose sight of the fact that as the number of components
approaches infinity, even though the amplitude of the overshoot remains
constant, the duration of the transient approaches zero, and zero duration
implies non-existence.
50 Chapter 6

It's sometimes imagined that the Gibbs phenomenon indicates a


defect in the DFT/Inverse DFT process, but you may transform and
inverse transform any data (until the silicon in your chips turns back into
sand), and you will always get the same waveform you started with! This
phenomenon concerns discontinuities (i.e., zero risetimes), and we will
never encounter zero risetimes in physically realizable signals and systems.
When considering finite risetimes we need only sample at rates that are
high (with respect to the rise-time of the signal) and we will faithfully
capture the finite number of harmonics in the signal (we will discuss
sampling and sampling rate in Chapter 1 0).

6.3 THE PRACTICAL SIDE OF GIBBS

The reason why the Gibbs transient is so persistent in the above


i llustrations is that, in every case, the summation of sinusoids is
incomplete. All of the components, from the harmonic at which we stop
the summing process up to infinity, are missing. If we add more
components we will smooth-out the present ripples, but since there is no
end to this summing process, it must forever remain incomplete, and we
will only find a new, higher frequency oscillation. Now, as idealists, we
can hold every real square wave accountable for an infinite number of
missing harmonic components (compared to an ideal, perfect, discontinu­
ous wave). So, then, shouldn't we see Gibbs' phenomenon present in
every real square wave? In fact, every time we filter-off the higher
frequency components of a real square wave (surely duplicating the
incomplete spectrum described above) the Gibbs phenomenon should
become apparent at the transitions !
Does this actually happen? We can easily find out by taking the
transform of a "perfect" square wave, truncating the upper harmonic
components, and reconstructing the time domain function. We will need
an FFT program to perform this exercise (and the remaining illustrations
in this chapter); so, we will borrow the following program (taken intact
from Appendix 1 0 of Understanding the FFT). We have added routines
to generate our initial square wave function, of course, and to truncate the
spectrum of the frequency domain function (as well as a couple of other
methods for filtering the spectrum). Other than that, it's the program
presented in Appendix 1 0 of Understanding the FFT.
Transient Analysis 51

6.4 THE FFT PROGRAM

10 I *** ( F FT06- 0 1 ) F F T/ I NV F F T ***


11 I TH I S PROGRAM I L LUSTRATES G I BBS PHENOMENON I N PRACT I CE
12 SCREEN 9, 1 : COLOR 1 5 , 1
13 CLS : PR I NT : PR I NT " I NPUT NUMBER OF DATA PO I NTS AS 2AN"
14 I NPUT "N = " ; N
16 Q = 2 A N : Q1 = Q - 1 : N1 = N - 1
18 Q2 = Q / 2 : Q3 = Q2 - 1 : Q4 = Q / 4 : Q5 = Q4 - 1 : Q8 = Q / 8
20 D I M C ( Q ) , se Q ) , KC(Q ) , KS ( Q )
22 xo = 5 0 : Y O = 200 : X S F = 5 0 0 / Q : YSF = 1 024 : I OFLG = 1
23 PI = 3 . 1 4 1 592653589793#: P2 = 2 * P I : K1 = P2 / Q : P I 2 = P2

24 I **** TWIDDLE FACTOR TABLE GENERAT I ON ****


26 FOR I = 0 TO Q: KC( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K1 * I )
28 I F ABS ( KC( I » < . 0000005 THEN KC( I ) = 0 I CLEAN UP TABLES
3D I F ABS ( KS ( I » < . 0000005 THEN KS( I ) = 0
32 NEXT I
34 FOR I = 1 TO Q1 : I NDX = 0
36 FOR J = 0 TO N 1
38 I F I AND 2 A J THEN I NDX = I NDX + 2 A ( N 1 - J )
40 NEXT J
42 I F I NDX > I THEN SWAP KC( I ) , KC( I NDX ) : SWAP KS( I ) , KS ( I ND X )
44 NEXT I
45 I **** PR I NT MA I N MENU ****
46 CLS
50 PR I NT SPC(30 ) ; "MA I N MENU " : P R I NT : PR I NT
52 PR I NT SPC ( 5 ) ; "1 = GENERATE STEP FUNCT I ON & TRANS FORM" : PR I NT
54 PR I NT SPC ( 5 ) ; "2 = FORWARD TRANSFORM" : PR I NT
56 PR I NT SPC ( 5 ) ; "3 = MOD I FY SPECTRUM" : PR I NT
58 P R I NT SPC ( 5 ) ; "4 = I NVERSE TRANSFORM" : PR I NT
60 PR I NT SPC ( 5 ) ; "5 = MOD I FY SYSTEM" : PR I NT
62 P R I NT SPC ( 5 ) ; "6 = EX I T " : P R I NT
70 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
80 AS = I NKEYS: I F AS = 1111 THEN 80
90 A = VAL(AS ) : ON A GOSUB 600, 1 60 , 1 000, 1 70 , 700, 990
95 GOTO 46

1 00 I **** F FT ROUT I NE ****


1 06 T9 = T I MER
112 FOR M = 0 TO N 1 : QT = 2 A ( N - M ) : QT1 = QT - 1
114 QT2 = QT / 2 : QT3 = QT2 - 1 : KT = 0
116 I *** UN I VERSAL BUTTERFLY ***
118 FOR J = 0 TO Q1 STEP Q T : KT2 = KT + 1
1 20 FOR I = 0 TO QT3 : J 1 = I + J : K = J 1 + QT2
1 22 CTEMP = ( C ( J 1 ) + C ( K ) * KC ( K T ) - K6 * S ( K ) * KS ( K T » / SK1
1 24 STEMP = ( S ( J 1 ) + K6 * C ( K ) * KS ( K T ) + S ( K ) * KC ( K T » / SK1
1 26 CTEMP2 = ( C ( J 1 ) + C(K) * KC ( KT 2 ) - K6 * S ( K ) * KS ( KT2 » / SK1
1 28 S(K) = ( S ( J 1 ) + K6 * C(K) * KS ( KT 2 ) + S(K) * KC ( KT 2 » / SK1
1 30 C ( K ) = CTEMP2 : C ( J 1 ) = CTEMP : S ( J 1 ) = STEMP
52 Chapter 6

1 32 NEXT I
1 34 KT = KT + 2 : NEXT J
1 36 NEXT M
140 ' *** B I T REVERSAL FOR F I NAL DATA ***
142 FOR I = 1 TO Q1 : I NDX = 0
1 44 FOR J = 0 TO N 1
1 46 I F I AND 2 A J T H E N I NDX = I NDX + 2 A ( N 1 - J )
1 48 NEXT J
1 50 I F I NDX > I THEN SWAP C ( I ) , C ( I NDX ) : SWAP S( I ) , S ( I NDX )
1 52 NEXT I
1 54 GOTO 200

1 58 ' *** FORWARD F F T ***


160 K6 = - 1 : SK1 = 2
162 CLS : HDR$ = " FREQ F ( COS ) F(SIN) "
1 64 HDR$ = HDR$ + " FREQ F ( COS) F ( S I N ) " : PR I NT PR I NT
166 GOSUB 1 0 0
1 68 RETURN

1 69 ' *** I NVERSE TRANSFORM ***


1 70 SK1 = 1 : K6 = 1 : YSF = 64
1 72 CLS : HDR$ = " T I ME AMP L I TUDE NOT USED "
1 74 HDR$ = HDR$ + " T I ME AMP L I TUDE NOT USED " : PR I NT PR I NT
1 76 GOSUB 1 00
1 78 RETURN

***** OUTPUT DATA *****


200 T9 = T I MER - T9
202 I F I OFLG = 1 T HE N 250
206 ZSTP = 1 5
208 PR I NT HDR$: P R I NT : P R I NT
210 FOR Z = 0 TO Q2 - 1
215 GOSUB 300
216 I F Z > ZSTP THEN 350 ' PR I NT 1 SCREEN AT A T I ME
220 NEXT Z
222 LOCATE 1 , 1 : PR I NT : PR I NT " T I ME = " ; T9
225 I NPUT "C/R TO CON T I NUE : " ; A$
229 RETURN

250 ' *** PLOT OUTPUT ***


252 CLS : YPX = 0 : I F K6 = - 1 THEN 280
254 YO = 1 75
256 FOR I = 0 TO Q - 1
258 I F C ( I ) > YPX THEN YPX = C ( I )
260 NEXT I
262 YSF = 1 00 / YPX
263 L I NE (XO + 1 0 , YO - 1 00 ) - ( XO , YO - 1 00 )
264 LOCATE 6 , 1 : PR I NT US I N G "### _ ##" ; YPX
265 L I NE ( XO - 1 , 5 0 ) - ( XO - 1 , 300 )
266 L I NE (XO, YO ) - ( XO + 500, YO)
268 L I NE ( X O , YO ) - ( XO , YO)
Transient Analysis 53

270 FOR I = 0 TO Q -
272 YP = C ( I )
274 I F K6 = - 1 THEN YP = SQR ( C ( I ) A 2 + S ( I ) A 2 )
276 L I NE - ( XO + XSF * I , Y O - Y S F * Y P )
278 NEXT I
279 GOTO 222
280 ' *** F I ND Y SCALE FACTOR FOR FREQ DOMA I N PLOT ***
281 YO = 300 ' SET Y AX I S OR I G I N
282 FOR I = 0 T O Q - 1 ' F I ND LARGEST VALUE I N ARRAY
284 YP = SQR ( C ( I ) A 2 + S ( I ) A 2 ) : I F YP > YPX THEN YPX = YP
286 NEXT I
287 YSF = 200 I YPX I SET SCALE FACTOR
288 L I NE (XO + 1 0 , YO - 200 ) - (XO, YO - 200 )
289 LOCATE 8, 1 : PR I NT USI NG "### . ##" ; YPX : GOTO 265
,
298 *** PR I NT DATA TO CRT ***
300 PR I NT US I NG "###" ; Z; : PR I NT " ";
310 PR I NT US I NG "+##. #####" ; C ( Z ) ; : PR I NT " II ,.

II .
312 PR I NT US I NG "+##. #####" ; S ( Z ) ; : PR I N T " I
320 PR I NT US I NG "###" ; Z + Q2; : PR I NT " ";
II .
322 PR I N T US I NG "+##. #####" ; C ( Z + Q2 ) ; : PR I NT " ,
324 PR I N T US I NG "+##. ##### " ; S ( Z + Q2)
330 RETURN

350 I *** STOP WHEN SCREEN FULL ***


352 ZSTP = ZSTP + 1 6
354 PR I NT : I NPUT "C/R T O CONT I NUE : " ; AS
356 CLS : PR I NT HDRS : PR I NT : PR I NT
358 GOTO 220

600 I *** SQUARE FUNCTION ***


602 CLS : PR I NT : PR I NT
604 PR I NT "PREPAR I NG DATA I NPUT - PLEASE WA I T ! "
610 FOR I = 0 TO Q I 2 - 1
620 C ( I ) = - 1 : S( I ) = 0
630 NEXT
640 FOR I = Q I 2 TO Q -
650 C( I ) = 1 : S( I ) = 0
660 NEXT
680 GOSUB 160 I TRANSFORM TO FREQUENCY DOMA I N
690 RETURN

699 I *** MOD I FY SYSTEM PARAME TERS ***


700 CLS
702 I NPUT "PRESENT DATA GRAP H I CALLY? ( YIN ) : " ; AS
704 I F AS = "Y" OR AS = " y " THEN I OFLG = 1 ELSE I OFLG = -1
706 RETURN

***************************************
990 STOP : END
***************************************
54 Chapter 6

I ***************************************
1 000
1 002 I * *
MOD I FY SPECTRUM
1 004 I ***************************************

1 040 CLS : R T F L G = 0
1 042 I F K6 <> - 1 THEN 1 096
1 05 0 PR I NT SPC ( 30 ) ; "MOD I FY SPECTRUM MENU" : PR I NT : PR I NT
1 060 PR I NT SPC ( 5 ) ; " 1 = TRUNCATE SPECTRUM" : PR I NT
1 062 PR I NT SPC( 5 ) ; "2 = BUTTERWORTH RESPONSE " : PR I NT
1 064 PR I NT SPC ( 5 ) ; "3 = GAUSS I AN RESPONSE" : P R I NT
1 068 PR I NT SPC ( 5 ) ; "6 = EX I T " : PR I NT
1 070 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
1 080 AS = I NKEYS: I F AS = " " THEN 1 080
1 082 A = VAL (AS ) : ON A GOSUB 1 1 00, 1 200, 1300, 1 990 , 1 990 , 1990
1 084 GOSUB 200
1 088 I F R T F L G = 1 THEN RETURN
1 090 GOTO 1 040
1 096 I NPUT "MUST TRANSFORM S I GNAL BEFORE MOD I FY I NG SPECTRUM"; AS
1 098 RETURN

1 1 00 I *** TRUNCATE SPECTRUM ***

1 1 02 CLS : PR I NT : PR I NT
1 1 04 I NPUT "ENTER CUTOFF FREQUENCY"; AS
1110 FCO = VAL ( AS ) : I F FCO = 0 OR FCO > Q3 THEN 1 1 04
1 1 30 FOR I = FCO TO Q - FCO
1 1 40 C ( I ) = 0: S ( I ) = 0
1 1 50 NEXT I
1 1 94 R T FLG = 1 : RETURN

1 200 REM * BUTTERWORTH RESPONSE *


1 202 CLS : PR I NT : PR I NT
1 204 PR I NT "ENTER THE 3db CUTOFF HARMON I C NUMBER ( 1 TO " ; Q3; " ) " ;
1 206 I NPUT AS
1 208 FCO = VAL ( AS ) : I F FCO = 0 OR FCO > Q3 THEN 1 204
1210 NP = 7 : REM NUMBER OF POLES = NP
1 220 FOR I = 1 TO Q3
1 222 ATTN = 1 / SQR ( 1 + ( I / FCO) A ( 2 * NP»
1 224 C ( I ) = ATTN * C ( I ) : S ( I ) = ATTN * S ( I )
1 226 C ( Q - I ) = ATTN * C ( Q - I ) : S ( Q - I ) = ATTN * S ( Q - I )
1 228 NEXT I
1 230 ATTN = 1 / SQR ( 1 + (Q2 / FCO) A ( 2 * N P »
1 234 C ( Q2 ) = ATTN * C(Q2)
1 294 RTFLG = 1 : RETURN

1 300 REM * GAUSS I AN RE SPONSE *


1 302 CLS : PR I NT : PR I NT
1 304 PR I NT "ENTER THE 3db CUTOFF HARMON I C NUMBER ( 1 TO " ; Q3; " ) " ;
1 306 I NPUT AS
1 308 FCO = VAL (AS ) : I F FCO = 0 OR FCO > Q3 THEN 1304
1320 FOR I = 1 TO Q3
1 322 ATTN = 1 / SQR ( EXP ( . 3 * « I / FCO ) A 2 » )
1 324 C ( I ) = ATTN * C ( I ) : S ( I ) = ATTN * S ( I )
Transient Analysis 55

1 326 C(Q - I ) = ATTN * C ( Q - I ) : s e Q - I ) = ATTN * s e Q - I )


1 328 NEXT I
1 330 ATTN = 1 / SQR ( EXP ( _ 3 * ( ( Q2 / FCO) A 2 » )
1 334 C(Q2) = ATTN * C ( Q2 ) : S(Q2) = ATTN * S(Q2)
1 394 RTFLG = 1 : RETURN

1990 ' **** E X I T MOD I FY SPECTRUM ROUT I NE ****


1 992 RTFLG = 1 : RETURN

The core program (up to line 200) is our conventional FFT


program (see Chapters 8 and 9 of Understanding the FFT); therefore, this
description will cover only the subroutines incorporated to illustrate Gibb's
phenomenon.
The generatefunction routine starts at line 600. At line 6 1 0 we
set up a loop to insert I into the real data array (i.e., C(I», and clear the
-

imaginary array (Le., set S(I) = 0 clearing any data left over from
previous operations). This loop steps from 0 to Q/2 -1 (i.e., the first half
of the array). At line 640 we do the same thing for the second half of the
array except that we set C(I) to + 1 . We then jump down to the forward
transform routine (line 680), and when we come back to line 690, the
frequency domain function will be ready for our experiments.

600 ' *** SQUARE FUNCTION ***


602 CLS : PR I NT : PR I NT
604 PR I NT "PREPAR I NG DATA I NPUT - PLEASE WA I T I II
610 FOR I = 0 TO Q / 2 - 1
620 C( I ) = - 1 : S ( I ) = 0
630 NEXT
640 FOR I = Q / 2 TO Q -
650 C( I ) = 1 : S ( I ) = 0
660 NEXT
680 GOSUB 160 ' TRANSFORM TO FREQUENCY DOMA I N
690 RETURN

The Modify Spectrum routine starts at line 1 000. We first clear


the screen and the Return Flag. At line 1042 we check the K6 flag to see
if a forward transform has just been made (i.e., to see if a non-modified
spectrum is available-if not, we let the user know at line 1 096). We
display the menu of options available to the user (lines 1 050 - 1 080) and,
at the user's option, j ump to the appropriate subroutine. Note that there
are only six selections, but the ON/GOSUB instruction allows A to be
anything between 0 and 255. If you push the wrong key the menu will
just recycle because RTFLG will still equal zero (line 1088 and 1 090).
56 Chapter 6

' ***************************************
1 000
' * *
1 002 MOD I FY SPECTRUM
' ***************************************
1 004
1 040 CLS : R T F L G = 0
1 042 I F K6 <> - 1 T HEN 1 096
1 050 PR I NT SPC ( 30 ) ; "MOD I FY SPECTRUM MENU" : PR I NT : PR I NT
1 060 PR I NT SPC ( 5 ) ; " 1 = TRUNCATE SPECTRUM" : PR I NT
1 062 PR I NT SPC ( 5 ) ; "2 = BUTTERWORTH RESPONSE " : PR I NT
1 064 PR I NT SPC ( 5 ) ; "3 = GAUSS I AN RESPONSE" : PR I NT
1 068 PR I NT SPC ( 5 ) ; "6 = EX I T " : PR I NT
1 070 PR I NT SPC ( 1 0 ) ; "MAKE SELECT I ON : " ;
1 080 AS = I NKEYS : I F AS = " " THEN 1 080
1 082 A = VAL ( AS ) : ON A GOSUB 1 1 00, 1 200, 1 300, 1 990 , 1 990 , 1 990
1 084 I F RTNFLG = 1 THEN GOSUB 200 : RETUR N ' PLOT DATA AND E X I T
1 090 GOTO 1 040
1 096 I NPUT "MUST TRANSFORM S I GNAL BE FORE MOD I FY I NG SPECTRUM"; AS
1 098 RETURN

If you select option 1 = Truncate Spectrum from the Modify


Spectrum Menu, the jump is to line 1 1 00. Line 1 1 04 asks for the cutoff
frequency, above which all harmonics will be eliminated. If you have
selected 2" 1 0 data points (i.e., Q = 1024) then FCD max will obviously
be 5 1 2 which is verified in line 1 1 10. Line 1 1 30 sets up a loop to remove
all harmonics above the selected cutoff frequency. Note that we remove
the negativefrequencies from the negative frequency part of the spectrum
(Le., from FCD to Q - FCD). When we have accomplished this we set
RTFLG to 1 and the job is done.

1 1 00 REM * TRUNCATE SPECTRUM *


1 1 02 CLS : PR I NT : PR I NT
1 1 04 I NPUT "ENTER CUTOFF FREQUENCY"; AS
1 1 10 FCO = VAL (AS ) : I F FCO = 0 OR FCO > Q3 THEN 1 1 04
1 1 30 FOR I = FCO TO Q - FCO
1 1 40 C( I ) = 0 : S( I ) = 0
1 1 50 NEXT I
1 1 94 RTFLG = 1 : RETURN

Type this program into your BASIC application software and run
it. The FFT can handle reasonably large transforms (in a matter of
seconds) so select 2"10 components to provide plenty of resolution. First,
simply transform the step function and reconstruct (to verify the original
time domain function is obtained). The results will be as shown in Figure
6.3 below-note that Gibbs' phenomenon does not appear when we do not
modify the spectrum. Next, repeat the transform and select the MODIFY
SPECTRUM routine. Remove a large portion of the spectrum (e.g., from
Transient Analysis 57

Reconstruction from
Uncorrupted Spectrum

/
No Oversboot

Figure 6.3 - Reconstruction from Unmodified Spectrum

the 60th harmonic up). Reconstruct the time domain signal and you will
observe that Gibbs' phenomenon is present. Visually, things may not be
very clear; nonetheless, Gibbs' phenomenon is apparent.
Repeat the illustration, but this time remove everything from the
1 6th harmonic up. Now when we reconstruct the time domain the
oscillations at the transitions are readily apparent (Figure 6.4). So, Gibbs'
phenomenon does not appear simply because we transform and reconstruct

Tbe Gibbs Pbenomenon


For All Components
Above N > 16 Truncated

Figure 6.4 = Reconstruction from 1 6th Harmonic Cutoff

the data; howeveI; when we drop off the higher frequency components, it
definitely does appear [Did you notice anything peculiar? We will have
to come back to th is. Th ere are a couple of things in th e above
illustration that aren t completely on the up-and-up, but they have a
perfectly good reason for being there, and we 'U discuss them in detail
shortly.]
58 Chapter 6

6.5 FILTERS

As we noted in the last chapter of Understanding the FFT, the


response of a filters in the time domain, being the result of a convolution
integral, isn't something we would expect to understand intuitively;
however; in the frequency domain, filters are dead simple. Consider this
example: a human can hear frequencies up to about 20 kHz (20,000
cycles/second). Now, suppose the speaker we use has a strong resonance
above 20 kHz, and signals there may drive the speaker beyond its limits,
causing audible signals to become distorted. We can eliminate this
possibility by filtering off all harmonics above 20 kHz. Ifwe remove the
hannonics above 20 kHz from our audio signal few listeners will hear the
difference. On the other hand, we want to reproduce all the frequencies
below 20 kHz (i.e., the part we do hear) with high fidelity. This, then, is
the basic idea of a filter-we want to remove certain harmonics from the
signal (the reject band) while leaving all harmonics within another band
of frequencies (the pass band) unchanged.
As it turns out, while we can do pretty amazing things with
modem filters, we can't just truncate all frequencies above a certain cutoff
(fortunately, most of the time that isn't necessary). What we can do is
attenuate some frequencies with a filter circuit while passing others
essentially unchanged. If we can accept a response that approaches the
desired result, as opposed to a perfect solution, we can design circuits that
do almost anything (ah, if we only knew what we were wishing for).
Now, if we know the frequency response ( i . e . , the transfer
function-the attenuation and phase shift) of our filter, we can easily
figure what will happen to the spectrum of any input signal. We simply
multiply every harmonic of the input signal by the attenuation and phase
shift of the circuit at that frequency, and we will have the frequency
domain representation of the output function. We could then take the
inverse transform of this output function and obtain the time response of
the circuit. 3 [In the past, taking transforms and inverse transforms was
such a painful task that engineers seldom bothered-it really wasn't
necessary! Most of the time a knowledge of the transfer function alone (to
the experienced eye) was good enough. The transfer function was, for the
most part, sufficient to evaluate a filter circuit.]

3
Much of this was covered in the last chapter of Understanding the FFf
Transient Analysis 59

6.6 FILTERS-NOTIONS AND TERMINOLOGY

We will not discuss filter design here, but we will need to


consider the system level performance of filters. We note that, with
physically real circuits, it's impossible to filter a signal and not shift the
phase (i.e., give different phase shifts to different frequencies). It's also
impossible to leave the passband perfectly flat while completely removing
frequencies beyond cutoff with real circuits (as we just did in the Gibbs
illustration). What can we do with physically real filters then?
Let's use a real circuit example to get some terminology (and a
few notions) straight. A very simple filter is provided by the RC network
shown below. We recognize that the resistor R I and capacitor C1 form a
voltage divider. As frequency increases the reactance of the capacitor
decreases causing more of the input voltage to be dropped across R I and
less across C 1 • Our objective is to remove frequency components above

� eo
R.
el
el
T
eo = e l �

J21t1c
RI -JX<
-j X< -

Figure 6.5 - RC Filter & Frequency Response

the cutoff frequency, fCO while leaving harmonics below fco unchanged.
'
For physically realizable filters, however; the amplitude rolls-ojJ over
some range of frequencies. We must therefore decide where cutojJtakes
place-where the pass band ends and the reject band begins. We might
select the frequency where the capacitive reactance equals the resistance
as a sort of half-way point; however, because of the q u adra tu re
relationship between an imaginary reactance and a real resistance, this
attenuates the signal to 1 1\12 = 0.707. At this attenuation the power
2
delivered to a resistive load is attenuated to half (P V /R). Equating
=

resistance to reactance doesn't apply in more complex filters, but the


notion of half-power will always apply; so, the half-power point becomes
the universal definition of cut-off. Furthermore, half-power equals 3 . 0 1 03
deci-bels (db) attenuation, so we refer to the cut-off as the 3 db point.
60 Chapter 6

But the circuit of Fig. 6.5 is not a very good filter. We might
improve things by connecting several RC sections end-to-end, with each
section sort of repeat-filtering the output of the preceding section; but,
while the notion of increasing the number of sections (Le., number of
po/es4) is indeed valid, cascading RC sections will never produce a truly
high performance filter. High performance filters require both inductors
and capacitors in each section (or active components-i.e., op amps).

6.7 HIGH PERFORMANCE FILTERS

There are three maj or design criteria for filters: Chebychev,


Butterworth and Gaussian (there are other design criteria however). The
Chebychev and Butterworth are essentially the same class of filter, with
the Chebychev trading flatness of the passband for steepness of rolloff,
while the special case of Butterworth tries to achieve the idealized
objective we put forth above (i.e., keeping passband flat-see fig. below).
[We will only consider the Butterworth here as it illustrates our present
concerns adequately.]

Butterworth
0.9 Frequency
0.8 Response
1:1 0.7 vs.
,gII 0.6 Number o f Poles

� 0.4
; 0.5
..

0.3
0.2
0.1

feo 2 feo 3 feo

Frequency

Figure 6.6 - Butterworth Filter Response

4
For the filters we will be considering here, the number ofpoles will be equal to
the number of reactive elements in the circuit The Transfer Function of a circuit may be
expressed as the ratio of two frequency domain polynomials The roots ofa polynomial are
the values of the independent vanable for which the function goes to zero. The roots of the
numerator are the zeros of the transfer function while the roots of the denominator are
poles-'nufT said
Transient Analysis 61

In our Gibbs illustration program we have included a subroutine


which emulates the performance of a Butterworth filter. If (under the
modify spectrum menu) we select 2 = Butterworth Response we will go
to line 1 200. This modification is a little more subtle although we are still
attenuating the frequencies-similar to the previous routine. Again we
input in the cutoff frequency (i.e., the 3db point). We do not ask how
many poles you want the filter to be-we simply set NP = 7 in line 1 2 1 0.
(Note: we use the 7-pole configuration since it comes closest to what we
desire in Figure 6.6 above-you may change this if you like). We then
calculate the attenuation for this number of poles and attenuate the positive
and negative spectrums (i.e., both up and down to Q3). Starting at line
1 220 we set up a loop which steps through the frequency components,
calculates the attenuation, and multiplies both positive and negative
frequencies by this factor (lines 1 222 - 1228). We then solve for the
attenuation of the "Nyquist frequency" in a separate step by attenuating the
cosine component (there's no sine component), set RTFLG = 1 , and exit.

1 200 REM * BUTTERWORTH RESPONSE *


1 202 CLS : P R I NT : P R I NT
1 204 P R I NT "ENTER THE 3db CUTOFF HARMON I C NUMBER ( 1 TO " ; Q3; " ) " ;
1 206 I NPUT AS
1 208 FCO = VAL (AS ) : I F FCO = 0 OR FCO > Q3 T HEN 1 204
1210 NP = 7: REM NUMBER OF POLES = NP
1 220 FOR I = 1 TO Q3
1 222 ATTN = 1 / SQR ( 1 + ( I / FCO) A (2 * N P »
1 224 C(T1 , I ) = ATTN * C(T1 , I ) : S(T1 , I ) = ATTN * S(T1 , I )
1 226 C ( T 1 , Q - I ) = ATTN * C ( T 1 , Q- I ) : S ( T 1 , Q- I ) = AT T N * S ( T 1 , Q - I )
1 228 NEXT I
1 230 ATTN = 1 / SQR ( 1 + (Q2 / FCO) A (2 * N P »
1 234 C ( T 1 , Q2) = ATTN * C ( T 1 , Q2)
1 294 RTFLG = 1 : RETURN

Load FFT06-0 1 again, run the Butterworth subroutine, and then


reconstruct the time domain waveshape. As you w i l l see, Gibbs'
phenomenon is indeed present.
Let's take the time to note that Gibbs is not a trivial phenomenon.
While it may be argued that this does not represent distortion (the
harmonics were there in the original input signal), for many applications
overshoot and ringing are simply unacceptable.
It begins to appear our earlier exposition of this phenomenon is
valid-if we remove the upper harmonic components we get Gibbs '
overshoot in the time domain; but there 's something curious in this result.
62 Chapter 6

We know all real systems are band l imited, but we also know that
overshoot and ringing does not appear on every signal that has a rapid
transition. Why not? Obviously we still don't have the whole story here.

6.8 GAUSSIAN FILTERS

0.9 Gaussian
0.8 Frequency
Response
= 0.7 0.707
�II 0.6

� 0.4
; 0.5
..

0.3
0.2
0.1

feo 2 feo

Frequency

Fig. 6.7 - Gaussian Response

There is a way to avoid Gibbs' phenomenon of course. If,


instead of simply lopping-off the harmonics above cutoff, we gradually
decrease their amplitude, we can fool the wave shape into not knowing
what it's missing. The Gaussian response accomplishes this, but the shape
of the attenuation curve sacrifices both flat passband and sharp knee at the
cutoff frequency (Fig. 6.7). Unfortunately, this can't be improved by
adding more poles to the filter-this is the shape required to eliminate
overshoot. 5 If we add more poles we must do it in such a way that the
gradual rolloff is not changed-the shape of the attenuation curve must be
preserved.
As with Butterworth, we have included a routine in FFT06-0 1 to
emulate a Gaussian response. If you select 3 = Gaussian response from
the Modify Spectrum Menu, you will go to line 1 300. Once again (in line
1 3 04) we select the 3db cutoff frequency. At line 1 320 we set up an
identical loop to the Butterworth routine except that we solve a different
equation for attenuation.
s
There is a class of filter (Optimum Transient) which allows some overshoot but
minimizes the time to settle to steady state value (within some accuracy),
Transient Analysis 63

1300 REM * GAUSS IAN RESPONSE *


1302 CLS : P R I NT : P R I NT
1304 P R I NT "ENTER T HE 3db CUTOFF HARMON I C NUMBER ( 1 TO " ; Q3 ; " ) " ;
1306 I NPUT AS
1308 FCO = VAL(AS ) : I F FCO = 0 OR FCO > Q3 T HEN 1304
1320 FOR I = 1 TO Q3
1 322 ATTN = 1 / SQR(EXP ( . 3 * « I / FCO) A 2 » )
1 324 C ( T 1 , I ) = ATTN * C ( T 1 , I ) : S ( T 1 , I ) = ATTN * S ( T 1 , I )
1 326 C ( T 1 , Q - I ) = ATTN * C ( T 1 , Q - I ) : S ( T 1 , Q - I ) = ATTN * S ( T 1 , Q - I )
1328 NEXT I
1330 ATTN = 1 / SQR ( EXP( . 3 * « Q2 / F CO ) A 2 » )
1 334 C ( T 1 , Q2) = ATTN * C ( T 1 , Q2 ) : S ( T 1 , Q2) = ATTN * S ( T 1 , Q2 )
1 394 RTFLG = 1 : RETURN

You may run this Gaussian response routine to verify that


overshoot does not appeaI You still don't get to select the number of
poles-this attenuation curve is for an infinite number of poles (we spare
no expense); however, except for frequencies well beyond cutoff, the
response doesn't change much vs. number of poles.

6.9 TRANSIENT RESPONSE

When we filter the waveform via any of the above routines we


display the modified spectrum before j umping back to the Main Menu.
The displayed spectrum must be the same as a signal that has been filtered
by a circuit with the selectedfrequency response. In the above examples,
it must be the response that would be obtained if we passed a square wave
through a circuit with the selected frequency response! This, in fact, is the
key concept we want to convey here: the transient response of a circuit
(for any input waveform we choose) is found by multiplying the transform
of that waveform by the frequency response of the circuit. That is, by
convolution of the time domain functions.
Now, when we found the transient response of a Butterworth
filter above, we simply multiplied the spectrum of a step function by an
equation describing the frequency response of such a filter; however; in
the general case, finding equations for the frequency response of arbitrary
circuits is not an easy task. We need not trouble ourselves with trying to
find such equations, of course, because we can find the frequency response
of any circuit via the network analysis program of the previous chapteI
Using the circuit analysis program developed in Chapter 5 we
may determine the attenuation and phase characteristics of Butterworth
64 Chapter 6

filters (or any circuit). Once we obtain this transferfunction, we may use
it to modify the spectrum of a square wave (or any other wave). This
requires nothing more than multiplication of the spectrum of the square
wave by the frequency response of the filter (complex multiplication of
course). By simply performing the inverse transform then, we obtain the
transient response of the circuit.
The two programs ( i . e . , ACNET02-0 1 and FFT06-0 1 ) are
combined or merged in Appendix 6. 1 to obtain a program which provides
the transient response of a circuit. The program will work pretty much as
the Gibbs Phenomenon program did, except that now we can enter a
circuit (from the ModJfy Spectrum Menu) and multiply the circuit transfer
function with the spectrum of the step function. Just as before, we find
the transient response via an inverse transform of the results. [Note:
While the program given is acceptable for the purpose of illustration, you
might want to expand it so that it can perform either frequency response
analysis or transient analysis. It's not such a difficult task, and on today's
high speed personal computers the execution time is not unacceptable
(especially with compiled BASIC). Even if you have access to heavy­
weight circuit analysis programs, you might still find this application
handy on occasions. With only a modest effort you can add dependent
generators, which will allow inclusion of active components.
Before we leave this section, let's consider one of the peculiar
aspects of our Gibbs phenomenon discussion. When we considered
Butterworth filters, for example, we found the ringing and overshoot
started before the transition! Now, that's not how it should happen in the
real world- if overshoot and ringing are caused by a rapid transition they
should occurfollowing the driving transient.. . . What's wrong here?
The reason for the prescient ringing and overshoot in the above
is that we used only the amplitude response of the filter and ignored the
phase. The reason we ignored the phase response was that we had a
simple but accurate equation for amplitude response and it was easy to
modify the spectrum by this equation.6 There's a better way, of course.
When we determine the transient response via circuit analysis, we
automatically include the phase response, and the result gives a much more
truthful picture of the transient response.
6
There, s another reason for using only the amplitude response-it's sometimes
desirable to filter signals without disturbing phase, and we have illustrated how the FIT
allows that operation This technique might come in handy some day
Transient Analysis 65

Fig. 6.8 - Transient Response of Butterworth Filter

6.10 ALIASING

The above takes care of the funny transients caused by ignoring


phase, but there was another anomalous condition that existed in the
preceding exposition. We generated the input square wave by simply
placing "+ 1 Its and "- I Its in the input buffer, and we know we can't do that.
If we digitize a signal with frequencies above the Nyquist we know we
will get aliasing. We will discuss aliasing in greater detail later but, for
now, we can avoid the problem of aliasing if we simply generate the
frequency domain function of a square wave in the first place. This is
only slightly different from what we have been doing when we generate
the time domain function by summing the contributions from each
harmonic-we can generate the frequency domain function as follows:

600 REM * FREQUENCY DOMA I N SQUARE WAVE FUNCT I ON *


602 CLS : PR I NT : PR I N T
604 PR I NT "PREPAR I NG DATA I NPUT - PLEASE WA I T ! "
606 FOR I = 0 TO Q : C ( I ) = 0 : S C I ) = 0 : NEXT
610 FOR I = 1 TO Q3 STEP 2
612 SC I ) = - . 6366196 / I : S ( Q - I ) = . 63661 96/
614 NEXT
622 SK1 = 2 : K6 = - 1 : YSF = Q
628 RETURN

If you generate this input and then immediately perform the inverse
transform, you will find Gibbs' phenomenon prominently displayed at the
comers-not because we have taken the transform, but simply because we
have started out with the incomplete, band limited, square wave spectrum.
Note that, even though ourfirst input signal was "corrupted" by
deliberate aliasing, the inverse transform still produced the "correct"
66 Chapter 6

waveshape-which is in teresting. The FFT knows noth ing about


aliasing-it simply does its job andfinds the transform of the data. We
know, however. the spectrum obtained was not the same as a real square
wave. 7

CIRCUIT ANALYSIS vs FOURIER

Finally, we should note the similarity between network analysis


and Fourier analysis. What we are doing in circuit analysis is solving the
transfer impedance equations for a band of unit amplitude sinusoids (Le.,
at a lot of different frequencies). The result, of course, is simply the
transfer function, in the same format as the DFT transform of a function.
We shall see later that a spectrum of equal amplitude sinusoids may be
identified as an impulse function, and if we take the inverse transform of
the frequency response itself, we will see the transient response of the
circuit to an impulse.
So, when we find the transient response of any circuit as we have
done above, we are simply convolving the impulse response of the circuit
with the transform of a square wave (or other function of our choosing).
While this may seem like a round-about way of doing things, it's a very
practical method of solving real world problems . . . but for us it's primarily
another step toward understanding Fourier analysis.

7
Ifwe look at what the summation of these hannonics produce in the continuous
world, we find that it doesn't really produce a "flat-topped" time domain function either We
will investigate the technique of looking between the data points a little later
CHAPTER 7

SPEEDING UP THE FFT

7.0 INTRODUCTION

It's well known there are faster FFT algorithms than the classic
Cooley-Tukey derivation. "Tricks" that may be used to speed up the
transform become apparent when we analyze the FFT mechanics. For
example, in the first two stages, where we are dealing with one and two­
point DFTs, the twiddle factors have values of + 1 , - 1 , and zero, and we
need not evaluate a Taylor series for these-nor perform a multiplication
at all. In fact, these first stages yield no sine components at all. We can
save time here by writing simplified routines for the first two stages of
computation and then revert to the conventional algorithm for the
remainde[ The modification will look something like this:

1 04 REM *** STAGE A ***


1 06 FOR I = 0 TO Q2 - 1
1 08 CTEMP1 = C ( I ) + C ( Q2 + I )
110 C ( Q2 + I ) = C ( I ) - C ( Q2 + I ) : C ( I ) = CTEMP1
112 NEXT I
1 14 REM *** STAGE B ***
1 16 Q34 = Q2 + Q4 ' 3/4 ARRAY LOCAT I ON
1 18 FOR I = 0 TO Q4 - 1 : I Q2 = I + Q2 : I Q4 = I + Q4 : I Q34 = I + Q34
1 20 CTEMP = C ( I ) + C ( I Q4 ) : C ( I Q4 ) = C ( I ) - C ( I Q4 ) : C ( I ) = CTEMP
1 22 S( I Q 2 ) = C ( I Q34 ) : S ( I Q34) = - C ( I Q34 ) : C ( I Q34 ) = C ( I Q 2 )
1 24 NEXT I

We then enter the conventional FFT routine starting at M = 2:

1 32 FOR M=2 T O N - 1 : • • • • •

[Note: The validity of this trick may not yet be apparent but we will
consider it in more detail later (under small array FFTs)-for now I
recommend you try this modification in the FFT routine of the previous
chapter; however, keep in mind that this modification works only for the
forward transform.]
This will cut off a little processing time and, as we said, every
little bit helps; however, there are other, much more significant, ways to
speed things up.
68 Chapter 7

7.1 ELIMINATING NEGATIVE FREQUENCY COMPONENTS

As you will recall, the development of the FFT was based on a


peculiarity of a stretched data configuration wherein half of the frequency
components were redundant. That is, the spectrum of a stretched function
is a double image (i.e., the upper half of the spectrum duplicates the
lower). This redundancy made it possible to eliminate the work of
extracting the upper half frequency components. By pursuing this
phenomenon we eventually wound up with an algorithm for the FFT.
Now, we could not have developed an FFT algorithm without the
intrinsic symmetry and redundancy entrained in the conventional DFT.
Furthermore, it's apparent we haven't removed all of the redundancy, for
as we have noted, when we perform a DFT (or, for that matter, an FFT)
on real data the negative frequencies (i.e., those above the Nyquist
frequency) are identical to the positive harmonics, except for negation of
the sine term (i.e., they are the complex conj ugates of the positive
frequencies). Why, then, should we go to the trouble of calculating these
components? We can simply find the positive frequency terms and repeat
them in the data printout (negating the sine components of course).
But then, why should we bother with them at all? Why modify
redundant frequency components when we, for example, filter a signal? . . .
or differentiate a function? . . . or perform a n y other operati on in the
frequency domain? It would seem likely that we can cut our work in half
(very nearly) if we simply eliminate the negative frequency terms!
Okay, how must we modify our conventional FFT algorithm so
we can eliminate the time required to determine negative frequencies?

7.2 STRETCHING THEOREM (Positive Frequencies Only)

In the DFT we may easily eliminate the negative frequency


harmonics by simply ending our procedure when we reach the Nyquist
frequency, but how will this affect the FFT algorithm? If we ignore the
negative frequencies, what happens to the positive frequencies when we
transform stretched data? [Our purpose may not be completely clear here,
but we are simply trying to illustrate the mechanics of a positive frequency
only transform-the significance of this will be apparent shortly.]
We borrow a program used in Chapter 5 of Understanding the
FFT which illustrates the stretching theorem. This program is not an FFT,
The PFFFT 69

but rather, a DFT-we modify it here to yield only positive frequencies


(see listmg in Appendix 7. 1 ). This program yields the following spectrum
for the un-stretched function:

4 . _ Nyqulst

Negative
2 Frequendes
(Omitted)
Time Domain

Frequency Domain (Mag)

Figure 7. 1 - Transform with Positive Frequencies Only


We have obviously eliminated the upper half of the spectrum-the
negative frequencies are gone-we didn't compute them (saving ourselves
a great deal of work). But what happens when we stretch thisfunction?
Fig. 7.2 below shows the effect of stretching (still using a positive
frequency transform). We must look closely at this result. We are getting
a spectrum duplication but it's no longer a simple spectrum doubling.

I"
Negative
Frequendes
Time Domain Nyquist (Omitted)
. .. . · .t--
Frequency Domain (Mag)

Figure 7.2 - Stretched Data Positive Frequency Transform


Stretching the function when only the positive frequencies are
considered creates the mirror image of the positive frequency components
(still in the positive frequency space). While this is not the same thing
that was obtained when we stretched a function using the conventional
DFT (i.e., with both positive and negative frequency components), the
underlying mechanism is the same. The subtle difference is important for
us-it defines the positive frequency only FFT.
We need to understand what's happening here. It's as if we have
introduc ed a secondary sampling pulse train which is half the real
sampling rate. Data sampling is like amplitude modulation-the data
1
modulates the sampling pulses. From this point of view, the effect of
stretching the data is as if we are modulating a pulse train that is half the
1 Amplitude modulation of a "carner" (e.g., unit amplitude sampling pulses)
produces "side bands" both above and below the carrier frequency. We will discuss data
sampling and this modulation phenomenon in detail later.
70 Chapter 7

real sampling rate. So, then, even though we are only finding the positive
frequencies (relative to the real sampling rate), we will see the positive
and negative side bands about this half frequency pseudo sampling rate.
The unique thing here is that stretching a function (when only the positive
frequencies are involved) creates a mirror image of the un-stretched
spectrum above the pseudo sampling rate. This is the same mechanism
(but not quite the same result) as the simple repeat effect we obtained in
our original development of the FFT. [Note: In both cases the negative
frequency components are complex conjugates of the positive frequency
components, but when you take the complex conjugate of a complex
conjugate you get the original expression. Ifyou are retired, with more
time than pension, or ifyou are incurably curious, it may be worth your
time to work this out-see The Stretching Theorem, Appendix 5.3, in
Understanding the FFT. Ifyou understand Figs. 7. 1 and 7.2, however,
that's all you need to know to create a Positive Frequency FFT.]

7.3 THE PFFFT2 (Positive Frequency Fast Fourier Transform)

Once again, we start with an 8 point data array [You might want
to read the FFT development given in Understanding the FFT before you
begin this presentation] :

I �� I = 1 Do. D" D2• DJ• D4• Os. D6, D7 1 (7.0)

We separate the odd and even data elements creating two stretched arrays:
1 DATA l ' 1 = 1 Do, 0, D2, 0, D4, 0, D6, ° 1 --- - -- -- - (7. 1)
1 DATA2' 1 = 1 o, D" 0, DJ, 0, Ds, 0, D7 1 - ---- - - - - (7.2)

The positivefrequency transform of (7. 1 ) will be:

Transform 1 DATA 1 ' 1 = 1 Fo,F"F2,F,* ,Fo* 1 ------- - - - - - - - - - (7.3)


(Where F,* and Fo* are complex conjugates of F, and Fo)

We remove the zeros separating the data points in array I D.AJ'A l ' I ' and
obtain the array:

- - - - - - - - - - - - - - - -- - (7.4)

2
While I frown on mindless creation of acronyms, this mindless creatIon is an
exception. The "P" is silent (as in swimming) yielding a slightly aspirated "ffftl "
The PFFFT 71

The positive frequency transfonn of this un-stretched array is:

(7.5)

where Fo, F\ and F2 are the same in both Eqns. (7.3) and (7.5).
Very well then, we must transfonn two arrays (i.e., the odd and
even data points), and add the spectrums obtained. As before, we must
rotate the phase of the odd data transform (due to the shifting phenome­
non) before adding it to the even data transform. That is, the frequency
components from the odd data transfonn are properly phase-shifted and

D ata Xform Output


Do FI_o FO-o
>.

..
Z!
D2 F I_I FO-I
4 Point «(
...
Xform '"
D4 F I_2 FO-l ...
;;
:c
..
..
D6 -

j
DI F2 _0 FO-J

DJ
4 Point F2_1 F(1.4
Xform
Ds Fl_2
o No Data
D7 No Data * = Complex Conj ugate o No Data

Figure 7.3 - The PFFFT "Butterfly"

summed with the frequency components of the even data transfonn; but,
this time, the virtual components are created as the mirror image of the
direct components (i.e., the complex conjugates are summed in reverse
order). This is important so let's walk through the software for this
algorithm just to make sure we understand how it really works.
As before: Q = the number of data points.
K l = 2·PVQ
Q2 = Q/2: Q4 = Q/4
J counts the frequency components.
I counts the data points.
Y(I) = input data
C(J) = cosine components of frequency
S(J) = sine components of frequency
72 Chapter 7

1 09 REM * COMPUTE EVEN O F T *


1 10 FOR J=O TO Q4 : J 1 =K 1 * J
111 C ( J ) = 0 : S ( J )= 0
1 12 FOR I = 0 TO Q - 1 STEP 2
1 14 C ( J ) = C ( J ) + Y ( I ) * COS ( J 1 * 1 )
1 16 S ( J ) = S ( J ) + Y ( I )*S I N ( J 1 * 1 )
1 18 NEXT I
1 20 C ( J ) =C ( J )/Q2 : S ( J ) =S ( J )/Q2
1 22 NEXT J

This routine is just a positive frequency DFT which operates on


the even data points (the I counter counts in increments of 2). As you
recall, we multiply the data points by sine and cosine functions (lines 1 1 4-
1 1 6) and sum the products into the C(J) and S(J) arrays. The summations,
of course, become the frequency components. We solve for the even data
points here-the odd data transform will be stored in the upper half of the
data arrays [i.e., C(J+Q2) and S(J+Q2)]. Note that in line 1 1 0 the J
counter only counts up to Q/4 since we are only finding the positive
frequencies (we have Q/2 data points since we are dealing with the even
data points-therefore only Q/4+ 1 positive frequencies). We must, of
course, take the DFT for the odd data points in a similar routine:

1 24 REM * COMPUTE ODD O F T *


1 26 FOR J=O TO Q4 : JO = J+Q2 : J 1 =K 1 * J
1 27 C ( JO) = O : S ( JO ) = 0
1 28 FOR 1 =0 TO Q - 1 STEP 2
130 C ( JO)=C(JO)+Y ( I + 1 ) * COS ( J 1 * 1 )
132 S ( JO)=S(JO)+Y ( I + 1 ) * S I N ( J 1 * 1 )
134 NEXT I
1 36 C ( JO)=C( JO)/Q2 : S ( JO)=S( Jo)/Q2
1 38 NEXT J

We have now taken the transform of each half of the data base in
(Q/4+ 1) • Q/2 or Q2/8 + Q/2, for a grand total of Q2/4 + Q (as opposed to
Q2 operations in the DFT or Q2/2 for the conventional FFT). When Q is
large this cuts processing time in half again ... almost.
Okay, to obtain the complete transform we will sum the two
partial transforms as follows:

1 39 ' *** SUM ODD AND EVEN TRANSFORMS ( F I NAL STAGE ) ***
1 40 FOR J = 0 TO Q4 : J1 = J +Q 2 : J I = Q2- J : K2 = K1 * J : K3 = K 1 * J I
142 CTEMP1 = C ( J ) + C ( J 1 ) * COS(K2) - S ( J 1 ) * S I N ( K2 )
1 44 STEMP1 = S ( J ) + C ( J 1 ) * S I N (K2) + S ( J 1 ) * COS(K2)
1 46 CTEMP2 = C ( J ) + C ( J 1 )*COS(K3) + S ( J 1 ) * S I N ( K3 )
1 48 S ( J I ) = C ( J 1 ) * S I N ( K3 ) - S( J 1 ) * COS ( K3 ) - S ( J )
1 50 C ( J ) = CTEMP1 : S( J ) = STEMP 1 : C ( J I ) = CTEMP2
152 NEXT J
The PFFFT 73

We simply sum the frequency components of the even DFT with the
rotated components of the odd DFT. The virtual components are formed
(lines 1 46- 1 48) by summing the components in a mirror image (note that
the index n handles the virtual components in reverse order while storing
the data in the location from which it came). For example, the first two
components computed are the zero frequency and Nyquist components,
both of which can be put back into the locations from which they came.
If you step through this routine you will find the direct components may
always be placed in the locations from which they came while the virtual
components are always placed in empty locations. You may type this into
your computer and verify that it works if you like.

7.4 EXTENDING THE CONCEPT

As with the conventional FFT, we extend this concept by splitting


each 4-point DFT into two 2-point DF7S; howeveJ; before we actually
discuss how to handle the PFFFT at the 2-point DFT level, let's take time
to look at the incredible simplicity of these small array DFTs. In Figure
7.4 we show diagrammatically what takes place in these small DFTs. As

! L. L

: � } r . : � } r. . ::� } r-.

. Data Data Data

�} � }
.

c.os cos
.
f= 1 f = Nyq

}
Sm . S�


Cos

. • • f= Nyq

Sm

Figure 7.4 - Small Array DFTs

noted earlieI; with four data points (or less) the sines and cosines only take
on values of ±1 and 0, greatly simplifying things.
Figure 7.4 shows a 4-point DFT (vertically at the left), a 2-point
74 Chapter 7

DFT (running down the middle of the picture) and a I-point DFT (right).
We obtain the frequency components of the DFT by mUltiplying each data
point by the corresponding point from the cosine and sine function (at the
integer multiple frequencies-only positive frequencies are shown). It's
obvious that, while we must compute the value of the sine and cosine for
every data point in larger data arrays, calculating sines and cosines for
these small arrays is hardly necessary (they are either + I , - I , or 0). This
is the situation we took advantage of in the speedup technique discussed at
the beginning of this chapteI [Note that, in Fig. 7.4, the 2-point DFT
analyzes the even data points of the 4-point array (i.e., the 0 and 2nd data
points). For the 8-point array we have been considering in this PFFFT
illustration, the 4-point array would be the even data points of the whole
array. If we were building a full FFT there would have to be a second
DFT for the odd data points, of course (see Appendix 7.2).]

Data Xform Stage I Stage II Output

DO F o.o
D4 F (I. \

D:Z
D6 F (l.l

DI
DS F (l.J

D3
D7 F (I.o4

Figure 7.5 - PFFFT Double Butterfly

With this in mind we 're ready to return to the development of the


PFFFT. We illustrate the splitting of the 4-point DFT into two 2-point
DFTs in Figure 7.5. Note that a 2-point DFT for positive frequencies is
the same as a conventional DFT-both have a zero frequency and a
Nyquist frequency. Now, within the 2-point DFT, the cosine term for the
zero frequency component is just the sum of the zero and fourth data points
divided by two (see Fig. 7.5). There is, of course, no sine term for the zero
frequency nor the Nyquist component. The Nyquist (cosine) component
is obtained by subtracting the fourth data point from the zero data point.
The PFFFT 75

For this illustration the 2-point DFTs will look like this:

110 C ( 0 ) = ( Y ( 0 ) +Y(4» /2 I PAR T I A L X FORM


112 C(1 )=(Y(0)-Y(4» /2 I #0 STORED HERE
1 14 C ( 2 ) = ( Y ( 2)+Y(6» /2 I PAR T I A L X FORM
1 16 C(3)=( Y ( 2 ) - Y(6» /2 I #2 STORED HERE
1 18 C ( 4 ) = ( Y ( 1 ) +Y ( S » /2 I PART IAL X FORM
1 20 C(S )=(Y( 1 ) - Y ( S » /2 I #1 STORED HERE
1 22 C ( 6 ) = ( Y ( 3 )+Y ( 7 » /2 I PART IAL X FORM
1 24 C ( 7 ) = ( Y ( 3 ) - Y (7» /2 I #3 STORED HERE

When we sum these four partial transforms (to form the two 4-
point transforms), our positive!requen cytransform (for 4 points) will only
have three components. The phase shifts for the components from the odd
DFT are still mUltiples of PU2 (i.e., 90°) which yields:

1 26 CTMP = ( C ( 0 ) +C ( 2 » / 2 : S ( 0 ) =0 I FOR f = 0 NO S I NE
1 27 C( 1 ) = C ( 1 )/2 : S ( 1 )=C(3 )/2
1 28 C(2) = ( C ( 0 ) - C ( 4 » /2 : S ( 2 )=0 I FOR f = NYQ NO S I NE
1 30 C(O) = CTMP
1 32 CTMP = ( C ( 4 ) +C(6» / 2 : S(4 )=0 I NO S I NE FOR f = 0
1 33 C(S) = C ( S ) /2 : S ( S )=C(7)/2
1 34 C(6) = ( C ( 4 ) - C ( 6 » / 2 : S ( 6 )=0 I NO S I NE FOR f = NYQ
136 C(4) = CTMP

Note that we ignore the sine components when forming the next higher
transform, and that we form only three positive frequency components.
From here we may tack-on the final stage summation routine at the bottom
of p. 72 and obtain the complete transform.
We ll and good but, carrying the FFT scheme to its logical
conclusion, we must consider the transform subdivision process through
one more step-until we are dealing with I -point DFTs.

7.5 THE COMPLETE PFFFT

As i l l ustrated in Fi gure 7 . 4 , there is only one frequency


component when there is only one data point. It will apparently be the
zero frequency component, and is simply equal to the average value of the
data point (i.e., equal to itself). Having noted this, it's apparent we may
treat the input data points as single point transforms of themselves. In the
first stage of computation, then, we will sum these single point transforms
into 2-point transforms. Figure 7.6 (following page) shows the three stage
summing process for the complete 8 data point PFFFT. It should be
-...J
0\

Oata Rotate & Sum Rotate & Sum Stage II Rotate & Sum Stage III Output

DO � F240 �
/\:
�FI _
7 FI-II-I
\t }
� Fo.o
F�I
F�z
04 WIl Fl-O-I

02 � F:z..I-O
FI-II-z
06 WIl F:z..I-I

D1 � F:z..� �
/\:
�F I_I-O
7 FI_I_I
05 WIl FZ-l-I

03 � F:z..z-o
FI_I_z
F�3
F0-4
07 WIl F:z..z_I
n
:r

"CI
Figure 7.6 - Complete 8-Data Point PFFFT (Triple Butterfly) -
n>
.,
-...J
The PFFFT 77

apparent that we are performing the same rotation and summing routine
at every stage of computation, although it's also apparent the first two
stages don't actually need the excess baggage of calculating sines and
cosines (except to determine the signs of the summations). Let's look at
the shifting and summing process for the first stage of computation: to
form the zero frequency component of a 2-point transform we simply add
the two data points required (see Fig. 7.6). Note that, since there's no sine
component for a zero or Nyquist frequency component, the Nyquist
frequency term is formed by negating the higher order data point and
summing again (i.e., subtracting the two terms). For example, in lines 1 1 0
and 1 1 2 below, we do this for the 2-point transform o f data points D O and
D4, and store them in locations C(O) and C( 1 ).

1 09 ' ** SUM S I NGLE POI N T TRANSFORMS **


110 C(O) = ( Y ( O ) + Y ( 4 » /2' PAR T I A L X FORM
112 C( 1 ) = ( Y ( O ) - Y ( 4 » /2' #0 STORED HERE
1 14 C(2) = ( Y ( 1 ) + y ( S » !2 ' PAR T I A L X FORM
1 16 C(3) = ( Y ( 1 ) - Y ( S » /2' #1 STORED HERE
1 18 C(4) = ( Y ( 2 ) + Y ( 6 » /2' PART IAL X FORM
1 20 C(S) = ( Y ( 2 ) - Y ( 6 » /2' #2 STORED HERE
1 22 C(6) = ( Y ( 3 ) + Y ( 7 » /2 ' PART I A L X FORM
1 24 C(7) = ( Y ( 3 ) - Y ( 7 » /2 ' #3 STORED HERE

As with the conventional FFT then, we perform the PFFFT


process by a shifting and summing mechanism from the beginning;
however, we immediately see a problem here. In the above listed routine
the partial xforms come out in sequence #0, # 1 , #2, and #3 ; but we want
the partial transforms that are to be summed in the following stage to be
stacked next to each other-as shown in the 2-point DFT routine at the top
of p. 75. That is, if we hope to use a single rotate and sum routine for our
PFFFT, we must manage the data such that we can easily determine data
locations in each succeeding stage. In fact, if we examine the data
locations in the above routine and the one on p. 75 (better yet, expand
these to 16 or 3 2-point data arrays) we will see this is just our old bit
reversal nemesis-knocking on the front door this time. We know how
to handle bit reversal, of course, but now another alternative becomes
apparent-it will be more efficient to bit-reverse the data in the first stage
of the FFT (as opposed to tacking-on a bit reversal stage to the end). That
is, we can take care of the bit-reversal directly in the first stage of
computation by managing the array data such that all the partial transforms
wind up where we want them. Here's how we will handle this:
78 Chapter 7

101 , *** TRANSFORM STAGE 1 ***


110 C ( O ) = ( S( O ) + S(Q2» / 2 : C ( 1 ) = ( S ( O ) - S(Q2» /2
112 FOR I = 1 TO Q 3 : 12 = 2* 1 : I NDX = 0
1 14 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2A ( N - 2 - J )
1 16 NEXT J : I NDX2 = I NDX + Q2
1 18 C ( 1 2 ) = ( S( I NDX) + S( I NDX2» / 2 : C ( 1 2+ 1 ) = ( S( I NDX ) - S ( I NDX2 » /2
1 20 NEXT I
1 22 FOR I = 0 TO Q 1 : S( I ) = 0 : NEXT I

Serendipity! We know the sine component in the first stage will


be zero; so, we may put the input data into the sine component array S(J).
We don't create the transforms in sequence, but bit-reverse an array index
and thereby end up with the 2-point xforms in the desired sequence. From
here we simply combine adjacent transforms to the end of the FFT.

7.6 BUILDING A GENERAL PURPOSE ALGORITHM

First we expand our illustration to 1 6 data points, then write


separate loops for each partial transform:

1 00 ' ***** TRANSFORM *****

1 01 ' *** TRANSFORM STAGE 1 ***


1 02 C ( O ) = ( S( O ) + S ( Q2 » / 2 : C ( 1 ) = ( S ( O ) - S ( Q2 » /2
1 04 FOR I = 1 TO Q 3 : 12 = 2* 1 : I NDX = 0
1 06 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2 A ( N - 2 - J )
1 08 NEXT J : I NDX2 = I NDX + Q2
110 C ( 1 2 ) = ( S ( I ND X ) + S( I NDX2» / 2 : C ( 1 2 + 1 ) = ( S( I NDX ) - S ( I NDX2» /2
112 NEXT I
114 FOR I = 0 TO Q 1 : S( I ) = 0 : NEXT I

, ********* SUM ODD/EVEN TRANS FORMS ( F I NAL STAGE - 2 )


1 1 6 FOR J = 0 TO 1
1 1 8 J 1 = J + Q8 : J I = Q8 - J : K2 = 4*K 1 * J : K3 = 4*K 1 * J I
1 20 CTEMP1 = C ( J ) + C ( J 1 )*COS(K2) - S ( J 1 )*S I N (K2)
1 22 STEMP1 = S ( J ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 )*COS(K2)
1 24 CTEMP2 = C ( J ) + C ( J 1 )*COS ( K3 ) + S ( J 1 )*S I N ( K3 )
1 26 S ( J I ) = ( C ( J 1 )*S I N ( K3 ) - S ( J 1 ) * COS ( K3 ) - S( J » /2
1 28 C ( J ) = CTEMP 1 / 2 : S ( J ) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
130 NEXT J

132 FOR J = 0 TO 1 : JO = J + Q4
1 34 J 1 = J + Q4 + Q8: J I = Q4 + Q8 - J : K2 = 4*K 1 * J : K3 = 4*K1 * ( J I - Q4 )
1 36 CTEMP1 = C ( J O ) + C ( J 1 )*COS ( K2 ) - S( J 1 )*S I N ( K2 )
1 38 STEMP1 = S ( J O ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 )*COS(K2)
1 40 CTEMP2 = C(JO) + C ( J 1 )*COS(K3) + S ( J 1 )*S I N ( K3 )
142 S( J I ) = ( C ( J 1 ) *S I N ( K3 ) - S ( J 1 )*COS ( K3 ) - S ( J O » /2
1 44 C ( J O ) = CTEMP 1 / 2 : S ( J O ) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
1 46 NEXT J
The PFFFT 79

148 FOR J = 0 TO 1 : JO = J + Q2
150 J1 = J + Q2 + Q8: J I = Q2 + Q8 - J : K2 = 4*K 1 *J : K3 = 4*K1 *( J I - Q 2 )
152 CTEMP1 = C ( J O ) + C ( J 1 )*COS(K2) - S ( J 1 )*S I N ( K2 )
1 54 STEMP1 = S ( J O ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 ) *COS(K2)
156 CTEMP2 = C(JO) + C ( J 1 )*COS ( K3 ) + S ( J 1 )*S I N ( K3 )
1 58 S( J I ) = ( C ( J 1 )*SI N ( K3 ) - S ( J 1 )*COS ( K3 ) - S ( J O » /2
1 60 C ( J O ) = CTEMP 1 / 2 : S ( J O ) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
1 62 NEXT J

1 70 FOR J = 0 TO 1 : JO = J + Q34 : J 1 = J + Q34 + Q8


1 72 J I = Q34 + Q8 - J : K2 = 4*K1 *J : K3 = 4*K 1 * ( J I - Q34)
1 74 CTEMP1 = C ( J O ) + C ( J 1 ) *COS ( K2 ) - S ( J 1 )*S I N ( K2 )
1 76 STEMP1 = S ( J O ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 )*COS ( K2 )
1 78 CTEMP2 = C ( J O ) + C( J 1 )*COS (K3) + S ( J 1 ) * S I N ( K3 )
1 80 S ( J I ) = ( C ( J 1 ) * S I N ( K3 ) - S ( J 1 ) * COS(K3) - S ( J O » 1 2
1 82 C ( JO ) = CTEMP1 1 2 : S ( J O ) = STEMP1 1 2 : C ( J I ) = CTEMP2 1 2
184 NEXT J

, *** SUM OOD AND EVEN TRANSFORMS ( F I NAL STAGE - 1 ) ***


200 FOR J = 0 TO 2
201 J 1 = J + Q4 : J I = Q4 - J : K2 = 2*K1 *J : K3 = 2*K 1 * J I
202 CTEMP1 = C ( J ) + C ( J 1 ) * COS(K2) - S ( J 1 )*S I N ( K2 )
204 STEMP1 = S ( J ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 )*COS ( K 2 )
206 CTEMP2 = C ( J ) + C ( J 1 )*COS(K3) + S ( J 1 ) * S I N ( K3 )
208 S( J I ) = ( C ( J 1 )*S I N ( K3 ) - S ( J 1 )*COS ( K3 ) - S ( J » /2
21 0 C( J ) = CTEMP1 1 2 : S ( J ) = STEMP1 12: C ( J I ) = CTEMP2/2
2 1 2 NEXT J
214 FOR J = 0 TO 2 : JO = J + Q2
1 5 6 J 1 = J + Q34 : J I = Q34 - J : K2 = 2*K1 *J : K3 = 2*K1 * ( J I - Q 2 )
2 1 8 CTEMP1 = C ( J O ) + C ( J 1 )*COS(K2) - S ( J 1 )*S I N ( K2 )
220 STEMP1 = S ( J O ) + C ( J 1 )*S I N ( K2 ) + S ( J 1 )*COS(K2)
222 CTEMP2 = C ( J O ) + C ( J 1 )*COS ( K3 ) + S ( J 1 )*S I N ( K3 )
224 S( J I ) = ( C ( J 1 )*S I N ( K3 ) - S ( J 1 )*COS( K3 ) - S ( J O » /2
226 C ( J O ) = CTEMP 1 / 2 : S ( J O ) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
228 NEXT J

, *** SUM OOD AND EVEN TRANSFORMS ( F I NAL STAGE ) ***


230 FOR J = 0 TO 4 : J1 = J + Q 2 : JI = Q2 - J
232 CTEMP1 = C( J ) + C( J 1 )*COS ( K 1 * J ) - S ( J 1 )*S I N ( K1 * J )
234 STEMP1 = S( J ) + C( J 1 )*S I N ( K1 * J ) + S ( J 1 ) *COS ( K 1 * J )
236 CTEMP2 = C( J ) + C( J 1 )*COS( K 1 *J I ) + S ( J 1 )*S I N ( K 1 * J I )
238 S ( J I ) = C ( J 1 )*S I N ( K1 *J I ) - S ( J 1 )*COS ( K 1 *J I ) - S ( J )
240 C ( J ) = CTEMP1 : S ( J ) = STEMP 1 : C ( J I ) = CTEMP2
242 NEXT J
244 FOR J = Q2 + 1 TO Q1 : C ( J ) = 0 : S ( J ) = 0 : NEXT J

[Note: we keep showing these detailed, low level, stage by stage


listings of 8 and 1 6 point FFTs because: it's one thing to explain how the
partial transforms increase in size and decrease in number, twiddle factors
change with each stage, etc., etc., and quite another to handle all these
quasi-constant variables when writing code. When we lay-out all the
nested loops sequentially as in the above listing it becomes apparent
80 Chapter 7

exactly how they change from stage to stage as well as between partial
transforms-they "j ump-out at you . " Now, this book is about FFT
applications; but, the FFT is j ust a computer algorithm. A l l FFT
applications are applications of an algorithm . . . . Listen carefully-it's
apparent there are many ways to write FFT software, and if you continue
working with the FFT you will eventually come to see that, for many
applications, it's best to write your own software (this will be amply
illustrated in the following chapters). When the day comes that you tackle
your first FFT, you will be well advised to lay-out all the loops as we have
done above. Let's look at the example before us:
From Figs. 7.3, 7.5 and 7.6; and the partial routines presented so
far, it's apparent that in each succeeding stage the J counter will count
from 0 to 1 ; 0 to 2; 0 to 4; etc. (remember we have already done the zero
stage). With the number of data points Q = 2N we know there will be N
stages of computation; so, if we let M count 1 to N, it will count the stages
of computation. Furthermore, QP = 2M will equal the size of each partial
transform in each stage, and QPI = 2(N-M) will equal the number of partial
transforms at that stage. If we review the 1 6 point transform on the
preceding page (with all its individual loops) we will find that these two
variables are most of what we need to produce a complete PFFFT. Having
made these observations it will be apparent that the new algorithm we are
looking for can be written as follows:

10 , *** F FT07-01 *** POS I T I VE FREQUENCY FFT ***


12 CLS : PR I NT " I NPUT NUMBER OF DATA PO I NTS AS 2AN"
14 I NPUT " N = "; N
16 Q = 2AN : N 1 = N - 1 : Q1 = Q - 1 : Q2 = Q/2 : Q3 = Q2- 1 : Q4 = Q/4 : Q5 = Q4 - 1
18 Q8 = Q/8 : Q9 = Q8 - 1 : Q 1 6 = Q/16
20 DIM Y ( Q ) , C ( Q ) , S ( Q ) , KC ( Q2 ) , KS (Q2)
30 P I = 3 . 1 4 1 59265358979#: P2 = P I * 2: K1 = P2/Q

39 ' **** MA I N MENU ****


40 CLS : P R I N T SPC ( 30 ) ; "MA I N MENU" : PR I NT : P R I NT
60 PR I NT SPC ( 5 ) ; "1 = ANALYZE Q/2 COMPONENT FUNCT I ON " : PR I NT
62 PR I NT SPC( 5 ) ; "2 = EX I T " : PR I NT
70 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
80 A S = I NKEYS : I F A S = III. THEN 80
90 A = VAL ( AS ) : ON A GOSUB 600, 900
92 GOTO 40

1 00 ' *** TRANSFORM ***


1 08 ' *** TRANSFORM STAGE 0 ***
110 C ( O ) = ( S ( O ) + S(Q2» / 2 : C( 1 ) = ( S( O ) - S(Q2» /2
112 FOR I = 1 TO Q 3 : 12 = 2* 1 : I NDX = 0
1 14 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2A ( N - 2- J )
The PFFFT 81

1 1 6 NEXT J
1 1 8 C ( 1 2 ) = (S( I NDX) + S( I NDX+o2» /2: C( 1 2+1 ) = (S( I NDX) - S( I NDX+o2» /2
1 20 NEXT I
1 22 FOR I = 0 TO Q1 : S( I ) = 0 : NEXT I ' CLEAR S I NE COMPONENTS
, ********* SUM REMA I N I NG STAGES ************
1 24 FOR M = 1 TO N 1 : QP = 2AM : QPI = 2 A ( N 1 - M ) : KO = QPI *K1
1 26 FOR K = 0 TO QPI - 1
1 28 FOR J = 0 TO QP/ 2 : JO = J + ( 2*K*QP)
1 30 J 1 = JO + QP : J I = J 1 - ( 2*J ) : K2 = KO*J : K3 = KO*J I
1 32 CTEMP1 = C ( J O ) + C ( J 1 )*COS(K2) - S ( J 1 ) *S I N (K2)
1 34 STEMP1 = S ( J O ) + C ( J 1 )*S I N (K2) + S ( J 1 ) *COS(K2)
1 36 CTEMP2 = C ( J O ) + C ( J 1 )*COS(K3) + S ( J 1 )*S I N ( K3 )
1 38 S( J I ) = ( C ( J 1 ) * S I N ( K3 ) - S( J 1 ) *COS ( K3 ) - S ( J O » /2
140 C ( J O ) = CTEMP1 /2: S ( J O ) = STEMP1 /2: C ( J I ) = CTEMP2 /2
142 NEXT J
144 NEXT K
146 NEXT M
148 FOR J = Q2+1 TO Q1 : C ( J ) = 0 : S ( J ) = 0 : NEXT J ' CLEAR UPPER ARRAY
150 SK1 = 2 ' SET P R I NT SCALE FACTOR

******* PR I NT OUTPUT *******


200 FOR Z = 0 TO Q3' PR I NT OUTPUT
210 PR I NT US I NG "###" : Z : : P R I NT " ":
212 P R I NT US I NG "+##. ####"# : SK1 * C ( Z ) : : PR I N T " ":
214 P R I NT US I NG "+##. ####"# : SK1 * S ( Z ) : : PR I NT " ":
216 P R I NT US I NG "###" : Z + Q 2 : : PR I NT " ":
II .
218 P R I NT US I NG "+##. ####"# : SK1 * C ( Z + Q2 ) : : PR I NT " ,
220 P R I NT US I NG "+##. ####"# ; SK1 * S ( Z + Q2)
230 NEXT Z
240 P R I N T : I NPUT "ENTER TO CON T I NUE"; AS
250 RETURN

600 ' *** Q/2 COMPONENT FUNCTION ***


602 CLS : PR I NT : PR I N T
604 PR I NT SPC( 1 0 ) : " 1 = T R I ANGLE WAVE " : PR I NT SPC( 1 0 ) : "2 = NYQU I ST "
605 A S = I NKEYS: I F A S = " " THEN 605
606 A = VAL (AS ) : I F A <> 1 AND A <> 2 THEN 602
608 PR I NT "PREPA R I NG DATA - PLEASE WA I T "
610 O N A GOSUB 650 , 660
61 2 SK1 = 1 : GOSUB 200
614 PR I NT : I NPUT " I NPUT DATA READY - ENTER TO CONT I NU E " ; AS
620 GOSUB 1 00 ' TAKE TRANSFORM
630 RETURN ' BACK TO MA I N MENU
650 ' *** GENERATE Q/2 COMPONENT TR IANGLE ***
652 FOR I = 0 TO Q 1 : Y ( I ) = 0 : C ( I ) = 0 : S ( I ) = 0 ' CLEAR DATA PO I N TS
654 FOR J = 1 TO Q2 STEP 2: S ( I ) = S( I ) + COS ( K 1 * J * I ) / (J * J ) : NEXT
656 NEXT
658 RETURN ' BACK TO GENERATE FUNCT I ON ROUT I NE
660 D = l ' *** GENERATE NYQU I ST COMPONENT ***
662 FOR I = 0 TO Q1 : Y ( I ) = 0 : C ( I ) = 0 : S ( I ) = D ' CLEAR & DATA PO I NT
666 D = D * ( - 1 ) : NEXT ' NEGATE DATA POI NT & REPEAT
668 RETURN ' BACK TO GENERATE FUNCT I ON ROUT I NE

, **********
900 STOP
82 Chapter 7

We're obviously generating twiddle factors on-the-fly here so you


might want to look into optimizing this routine. This will be our algorithm
of choice for transforming real valued time domain data; for, time wasted
transforming and manipulating negative frequencies is eliminated-this is
precisely what we need for applications such as spectrum analysis. After
working with this algorithm for a while you may find it difficult to go back
to the conventional FFT.... The biggest drawback at the moment is that
this routine works only in the forward direction.
CHAPTER 8

THE INVERSE PFFFT

8.0 INTRODUCTION

In the inverse DFT we simply generate sinusoids (with their


amplitudes prescribed by the phasor components of the DFT) and sum
together the contributions of each of these sinusoids at every data point in
the time domain. This is very intuitive-we understand what's going on.
When we perform the inverse FFT we accomplish the same result as the
inverse DFT, but the route by which we get there is considerably less
intuitive. In Understanding the FFT we didn't actually derive the inverse
FFT-there was no need to do so and precious little interest in such a
derivation. We had already shown that the inverse FFT was the same
algorithm (essentially) as the forward FFT.
For the inverse PFFFT, however; it's obvious we can't use the
same algorithm to transform from frequency to time domain-a very
cursory consideration of the preceding algorithm reveals the PFFFT starts
with Q time domain data points and produces Q/2 + 1 frequency domain
components. Ifwe attempted to inverse transform data via this algorithm
we would wind up with (Q/4 + 1 ) time domain data points, and that
obviously doesn't work. Even if we synthesized the negative frequencies
before entering this routine we would only obtain ( Q12 + 1 ) data
points. . . we really can t get there from here.
I'm afraid there's no alternative to dragging you through another
delightful experience-sorry about that :u> NOTE: Apparently , there are
a multitude of ways to interpret and construct FF1S (and inverse FF1S);
however, just because there are a lot of different ways to do it right
doesn t mean it s easy-there are even more ways to do it wrong!

8.1 THE INVERSE PFFFT

To construct an inverse PFFFT we will work the forward PFFFT


in reverse. The basic idea to this approach is as follows: start with the
final transform stage and work backward to the preceding stage (where we
summed two partial transforms to get the final results-see Fig. 8 . 1 ).
84 Chapter 8

r- FI-I-O ------�----O FO - O
00

02 r- F l -I-I --------�.---_r--O FO - I

04
r- FI-I-2 --------�rT--r__r--O FO - 2
06 8 POINT
POSITIVE
08 FREQUENCY r- FI-I-3 --------��.-r__r--O FO - 3
FFT
010
r- FI-I-4 --------�����_r--O FO - 4
012

014

@ = Complex Conjugate

01

03
r- FI-2-O L--1---cr__r--.f, 14-�,-{)FO - 5
05

07 8 POINT r- FI-2-1 I--+-Ir-O FO - 6


POSITIVE
09 FREQUENCY
FFT r- FI -2-2 L---I---i'----I I--�'-{) FO - 7
OIl

013 r- FI -2-3 L--1-________-' I----{) FO - 8

015
'--______---'r- FI-2-4

Figure 8 . 1 - 1 6 Data Point PFFFT Butterfly (Final Stage)

Since we create two components in the output by summing pairs of


components from the preceding stages (Fo.() and Fo.s, for example, are both
formed by summing F, . ,.() and F' .2.()--see above); then, given the output
components, we should be able to solve the equations used to obtain these
results for the components of the preceding stage. This will become clear
in the following paragraphs, and it will also be clear we may continue
backing through the PFFFT in this manner; eventually ending up with
exactly Q time domain data points. Okay, how are we going to do this?
Figure 8 . 1 shows the final stage of a 16 data point PFFFT. The
The Inverse PFFFT 85

first three stages of computation have resulted in two blocks shown as 8 -


point partial transforms. This diagram shows how the two partial
transforms are combined to form the nine frequencies of a 16 data point
PFFFT. The final frequency components are formed as follows:

(8. 1 )
and:
( 8 .2)

where the * indicates complex conjugates and [08 ] indicates the usual
I
phase rotation necessary for the time-shifted transform. Similarly, the
other components are formed as follows:

FO.I = F I.I.I + [0 1]F I.2.1 (8 .3 )


FO.7 = F I.I.I * + [07]F I.2.1 * ( 8 .4)

FO.2 = F I.I.2 + [02]F I.2.2 (8 . 5)


FO-6 = F I.I.2* + [06]F I.2.2* (8.6)

Fo.) = F I.I.) + [03]F I.2.) ( 8 . 7)


F0.5 = F 1.1.) * + [05]F 1.2.) * (8 . 8)
and:
FO-4 = F I.I -4 + [M]F I.2-4 ( 8 . 9)

Our objective is to work backwards from the Fo.x components to


the two sets of F I.x.x components and to do this we will treat each pair
above as simultaneous equations. Let's arbitrarily use (8 .3 ) and ( 8 .4) as
examples, recognizing all pairs will behave the same way:

{Fo.d - {FO.7 } = F I.I.I - F I.I.I * + [0 1 ]F I.2.1 - [07]F I.2.1 * ( 8 . 10 )


Let's ignore the F I.2.1 components for the moment and concentrate on the
F I.I.I components. We know the only difference between these two terms
is the negated imaginary component, so subtracting F 1.1 .1 * from F 1 .1.1
removes the real component and yields twice the imaginary component.
Now, when we work "inside" the FFT, we handle the real and imaginary
components separately, so let's look at the equations for the real parts (Le.,
the cosine components) of FO-I and FO.7 :

Re {Fo. d = (Re {F I.I .. } + Cos�I Re {F I.2.1 } - Sin,8I Im {F I.2.1 } )/2 (8 . 1 1 )


Re {Fo.7 } = (Re {F I.I.I * } + Cos�7Re {F I.2.1 * } -Sin,87Im {F I.2.1 * } )/2 (8. 1 2)

I
We ignore the requirement of dividing the summed components by 2 in the
forward transfonn-following this derivatlon will be difficult enough!
86 Chapter 8

When we subtract (8. 1 2) from (8. 1 1 ), FI _I_I disappears completely leaving:

Re { Fo_, } - Re { F0-7 } = (Re { [o l ]F,_2_, - [o7]FI _2_1 * } )/2 (8. 1 3)

Very well then, we have eliminated the F,_ , _ , term from these equations­
we now need to look at what's left [i.e., the FI_2_1 terms]:

Re { [o l ]F,_2_, - [o7]FI_2_1 * } = (Cos,8 I Re { F ,_2_, } -Sin,8 I Im { F ,_2_, } -


Cos,87Re { F I _2_1 * } +Sin,87Im { F I_2_ 1 * } )/2 (8. 14)

,81 and ,87 are the twiddle Jactor angles, and because of the way we
generate these angles, ,87 is equal to 7r - ,8 1 (i.e., they are generated by
dividing 7r into N equal increments). Furthermore, Cos(7r -,8 1 ) = -Cos( ,8 1 )
and Sin(7r - ,81) = Sin( ,81)' Substituting these Eqn.(8. 14) becomes:

Re {[o l )F' 2 do7)F ' 2 I*} = [Re{FI 2 I }(COS{JI+COs{JI)-lm {FI 2 , }(Sin{J,+Sin{J,»)/2


= [Re{F, 2 I }(2Cos{J,) - 1m {F , 2 , }(2Sin{J,»)/2
= [Re{F' 2 , }(COS{J,) - Im {F' 2 . }(Sin{J , » ) (8. 1 5)
[Note: (8. 1 5) is just the component of phasor F I _2_1 that's projected onto
the real axis when it is rotated by an angle of ,81 ']
Okay, let's now look at the imaginary terms for FO_I and FO_7:

Im { Fo_d = (Im { F ,_ , _d + Sin,8 IRe { F ,_2_, }+ Cos,8 I Im { F ,_2_, } )/2 (8. 1 6)


Im { Fo_7 } (Jm { F ,_,_, * } + Sin,87Re {F'_2_, * } +Cos,87Im { F '_2_, * } )/2
= (8. 1 7)

We know the imaginary parts of FI_I_I * and FI_2_1* are just the negated
imaginary parts of F , _ , _ , and FI _2_1 . Therefore, (8. 1 7) becomes:

To remove the F, _ , _ , term from these equations it's apparent that we must
add (8. 1 6) and (8. 1 8):

Im { FO_, }+Im { FO_7 } = (Sin,8I Re { F '_2_ d + Sin,87Re { F , 2- d +


Cos,8IIm { FI_2_1 } -Cos,87Im {FI_2_1 } )/2 (8. 1 9)

And as before, COS,87 = -COS,8 1 and Sin,87 = Sin,81 :

1m {Fo , }+Im {Fo 7} = [Re{F. 2 .}(2Sin{J,)+lm {F, 2 d (2Cos{J,»)/2


= Re{F. 2 .}(Sin{J, )+lm {F ' 2 d (Cos{J,) (8.20)

This, of course, is the component of phasor F. _2_1 that's projected onto the
The Inverse PFFFT 87

imaginary axis when it's rotated by an angle of {3 1 . Together; (8. 1 5) and


(8.20) are the rotated phasor FI .2. 1 . If we rotate the phasor represented by
(8. 15) and (8.20) backward by -{3 1 we will have the thing we were looking
for-the un-rotated phasor FI _2_1 . The real part of FI_2_1 is therefore:

Re {F, 2 d = [Re{Fo d - Re{Fo 7} ]COS{31 + [1m {Fo d+lm {Fo 7} ]Sin{31 (8.2 1 )

and the imaginary part is:

Im {FI 2 1 } = [lm {Fo I} + Im{Fo 7}]Cos{3l - [Re {Fo 1 } -Re {Fo 7}]Sin{31 (8.22)

So then, the forward transform is given by Eqn.(8.3):

Fo_, = [F,_,_, + [5 l ]F,_2_,]/2 (8.3)


I
= [F,_ , _ , + ei ,5 FI _2_ 1 ] 12 (8.3A)

while, from (8.2 1 ) and (8.22) the inverse transform for FI _2_1 is given by:

(8.23)

These are similar equations but, once we know the coefficients for F 1-2- 1
the equation for FI _ I _ I is even closer:

(8.24)

which is derived directly from (8.3A) of course. From Figure 8. 1 and


Eqns. (8. 1 ) through (8.9) it's apparent that all the harmonic components
of the FI_x_x stages may be determined from similar equations (allowing a
[50] phase term in Eqn. (8_ 1 ) equal to zero). Only Equation (8.9) is
different, but it will be solved by the same set of equations, since we
recognize that it is generated by either equation of the preceding pairs. If
we allow it to be used twice in the inverse transform routine it will
produce the correct phasor for FI_2-4 which may be used to find FI_I -4 .
From the above we may write our inverse transform routine via the
following rules:

1 . Subtract the real (i.e., cosine) term of F0-(8-x) from the real term
of Fo_x : MCT = Re { Fo_x } - Re { Fo-{8_X)} ·
2. Add the imaginary (i.e., sine) part of FO-{8-x) to the imaginary
part of Fo_x : MST = Im { Fo_x }+ Im { Fo-{8_X) } .
3. The cosine term for F I_2_X then equals MCTCos{3x + MsTSin{3x.
4. The sine term is equal to MSTCos{3x - McTSin{3x.
88 Chapter 8

Note: Steps 3. and 4. are simply the operation of rotating the phasor
backward by {3x. FI_I_x is then obtained by subtracting the rotated phasor
FI_2_X from the phasor Fo_x as follows:

5. The cosine term is given by: Re {Fo x} - Re {FI_2.X } Cos{3x +


1m {F 1 -2-X } Sin{3x.
6. The sine term is: Im {Fo.x} - Re {FI.2 X} Sin{3x - Im {FI_2-x} Cos{3x.

That's pretty much all there is to it; howeveI; in the previous


chapter we talked about writing FFT routines, constructing loops for each
stage of computation, and cascading these stages into a final, complete,
FFT routine . . . and how much fun that exercise would be. We have before
us a golden opportunity to test that proposition by writing our own inverse
PFFFT. . .to see if all the tedium is necessary or not. It might help to note
that, so far as array data management is concerned, the upper half of each
partial transform will always be empty (except for the Nyquist term).
In the following program a version of the inverse PFFFT is
created from the rules given above, but you should not expect to wind up
with identical code:

8 I ********************************************
10 I *** F FT08 - 0 1 *** POS I T I VE FREQUENCY FFT ***
11 I ********************************************
12 CLS : P R I NT " I NPUT NUMBER OF DATA POINTS AS 2"N"
14 I NPUT "N = "; N
16 Q = 2"N : N1 = N - 1 : Q1 = Q - 1 : Q2 = Q/2 : Q3 = Q2 - 1 : Q4 = Q/4
18 Q5 = Q4 - 1 : Q8 = Q/8: Q9 = Q8 - 1 : Q34 = Q2 + Q4 : Q 1 6 = Q/ 1 6
20 D I M Y C Q ) , C C Q ) , S CQ ) , KC C Q2 ) , KSCQ2)
30 P I = 3 . 1 41 59265358979#: P2 = P I * 2 : K1 = P2/Q
32 FOR I = 0 TO Q3 : KCC I ) = COS C I * K1 ) : KSC I ) = S I N C I * K1 ) : NEXT I

*******************************
******** MA I N MENU ********
*******************************
40 CLS : PR I NT SPC ( 30 ) ; "MA I N MENU" : P R I N T : P R I NT
60 P R I NT SPC( 5 ) ; "1 = ANALYZE Q/2 COMPONENT FUNCT I ON " : P R I NT
62 P R I NT SPC( 5 ) ; "2 = I NVERSE TRANSFORM " : P R I NT
64 PR I NT SPC ( 5 ) ; "3 = P R I NT RESULTS" : P R I NT
66 PR I NT SPC ( 5 ) ; "4 = EX I T " : PR I NT
70 PR I NT SPC ( 1 0 ) ; "MAKE SELECT I ON : " ;
80 AS = I NKEYS : I F A S = " " THEN 80
82 PR I NT AS
90 A = VAL C AS ) : ON A GOSUB 600, 200 , 350, 900
92 GOTO 40
The Inverse PFFFT 89

98 ' *****************************
1 00 ' *** FORWARD TRANSFORM ***
1 02 ' *****************************
1 06 ' *** TRANSFORM STAGE 1 ***
1 08 T9 = T I ME R
110 C ( O ) = ( S( O ) + S(Q2» /2 : C ( 1 ) = ( S( O ) - S(Q2» /2
112 FOR I = 1 TO Q3 : 12 = 2 * 1 : I NDX = 0
1 14 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2 A ( N - 2 - J )
1 16 NEXT J
1 18 C ( 1 2 ) = ( S ( I NDX)+S ( I NDX+Q2» / 2 : C ( 1 2+ 1 ) = ( S( I ND X ) - S ( I NDX+Q2 » /2
1 20 NEXT I
1 22 FOR I = 0 TO Q1 : S( I ) = 0 : NEXT I ' ZERO S I NE TERMS
********* REMAI N I NG STAGES **********
1 24 FOR M = 1 TO N 1 : QP = 2AM: QPI = 2 A ( N 1 - M )
1 26 FOR K = 0 TO Q P I - 1
1 28 FOR J = 0 TO QP/2 : JO = J + ( 2 * K*QP ) : J 1 = JO + Q P : K2 = QP I * J
1 30 J I = J1 - ( 2* J )
132 CTEMP1 = C ( J O ) + C ( J 1 ) * KC ( K2 ) - S ( J 1 ) * KS(K2)
1 34 STEMP1 = S ( J O ) + C ( J 1 ) * KS(K2) + S ( J 1 ) * KC ( K 2 )
1 36 CTEMP2 = C ( J O ) - C ( J 1 ) * KC ( K2 ) + S ( J 1 ) * KS(K2)
1 38 S ( J I ) = ( C ( J 1 ) * KS(K2) + S( J 1 ) * KC (K2) - S ( J O » /2
140 C ( J O ) = CTEMP 1 / 2 : S ( J O ) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
142 NEXT J
144 NEXT K
146 NEXT M
148 FOR J = Q2 + 1 TO Q1 : C ( J ) = 0 : S ( J ) = 0 : NEXT J
150 T9 = T I ME R - T9 : SK1 = 2
152 RETURN

REM ****************************************************
REM * I NVERSE TRANSFORM *
REM ****************************************************
200 P R I NT : T9 = T I ME R : SK1 = 1
202 FOR M = N1 TO 1 STEP - 1 ' LOOP FOR STAGES OF COMPUTAT I ON
204 QP2 = 2 A ( M ) : QP = I NT ( QP2/2 ) : QP4 = 2* QP2 : QP I = 2 A ( N 1 - M )
206 FOR I = 0 T O Q - (QP2 ) STEP QP4
208 FOR J = 0 TO QP : KI = J + I : KT = J * QPI : KJ = QP2 + K I
212 MCT = C ( J + I ) - C ( I + QP2 - J ) : MST = S ( J + I ) + S ( I + QP2 - J )
214 CTEMP = MCT * KC( K T ) + MST * KS( KT )
216 STEMP = MST * KC ( K T ) - MCT * KS( KT )
218 CTEMP2 = ( 2 * C ( J + I » - CTEMP * KC ( K T ) + STEMP* KS(KT )
220 S ( K I ) = ( 2 * S ( J + I » - CTEMP * KS( KT) - STEMP* KC ( KT )
222 C(KJ ) = CTEMP : S ( K J ) = STEMP : C ( K I ) = CTEMP2
224 NEXT J
226 NEXT I
228 NEXT M
229 ' ******** F I NAL STAGE ********
230 FOR I = 0 TO Q3 : 1 2 = 2* 1 : I NDX = 0
232 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2 A ( N - 2 - J )
234 NEXT J
236 S ( I NDX ) = C ( 1 2 ) + C ( 1 2 + 1 ) : S ( I NDX + Q2) = C ( 1 2 ) - C ( 1 2 + 1 )
238 NEXT I
240 FOR I = 0 TO Q1 : C ( I ) = 0 : NEXT I
242 T9 = T I ME R - T9
244 RETURN
90 Chapter 8

********************************
******* P R I NT OUTPUT *******
********************************
350 CLS : PR I NT SPC ( 1 6 ) ; "***** "; NMS; " *****"
352 P R I NT " FREQ F ( COS) F(SIN) FREQ F ( COS)
F(SIN)"
354 PR I NT
362 TZT = 20 : FOR Z = 0 TO Q4 ' P R I NT OUTPUT
364 PR I NT U S I N G "####" ; Z ; : P R I NT " ";
366 P R I N T U S I N G "+##. #####" ; SK1 * C ( Z ) ; : P R I N T " ";
368 P R I N T U S I N G "+##. #####" ; SK1 * S ( Z ) ; : P R I NT " ";
370 P R I NT U S I N G "######" ; Z + Q4; : P R I NT " ";
II .
372 P R I NT U S I N G "+##. #####" ; SK1 * C ( Z + Q4 ) ; : P R I NT " ,
374 P R I N T U S I N G "+##. #####" ; SK1 * S ( Z + Q4 )
376 I F Z > TZT THEN TZT = TZT + 20 : I NPUT AS
378 NEXT Z
380 P R I NT : P R I NT "T = "; T9: I NPUT "ENTER TO CONT I NUE"; AS
382 RETURN

600 ' *** GENERATE S I NE WAVE COMPONENT ***


602 CLS : P R I N T : P R I NT
604 I NPUT "PLEASE SPEC I FY FREQUENCY"; F9
608 WTMSGS = " PREPAR I NG DATA - PLEASE WA I T "
6 1 0 FOR I = 0 TO Q 1 : C ( I ) = 0 : S ( I ) = S I N ( F9 * K1 * I ) : NEXT I
618 T9 = T I ME R
6 2 0 GOSUB 1 00 ' TAKE TRANSFORM
622 GOSUB 350 ' D I SPLAY TRANSFORM
630 RETURN ' BACK TO MA I N MENU
, **********
900 STOP , THAT ' S ALL FOLKS

Note that, again, we have combined the bit-reversal routine with


the final rotate and sum stage of the transform. When was the last time
you had so much fun so cheaply?
CHAPTER 9

THE SPECTRUM ANALYZER

9.0 INTRODUCTION

It might seem that spectrum analysis would be the simplest and


most direct application of the FFT for, after all, that is what an FFT
does-it finds the spectrum of a time domain signal. Unfortunately, as we
shall see in this chapteJ; practical spectrum analysis turns out to be neither
simple nor direct. We choose the spectrum analyzer as an application not
because it is simple, but because it is enlightening. We will emerge from
this chapter with a much better understanding of Fourier transforms.

9. 1 THE NATURE OF THE BEAST

Spectrum analysis brings us into conflict with the real world, for
here we don't have the luxury of analyzing mathematical functions that are
made-to-order (so to speak). In the practical realm of spectrum analysis,
the signals are generated by and for completely independent criteria, and
the customer who purchases an instrument to analyze his spectrum expects
it to accurately measure and display the spectrum of his signal-not
artifacts of the DFT process.
We begin our investigation using the program we developed in the
last chapter (i.e., FFT08 . 0 1 ). We will study a simple input-a single
sinusoid (a sine wave) with its frequency selected by the user. This single
sinusoid input is ideal for our task-it produces a single point in the
frequency domain so it will be easy to understand what we see. So, what
could possibly go wrong?
At this early stage in our discussion we need waste no time on
long-winded theoretical discussions-as they say in show-biz, let's cut
directly to the chase' .
'
Hollywood discovered long ago that, after struggling intenninably with no story
at all, a 1 0 minute "chase scene" guaranteed a box office success Shortly thereafter
everyone figured out what they were doing-hence the expression. These expressions can't
stand up to the overuse they're given but, used sparingly, they're effective
92 Chapter 9

Run FFT08.0 1 (from the previous chapter) and select N = 6 for


64 data points (this will make it easy to see and understand the data
printout). Next select a frequency of 1 6 (i.e., half way to the Nyquist).
The computer will chum through the analysis and a truly profound thing
will happen-a single data point will show up on the printout at!= 1 6 (if
you find this result surprising, a little review work might be in order :-).
FREQ F ( COS ) F ( SIN) FREQ F ( COS) F ( SIN)

a -0 0000 + 0 0000 16 +0 0000 +1 0000


1 -0 0000 +0 0000 17 - 0 0000 - a 0000
2 -0 0000 + 0 0000 18 -0 0000 - 0 0000
3 -0 0000 + 0 0000 19 - 0 0000 - 0 0000
4 -0 0000 + 0 0000 20 - 0 0000
5
- 0 0000
-0 0000 + 0 0000 21 - 0 0000 - a 0000
6 -0 0000 + 0 0000 22 - 0 0000 - 0 0000
7 -0 0000 + 0 . 0000 23 - 0 0000 - 0 0000
8 -0 0000 + 0 . 0000 24 - 0 0000 - 0 0000
9 -0 0000 + 0 0000 25 - 0 . 0000 -0 0000
10 -0 0000 +0 0000 26 - 0 0000 - 0 0000
11 -0 0000 +0 0000 27 - 0 0000 - 0 0000
12 -0 0000 +0 0000 28 - a 0000 - 0 0000
13 -0 0000 29
- a 0000
+0 0000 - 0 0000 - 0 0000
14 + 0 0000 30 - 0 0000 - 0 . 0000
15 -0 0000 +0 0000 31 - 0 0000 - 0 0000
16 + 0 0000 +1 0000 32 -0 0000 - 0 . 0000

TIME - 5 . 8 5 9 3 7 5 E - 02

Okay, we know the DFT (and FFT) can only analyze waveforms
into orthogonal components. That is, frequencies that fit perfectly into the
time domain interval; howeveJ; we also know that, in the real world, the
s inusoids we input to our spectrum analyzer may be any frequency
whatsoever! So, what happens when we analyze some frequency that's not
a perfect match for our computer algorithm? What happens when we
analyze a sinusoid that doesn't match-up with the harmonics used in the
analysis?
Run FFT08.0 1 again and this time select a frequency of 16. 1 .
Pretty messy, hey? Messy, but nonetheless, the basic sine wave component
is still there . . . we knew something would have to "give." Look at it this
way: it would seem not unlikely that the amplitude of a sinusoid (whose
frequency was between the frequencies of our analytical scheme) would be
sort of averaged between the frequencies on either side. Okay, but what's
that garbage all over the spectrum?
Run the an alysis yet again, and sel ect a frequency of 1 6. 2
Ummm. . .things are not getting better We can still tell there's a signal in
there somewhere, but the garbage is getting worse.... Let's cut directly to
the chase here. Run the analysis with a frequency midway between the two
analyzing components-run it at 16. 5 Hz. The result of this analysis is
shown in the printout below, and it's not good!
The Spectrum Analyzer 93

FREQ F ( CeS) F ( SIN) FREQ F ( CeS) F ( SIN)

0 +0 0298 + 0 0000 16 +0 6361 -0. 0000


1 +0 0 2 9 9 + 0 0000 17 -0 6376 +0 0000
2 +0 0 3 0 3 - 0 0000 18 -0 2137 +0 0000
3 +0 0 3 1 0 - 0 . 0000 19 -0 1294 +0. 0000
4 +0 0321 -0 0 0 0 0 20 -0 0936 +0 0000
5 +0 0 3 3 5 - 0 0000 21 -0 0739 +0. 0000
6 +0 0355 - 0 0000 22 -0 0616 +0 0000
7 +0 0 3 8 0 - 0 0000 23 -0 0533 +0. 0000
8 +0 0 4 1 3 - 0 0000 24 -0 0474 +0 0000
9 + 0 . 04 5 7 - 0 0000 25 -0 0431 +0 0000
10 +0 0 5 1 6 - 0 0000 26 -0 0399 +0 0000
11 +0 0600 - 0 0000 27 -0 0375 +0 0000
12 + 0 0723 -0 0 0 0 0 28 -0 0357 +0 0000
13 + 0 0920 -0 0000 29 -0 0344 +0 0000
14 +0 1278 - 0 0000 30 -0 0335 +0 0000
15 + 0 . 2122 - 0 0000 31 -0 0330 +0 0000
16 +0 6361 - 0 0000 32 -0 0328 -0 0000

TIME . 0 0000

We are generating a sine wave to test our FFT analyzer, but the sine
component has disappeared completely. There's nothing but cosine
garbage spattered all over the spectrum. We're supposed to sell this thing
to people who want to see the sinusoidal components in their signal, but it
has completely lost our input component. I wouldn 't buy this thing
myself1 Ahhhhhhh . .Mission Control, we may have a problem.
.

Why does the transform of a single sinusoid come out this way?
Well, that is the question; but, before we rush off on that tangent let's
complete the above illustration. If you reconstruct the 1 6.5 Hz signal from
the garbage shown above, you will get a faithful reproduction of the
original input! Even though no sine component appears at 1 6.5 Hz (there
is no 1 6.5 Hz component), the cosine component garbage yields a sine
wave on reconstruction. Apparently this is a legitimate transform(?}, but
it's like our FFT has "busted a spring" trying to come up with a transform
for a frequency it doesn't have ! That kind of commitment is admirable,
but this busted spring transform is useless as a spectrum analyzer.
Ahhhhh . . Mission Control, we do have a problem.
.

Now let's look at why. First of all, the size of the data array (e.g.,
64 data points, 1 28 data points, etc.,) isn't completely arbitrary. Sampling
rate must be twice the highest frequency in the signal (we will talk about
this in detail later) and we must digitize long enough to include the lowest
frequency ofinterest. Other things will influence the decision (e.g., the use
of a round number 2N data points); still, the lowest and highest frequencies
of concern will determine the minimum data array size (i.e., sampling rate
multiplied by data interval-see Fig. 9. 1 ) . Now, from the orthogonality
requirement, we must analyze this data using harmonics whichfit into the
data interval (i.e., we must use integer multiples of the fundamental
94 Chapter 9

sinusoid that fit exactly into the domain of the digitized function-Fig.
9 . 1 ) ; however, it's clear the problem w ith the N+ 1 I2 Hz frequency
components dropping out is related to the use of these integer multiple
frequency components. . . hmmm.

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - Samplia£ Pulses
J. = Samplbrg Rate

F Data Interval ---:+I


A"ay Size = fs(Data Interval)

Fundamental
-- for Analysis
.'

Figure 9. 1 - Data Array Size

9.2 FRACTIONAL FREQUENCY ANALYSIS

It's pretty obvious we will have to break out of these restrictions


if we hope to build a better mousetrap . . . but how? Well, I've always
wondered if we're really forced to use this integer multiple frequency
configuration? [I can j ust hear the folks back in Peoria right now. . .
"What?!! What are you talking about Andy?!! Have you lost your mind?!
� 've gone through one and a half books constantly hammering at the
necessity of using orthogonal components!'1

1111111111111111111111 1II - Samplia£ Pulses


Is - Sampling Rate

F Data Interval ---:+I


Fundamental
. -- for Analysis
.
.

Half Cycle --I ' .

Figure 9.2 - Half Hertz Analysis

In Figure 9.2 we place the data shown in Fig. 9. 1 into an array of


twice the length (i.e., if our array in Fig. 9. 1 was 64 data points, we would
use those data points for the first half of a 1 28 data point array and pack
The Spectrum Analyzer 95

the second half with zeros). We know we can take the FFT of this 1 28
point array just as we did the 64 point array, and we know the inverse
transform will reproduce the data we started with (i.e., 64 data points
followed by 64 zeros). Let's ignore the 64 zeros for now and look at what
has happened to the relationship ofthe fundamental (and harmonics) of the
analytical configuration. Look at Fig 9.2 again-as far as the 64 data
points are concerned we are now analyzing the data every 1 12 Hz!
We can see where this is going; but, is this transform the same as
the one we obtained before? Obviously it isn 't-we have frequency
components we didn't have before, but is this a "correct" spectrum for our
64 data points? There can be no question this is a legitimate transform . . .
but i s i t the true spectrum o f the input signal? Will i t accurately display
sinusoid components that really exist in the input signal (and not display
components that don t exist in the input signal)? A more immediate
question is whether this 1 /2 Hz transform will actually recover the
fractional frequency we lost in the conventional transform?
Let's cut to the chase scene here. What we really want to know
is this: "Can we develop a 1 /2 Hz FFT that will cause our spectrum
analyzer to detect half-frequency components?" Well, we can certainly
make an analyzer that will lookfor 112 Hz components! All we need to do
is increase the array size to the next power of2 and fill the second half of
the array with zeros. [There is, of course, another way, but let's keep it
simple-at least until we can figure out if this is going to work.] The real
question is whether this will accurately display 112 Hz components.
Okay, let's cut to the chase here-just run program FFT9.02
(Appendix 9.4). This program starts-up with a menu of fractional­
frequency modes. Any selection jumps to a spectrum analyzer display
(with a single frequency input signal). We can increment or decrement the
frequency by 0. 1 Hz increments using the cursor control (arrow) keys.
Okay, let's find out what we really want to know-select the second
illustration which implements 112 Hz analysis of the data. We note that
now, with this 112 Hz analysis, even with a nice round integer frequency
the garbage is present.. .but let's not worry about that now. . . . Using the
cursor key, step the frequency up 0.5 Hz (i.e., press the right cursor arrow
five times). Watch the spectrum change with each step. Even though the
amplitude still changes with each step, it only varies by a few percent-it
certainly never vanishes. Okay, we just might be moving forward here . . . .
96 Chapter 9

Let's pause here to talk about this extended array data and its
transform. Fig. 9.2 (and a little mental juggling) reveals that the even
components of the 1 28 point analysis are identical to the components of the
original 64 point analysis (recognizing an amplitude scalefactor change of
course). So, if the even frequency components are identical to the original
analysis, what are the odd frequency components doing? If the even
frequency components represent the original spectrum, how much do these
additional odd components distort the spectrum?
[Consider this: if we input an integer frequency sinusoid, the even
components will be identical to the original analysis, but on reconstruction
the transform must know to stop generating data after the first 64 data
points. There must be something in the spectrum which starts and stops
the reconstructed data-something that makes it appear in the first half of
the 1 28 data point array. If the even components are identical to the
original transform components, it would appear the odd components must
contain the information about starting and stopping in the front half; but,
do these odd frequency components make this spectrum unusable as a
spectrum analyzer?]
Run FFT09.02 again and select illustration 3. This time we make
the array four times the length of the data being analyzed-we are now
analyzing the data at 1 14 Hz intervals. If we scan the spectrum the
amplitude varies even less than before; but, also, the garbage is beginning
to look coherent.. .hey guys, is that a light I see at the end of the tunnel?
Enough of this-let's really cut to the chase. Run illustration 5
and now you will see that the garbage actually has a well-defined structure

�::
(Fig. 9.3). These bumps are (to a good approximation) the absolute value

!�

Is = Signal Frequency
J; = 1/Io
fNyquist
( nf, = Integer

1

1 \,
Harmonics
", ,, I :·
.
: :
1\ • :
. f\... \
Figure 9.3 - 1 1 1 6 Hz Transform
of a sine function. What's really going on here?
We all see that this sinc function appears because we have packed
the aft end of the array with zeros, but some suppose it's generated by an
The Spectrum Analyzer 97

illegitimate(?) configuration. Some, howeveI; may see there's nothing


really wrong with this configuration, and suspect the sinc function is just
the inherent bandpass characteristic of Fourier analysis. Still others may
see that, when we view a spectrum via the conventional transform, we're
sort oflooking through a picket fence, and when we analyze sinusoids that
exactly match the orthogonal Fourier components the sinc function just
happens to be hidden behind the pickets; howeveI; when harmonics of the
input function do not match the Fourier components, the sinc function
appears in the spectrum. Consequently, when we analyze the data with 1 /2
(or 1 /4, etc.) Hz components, the sinc function can no longer be hidden,
and as we increase the frequency domain resolution via fractional
frequencies, we begin to see the real nature of the transformed function
(i.e., we see between the pickets of the fence).
There's an obvious consideration here that's virtually invisible to
the uninitiated. The data array that we analyze must always be limited to
a finite number of data points-real data must always have a beginning and
an end. Ifwe simply follow instructions, and do things as we are told, we
may indeed miss the signifi cance of this; however, if we do things
differently (e.g., we put our sampled data into an oversized array), we
begin to see a sinc function spectrum (implying that our data has a
beginning and an end). Let's try to make this cieare[

9.3 THE DREADED SINC FUNCTION

Note ' You may have recognized that, while we 're ostensibly
illustrating how the FFT is applied, we spend a lot of time kicking around
fundamentalphenomena underlying this technology � introduce the sine
function here, but we will return to this profound little gizmo repeatedly in
the following chapters.
Let's cut directly to the chase-what the heck's a sinc function?
A sinc function is defined as Sin(x)/x. That is, it's a sine wave divided by
its own argument so the amplitude
decreases as the argument increases.
Interestingly, although the sine func­
tion starts with a value of zero, the
value of Sin(x)/x starts at 1 .0 (we ex­
plained why this happens back on p. 6
at the end of Chapter 1 ), but there are Figure 9.4 - The Sinc Function
98 Chapter 9

less obvious attributes we should discuss. Technically, Sin(x)/x is the


"Saw" function [i.e., Sa(x)]-the sinc function is really Sin( n)/7rx. The
distinction arises since the argument of a sine function must be an angle,
so the introduction of 7r changes the nature of x. That is, the introduction
of 7r implies radians (x is then apure number) otherwise x itself must be
an angle. So, if we define our function as Sin( 7rx)/lnl (where Inl is the
magnitude only) we are very close to what is shown in Fig. 9.4. On the
other hand, if we write Sin(n)/n we are technically saying that the sine
of x is divided by a rotational entity-an angle-a complex quantity.
Table 9. 1 compares several variations on this theme [note that, in complex
quantity versions, this function dwells in the third/fourth quadrants] .

x S i n(TX)/X S i n(TX)/ I TX I S i n(Tx)/TX S i n(x )/x

0.0 +3 . 1 4 1 + 1 . 000 + 1 . 000 - J O . OOO + 1 . 000 - J O . OOO


0.2 + 2 . 939 +0 . 935 +0 . 757 - J O . 550 +0. 974 - J O . 1 97
0.4 + 2 . 378 +0 . 757 + 0 . 234 - J O . 720 +0 . 897 - J O . 379
0.6 + 1 . 585 +0. 505 - 0 . 1 56 - J O . 480 +0 . 777 - J O . 531
0.8 +0 . 735 +0 . 234 - 0 . 1 89 - J O . 1 3 7 +0 . 625 - J O . 643
1 .0 - 0 . 000 - 0 . 000 +0. 000 - J O . OOO +0. 455 - J O . 708
1 .2 - 0 . 490 - 0 . 1 56 +0 . 1 26 - J O . 092 +0 . 281 - J O . 724
1 .4 - 0 . 679 -0.216 +0. 067 - J O . 206 +0 . 1 20 - J O . 694
1 .6 - 0 . 594 - 0 . 1 89 - 0 . 058 - J O . 1 80 - 0 . 01 8 - J O . 624
1 .8 - 0 . 327 - 0 . 1 04 - 0 . 084 - J O . 061 - 0 . 1 23 - JO . 527
2.0 +0. 000 +0. 000 +0. 000 - J O . OOO - 0 . 1 89 - J O . 4 1 3
2.2 +0. 267 +0 . 085 +0. 069 - J O . 050 - 0 . 2 1 6 - J O . 297
2.4 +0 . 396 +0 . 1 26 +0 . 039 - J O . 1 20 - 0 . 208 - JO . 1 90
2.6 +0. 366 +0. 1 1 6 - 0 . 036 - J O . 1 1 1 - 0 . 1 70 - J O . 1 02
2.8 +0 . 2 1 0 +0. 067 - 0 . 054 - J O . 039 - 0 . 1 1 3 - J O . 040
3.0 +0 . 000 +0. 000 - 0 . 000 - J O . OOO - 0 . 047 - J O . 007
3.2 - 0 . 1 84 - 0 . 058 +0 . 047 - J O . 034 +0 . 0 1 8 - J O . 001

Tab l e 9 . 1

So, how do these sinc functions get into the spectrums of


fractional frequency transforms? More importantly, is it really contained
(but hi dden) in the spectrums of data we obtain with conventional
transforms? These are important questions for they are, literally, the
difference between seeing the world through picket fences and seeing the
world as it really is. If we can find out how the sinc function gets into the
Fourier transform in the first place, we can probably tell if it's always
present (when data starts and stops) . Let's start b y considering the
archetypical start/stop function.
The Spectrum Analyzer 99

9.4 THE UBIQUITOUS SINC FUNCTION

When we introduced the concept


that any complex waveshape could be
created by summing sinusoids, we used Amplitude= I Amplitude = 0
the example of a square wave built from
Time
odd harmonics (whose amplitudes were Fig. 9.5 - Unit Rectangle
inversely proportional to their harmonic
number). Let's go back and look at that square wave from a fractional
frequency point of view. [Note that, if the on time equals the off time we
allow the wave is square-otherwise we refer to it as a rectangle wave.]
We modify program FFT09.02 as follows:

400 REM GENERATE RECTANGLE FUNCT I ON


4 1 2 S(I) = 1

This generates a function of constant value 1 .0. We will also need to


change the scale factor for displaying the data:

350 CLS : XO = 5 0 : YO = 300 : XSF = 500 I 02: YSF = 250 * 0 I 01

If we now run the program ( 11 1 6 Hz analysis) we will get the display


shown in Fig. 9.6 once again, the absolute value of a sinc function.
Now, it's intriguing that the


transform of a rectangle wave is a sinc


function-rectangle functions do little
more than start and stop (i.e., if we

- Integer

f,
o 1 Harmonics multiply a second function by this
·

rectangle function, the rectangl e


-

. .!\. /�
I \'\." �
serve s o n l y to start and stop t h e

second function). We can almost see


Fig. 9.6 - Rectangle Xform where this argument is going-we can
almost see a distant castle beginning
to appear through the slowly clearing fog. We can help the fog along by
considering another of those fundamental notions that will come up
repeatedly throughout this book-one we have already introduced-the
phenomenon of modulation.
1 00 Chapter 9

9.S MODULATION

As we discussed back in Chapter 3 (Section


3 .2, p.2 1 ), if we multiply one sinusoids by another
we get a unique product called sidebands (see fig.
right). If we multiply a high frequency sinusoid by
'IIohlpllcd by '
a function that's composed of a summation of
sinusoids (e.g., a rectangle wave), the modulated 1\ -
n. }
sinusoid will be replaced with sideband pairs for
every harmonic of the modulating wave. That is, if \/ /nh
Prod.eft
we modulate ( i . e . , multiply) a sinusoid by the
rectangle function described on the previous page, � ,�
the sinc function spectrum will replace the sinusoid.2 .� V
If, then, we modulate some complicated
waveshape (containing multiple harmonics) with a
rectangle function, we must surely find that every
harmonic of the modulated waveform is replaced by
sideband components equal to the harmonics of the
modulating waveform. That is, every harmonic of
the modulated wave will be started and stopped by Figure 9.7 -

the rectangle function, and therefore replaced by the Modulation

sidebands of the modulating wave. So, it's apparent that, in our fractional
frequency transform, this is what we have done. We have multiplied the
signal by a rectangle function (in the time domain, see Fig. 9. 8), and the
sinc function spectrum must appear about the harmonics of the input
function in the frequency domain.
Clearly, then, whenever we start and stop data (as in a fractional
frequency transform) we are effectively multiplying by a rectangle
function, and the sinc function must always appear in the resulting
spectrum. But wait-this is true whether we analyze with fractional
frequencies or not! When we start and stop data, mathematically we are
multiplying by a rectangle function, and the sinc function spectrum will
appear about the harmonics of the sampled data function (Fig. 9.3). In a
sense, these sinc function sidebands are the frequency domain start and
stop. . .the beginning and end of the sampled data interval.
[Note: If the function we sample is more complicated than a single
2
We should note that, if the modulating function contains a constant term (i e ,
a DC component), the sinusoid being modulated will not disappear from the product
The Spectrum Analyzer 101

sinusoid (i.e., if it's composed of hannonic


components) and every hannonic has its own
set of sinc function si debands, then the
resulting spectrum will not be a simple sinc
function. In general, spectrums will be quite
complicated (since all the sinc function side-
bands fall on top of each other), and what we This

see for any hannonic component will be the 1------,


times /""
summation of this convoluted mess.]3 This ./

Okay, t h e spectrums o f a ll data 1- --'-


___ ___
_

having a beginning and an end will be conv­


equals
olved with a sinc function spectrum; howevet; ..---
This
in the conventional FFT, the components of
this sinc function are hidden. That is, if the 11-++++++-++-+-'-----­
hannonic components of the input signal fit
exactly into the domain of the data, the sinc
function components will always be zero Figure 9.8
(Figs. 9.3 and 9.6). Indeed, that is precisely
why we select these specific components. If, then, we digitize some
periodic function (e.g., a sinusoid), and our data interval is not an exact
multiple of it's period, we will encounter the spectrum of the sinc function
(Fig. 9.9), for it doesn't matter whether the analyzing function or the
function analyzed results in non-orthogonality. This, then, is the
phenomenon we have discovered in our attempts to design a spectrum
analyzet This isn't just a mathematical gimmick-the sinc function is the
frequency domain representation of data that starts and stops!
So, the sinc function must indeed be ubiquitous-it's present in
the spectrum of all data that begins and ends-it's present in the spectrum
of all real data we measure. Not only is it present-it will be visible if we
look for it. It will rear its
.�. dreaded head every time we
.. :. fs = 1 6.5 measure data that contains
non-orthogonal sinusoids on
.f\... :"... . the data interval. That is,
with real d ata, it w i l l b e
Fig. 9.9 - 1 / 1 6 Hz Transfonn
present all the time)!
3
1f you trace this out, step-by-step, you will see it's identical, mathematically, to
the procedure we called convolution in the last chapter of the first book.
102 Chapter 9

9.6 SINC FUNCTION AND RESOLUTION

Until this chapter we have limited our Fourier analysis to


orthogonal sinusoids. When we interfacewith the real world, however, we
find the sinusoidal components within any signal will seldom be perfectly
orthogonal with the time domain interval. We can't see these real world
harmonics with fidelity unless we use a fractional frequency transform, and
when we employ fractional frequencies the dreaded sinc function appears.
Now, using integerfraction frequencies doesn't really violate the orthog­
onality requirement-it's equivalent to looking at the input signal on a
larger domain-that's a major point we're trying to make here.
In practical spectrum analysis there are two more or less obvious
problems created by the sinc function-resolution, andside-lobe
interference. As shown in Figure 9.3, the sinc function broadens the
components of the input signal,
making it impossible to distinguish
two c o mp o n e n t s t h at are c l o se __ This Dala Interval

togetheJ: From the similarity theorem, I+f.l.d"��----::o""'"-";:::"'--=::::-::­


of course, we know that if we expand
Fig. 9. 10 - Similarity
the rectangle (i.e., we sample the data
for a longer interval), the sinc function becomes narrower The way to
resolve components that are close together, then, is by sampling the data
for longer intervals. We include this provision in version 2 of the spectrum
analyzer (FFT9.02).

9.7 INTERFERENCE OF THE SIDE LOBES

Our second problem with the sinc function is this: the sinc
function side-bands are of non-negligible amplitudes. These side lobes ride
on the signal components and wreak havoc on quantitative analysis. Now,
in a practically useful instrument we expect to resolve signals more than
100 db down. To see the severity of
• t-----,:It--- -.�::- this effect we must display the spec­
- ....

- 1-----.."II\-fII..-------
----::c trum in the way it's most often dis­
. I- played on spectrum analyzers-as the

logarithm of amplitude ratios (i.e., in
..

terms of deci-bels). We use a db scale


Fig. 9. 1 1 - Log Scale display in FFT09.02 and, in Fig. 9. 1 1 ,
The Spectrum Analyzer 1 03

show the effect of the side lobes.4 This, obviously, is unacceptable.


N o w, w h en w e s t u d i e d fi l t e r s i n
Chapter 3 , we noted a similar phenomenon (in
the time domain) for a truncated spectrum (i.e.,
�++�HHHH�+++
Gibbs' phenomenon). In that particular case, we
noted that we could fool the system by using a
Gaussian filter. That is, by gently rolling-offthe m --'
harmonics (rather than harshly truncating them),
we could make Gibbs go away. So, if we start
and stop the time domain function gradually, can 1'-------"
we make the sine function spectrum go away?
The answ er, of course, i s yes. By
employing weighting functions, we can greatly
�++�HHHH�++++� v
attenuate this effect. The sinusoid we hope to v
analyze is shown at the top of Fig. 9. 12. Since
it starts and stops, it must possess sinc function
Fig. 9 . 1 2 - Weighting
sidebands; however, if we multiply this signal by
some function that starts and stops gradually, then its spectrum will
modulate the (harmonics of the) input signal. For example, in Fig. 9 . 1 2 we
multiply the input signal with a half cycle of sine wave, and indeed, if we
run this example in FFT09.02 we find the side lobes are attenuated.
Several weighting functions are provided in FFT09.02 [Le., Sin2(x),
Sin4(x), etc.] with impressive results (see Figs. 9 . 1 3 and 9. 1 4) but Sin2N(x)
is not the only possibilitys.
F F T 0 9 . 0 2 is designed to a l l o w
experimentation with fractional frequencies,
data interval, and weighting functions. The
N
two characteristics we are most interested in
are component separation and fidelity of
quantitative results. You will find that the
variables of this program are interactive, and
o N the use of a weightingfunction doesn't mean
Fig. 9. 1 3 - Weighting Functions fractional frequencies are unnecessary
(try
holding amplitudes accurate to 0.01 db for example).
4
There is an incredible amount of confusion about the dec i-bel In spite of what
you have heard, there's only one deci-bel (see Appendix 9.3).
s
See Ch. 4 of Smith and Smith's Handbook of Real Time Fast Fourier
Transforms, IEEE Press They discuss 1 3 different weighting functions (23 illustrations).
104 Chapter 9

9.8 CONCLUDING OBSERVATIONS

. _ ---

• . OR
II
. It j ust might be possible to
produce improvements over the old
• analog instruments. Don't be misled by

• the s l owness of these pro grams­
..
BASIC is notoriously slow ! 6 With

- memory so cheap, we could digitize


.. data for long intervals, so frequency
- ,�
1.·.I''Vml ....... '.. " mill resolution is potentially better than the
Fig. 9. 14 - -80 db Component old instrume nts. Also, combining
fractional frequency analysis with the
weighting functions begins to bring quantitative data in line (even with the
limited program presented here we can approach 0.0 1 db). The software
can be speeded up tremendously by simply getting out of BASIC, but there
are a great many other ways to speed things up. For example, the FFT is
well suited for multiprocessor application. The odd and even data points
separate easily and can be processed simultaneously-the stages of
computation are also well-suited for pipeline architectures.
In our studies up until now we have made a great deal over the
need for orthogonal sinusoids-integer multiple frequencies with average
values of zero over the domain of definition-we have flatly insisted on
orthogonality of the basis function components (see Chapter 2 of
Understanding the FFTand Sections 3 .4 in this book). When we consider
that there's no difference in the analysis of a partially filled data array (i.e.,
one that has been packed with trailing zeros) and simply taking the
transform of a full array using fractional frequencies, then fractional
frequencies don't seem so bad. We recognize, of course, that on a larger
domain (i.e., one packed with zeros), these fractional frequencies are of
zero average value-they are orthogonal. On this larger domain they only
detect (reveal) the condition that the function being analyzed has a
beginning and an end. So, then, it would appear that we may not only use
integer multiple frequencies, but also frequencies that are the reciprocals
of the integers (i.e., 112, 114, 118, etc.) in our DFT analysis.

·Chip Sets" are available from major manufacturers which run a 1024 point FFT
6

in typically about 1 to 2 ms (Le., .001 to 002 sec ).


CHAPTER 1 0

ABOUT SAMPLING THEORY

1 0.0 INTRODUCTION

Input Signal Negative Frequency


Harmonics Components

.. .. . . .'

/�
.

Nyquist Signal Frequency yqulstSampling Rate


@ 2 Alternations/Cycle @ 1 Sample/Cycle
(Covers This) �
Figure 1 0. 1 - Nyquist Sampling Relationships

Since practical systems have finite bandwidths there will always


be some highest frequency of interest. As you may already know, to
properly digitize a signal we must sample at twice the highest frequency
contained in that signal (according to Claude Shannon's sampling theory). 1
This is the Nyquist sampling rate as everyone knows; but, why is the ratio
of 2: 1 so sacred? Why not l : l . .. or 4: 1 .. . or 1 0: 1 ? Now, it's reasonably
obvious that, if we take a sufficiently large number of samples (say 8 to
1 6 for each cycle), the original signal will be faithfully captured; but, why
is two considered necessary and sufficient? This is a puzzle worthy of a
little effort, and since we sincerely believe this is the sort of thing we're
good at, we really can't just turn away....
l
in 1 948 Claude E. Shannon published a two-part paper which is now regarded
as the foundation of modem infonnation theory In his 1 949 paper Communication in the
Presence of Noise. he called the cntical sampling interval the Nyquist Interval and the
name stuck. Why Nyquist? Harry Nyquist, working for AT&T in 1 924, published his
paper, Certain Factors Affecting Telegraph Speed, in which he defined line speed as one
half the number of signal elements which can be sent per second. E.T. Whittaker,
however, may claim pnonty, publishing his work in 1 9 1 5 .
1 06 Chapter 10

Okay, our reputation is at stake, so we wilI claw and scratch for


any hand-hold to get started. Now, Fig. 1 0.2 shows two alternations to
each cycle of a sinusoid, and it's apparent that, if we hope to capture every
little bump in the signal, we must have one sample for each alternation (at
least). That, of course, would be two samples per cycle of signal.

Negative Alternation

� 1_

Sample
Pulses

I
I
Two I
- Sample -J
Pulses
Figure 1 0.2 - Nyquist Samples per Cycle
Lets clear a hole in thefog here: in discussing this phenomenon
we will sometimes refer to the highest frequency component in the signal
as the Nyquist frequency while the sampling rate will be referred to as the
Nyquist sampling rate. This confusing terminology comes about simply
because of the way we specify Signal frequency (as opposed to sampling
rate) The "Hertz" implies a number offull sinusoids (two alternations in
a cycle)per unit time while Samples per Second implies a number ofSingle
events (samples) per unit time. If we were to define the frequency of
sinusoids by the number of alternations per unit time, then the 2: 1 ratio
would become 1 : 1. The point is this: in a sense the sampling rate is
actually the same thing as the Nyquist signal frequency-its just that we
only count one sample per "cycle" of sampling rate, but we count two
alternations for a cycle of signal (compare Figure 10. 1 to Figure 10.2).
So, it appears there's nothing mysterious about the Nyquist
sampling criterion of 2: I . . . but there's a bit more to it than just this two
alternations vs. one sample per cycle. Surely 2: 1 is imperative if we hope
to capture the highest frequencies, but is 2: 1 enough? Can we realIy (in the
practical world) capture and reproduce a high fidelity replica of any signal
at 2: I ? Let's investigate some of the sampling rate implications that may
not be immediately obvious.
Sampling 107

10.1 NEAR-NYQUIST SAMPLING

Sampling at the Nyquist rate provides a sort of bare bones


minimum of information about the signal, and if things work out as shown

f\ f\ f\

I � at Zero C rossover
I I I I� I I
Figure 1 0.3 - Out-of-Phase Sampling

in Fig. 1 0.2, we will capture every fluctuation in the signal; howevet; what
if the signal and sampling pulses are shifted in phase? Suppose things are
as shown in Fig. 1 0.3? Here the digitized data will indicate no signal
when, in fact, a perfectly good sinusoid is present at the input.
Actually, the situation shown in Fig. 1 0.3 is of little practical
consequence. In a practical system we will never have a sinusoid of
significant amplitude exactly at the Nyquist frequency. Our discussion of
filters in Chapter 6 makes it obvious that, if there are to be no components
above the Nyquist, then (due to the finite roll-off rate in physically
realizable filters) the harmonics must already be of negligible amplitude at
the Nyquist frequency. What we must worry about are the components just
below the Nyquist-here we will have harmonics of significant amplitude.
So, what happens to sampled data in this part of the spectrum?
Once again, let's use a short computer program:

10 REM *********************************************
11 REM * NYQU I ST TEST 1 *

12 REM *********************************************
20 PI = 3 . 1 4 1 592653589793# : F 1 = 0 . 9 ' F1 = X NYQU I ST
30 FOR N = 0 TO 20
32 X = N * F 1 *P I ' SOLVE FOR ARGUMENT
40 Y = COS ( X ) , SOLVE FOR COS I NE
48 PR I NT N , : PR I NT US I NG n ## . #####n ; y
50 NEXT ' D O T H I S 2 0 T I MES
60 END
108 Chapter 10

Note: The basic scheme here is to sample a sinusoid at rates near the
Nyquist. but since we are only concerned with the output of the AID
converter we need only generate numerical values of the sine function at
the sampling points.
If F 1 had been set to 1 .0 in line 20 we would simply obtain the
alternating values of + 1 and - 1 [i.e. Cos(Nr), where N integer values =

from 0 to 20] . This would be the Nyquist condition-two samples per


cycle. Since F 1 = 0.9 howevet; the values digitized slip slowly out of
phase ... and then back in again. Figure 1 0.4 illustrates how this happens
graphically, and if we take a pencil and connect every other value, we trace
out the envelopes of two interleaved sinusoids.

- '" �N 1\ "
/
/
/ , f\ f\ f/
" /
,
,

,
, /

I II
I \
/
/ \
,
"

V V \ /
V V
,

Sample Pulse x Signal Sampled Data Points

Figure 1 0.4 - Data Sample Points

This, then, is our near-Nyquist digitized signal-and our first


observation is that the digitized pattern does not look like the analog
signal we had to digitize--there was no modulation on the sinusoid we
digitized! One would think the digitized data should look like the input;
nonetheless, Claude and Harry say this is valid digital data. (?)
It's reasonably obvious why sampled sinusoids entrain sinusoidal
envelopes, but there's more to this than the obvious. You may recall
seeing similar figures (pp. 1 9-20 and p. 1 00). The similarity between Fig.
1 0.4 and the result of multiplying two sinusoids is striking, but we're not
multiplying sinusoids here-we're sampling data. We may visualize
sampling as the mathematical product of the input signal and a series of
impulses (each of unit amplitude), it being clear the sampling pulse train,
having a value of zero between impulses, yields only values equal to the
amplitude of the signal at the time of each impulse.
Sampling 1 09

.� �.
r� 1\ !� ./\'

.. .. .: .. ,
v
. oJ
,' .. :. ',
V V

Figure 10.5 - Summation of Two Sinusoids

Sinusoids are pretty simple things when you get to know them
(never met a sinusoid I didn't like); so, when you see a distinctive pattern
(e.g., Figs. 1 0.4 and 1 0.5) you can't help but suspect that, under that flimsy
disguise, it's the same guy (or at least a close relative). 2 Now, if we had
digitized the sum of the two sinusoids shown in Fig. 1 0. 5 we would expect
the result to look like Fig. 1 0.4; but, we only digitized a single sinusoid!
Let's run another experiment.
Instead of setting F 1 to 0.9, let's make it 1 . 1 . This is an illegal
condition according to Claude and Harry-it's 1 0% above the Nyquist
limit-but let's just see what happens when we break this rule. ( We can
make life easier here with a little modification to our computerprogram:)

20 P I = 3 . 1 4 1 59265358979#: F 1 = .9: F2 = 1 . 1 ' F 1 & F 2 = X NYQU I ST


30 FOR N = 0 TO 20
32 X = N * P I : X1 = X * F 1 : X2 = X * F2' SOLVE FOR ARGUMENTS
40 Y1 = COS(X1 ) : Y2 = COS ( X2 ) ' GET COS I NES
48 PR I NT N, : PR I NT USI NG u##. #####u ; Y 1 , Y 2
50 NEXT N

Table 1 0. 1 (next page) shows the output of this routine, comparing


the two digitized sinusoids (one 1 0% below Nyquist and the other 1 0%
above). The two printouts are virtually identical-there appears to be no
difference between the digitized outputs of a sinusoid 1 0% above Nyquist
and one 1 0% below. Furthermore, if you play with this routine just a little
you will find that any two pairs of signals spaced equally above and below
the Nyquist give identical digitized data.
2
Fig. 1 0.5 is a great picture-it's worth at least five or six hundred words (on
a scale of zero to a thousand words/picture), showing explicitly why the sum of two
sinusoids generate the same sinusoidal envelope as two multiplied sinusoids.
1 10 Chapter 10

N F1 = 0.9 F1 = 1.1

o 1 . 00000 1 . 00000
1 - 0 . 95 1 06 - 0 . 95 1 06
2 0 . 80902 0 . 80902
3 - 0 . 58778 - 0 . 58778
4 0 . 30902 0 . 30902
5 - 0 . 00000 0 . 00000
6 - 0 . 30902 - 0 . 30902
7 0 . 58778 0 . 58779
8 - 0 . 80902 - 0 . 80902
9 0 . 95 1 06 0 . 95 1 06
10 - 1 . 00000 - 1 . 00000
11 0 . 95 1 06 0 . 95 1 06
12 - 0 . 80902 - 0 . 80902
13 0 . 58779 0 . 58778
14 - 0 . 30902 - 0 . 30902
15 0 . 00000 0 . 00000
16 0 . 30902 0 . 30902
17 - 0 . 58778 - 0 . 58779
18 0 . 80902 0 . 80902
19 - 0 . 95 1 06 - 0 . 95 1 06
20 1 . 00000 1 . 00000

Table 1 0. 1 - Comparison of 1 0% Above Nyquist with 1 0% Below

We see a little more of Claude's problem here. If sinusoids


spaced equally above and below the Nyquist give identical digitized results,
there's no way to distinguish between them latet If we violate the Nyquist
criterion then, and allow frequencies both above and below the Nyquist, the
digitized resultant will be a hopelessly confused summation of the two.l
We can avoid this morass by band-limiting the signal (the one to be
digitized) to frequencies below the Nyquist (i.e., below 1 12 the sampling
rate), but we will still have the beat frequency modulation phenomenon for
frequencies near the Nyquist.

10.2 NECESSITY AND SUFFICIENCY

Our question is why conventional theory says a sampling rate of


twice the highest signal frequency is necessary and sufficient. We have
just seen that if the sampling rate is not twice the highest frequency
aliasing will OCCUt This makes the Nyquist criterion a little more
significant than our two alternations per cycle observation-but the second
part of the question concerns whether a 2: 1 ratio is sufficient to provide
distortion free digitization (and reproduction) of the data. If you play with

3
Summing sinusoids from above the Nyquist into the digitized data is tenned
aliasing, and obviously compromises the sampled data.
Sampling 111

the digitization routine given above (i.e., Nyquist Test 1 ), you will find that
sampling ratios of less than about 8: I frequently give poor replicas of the
input sinusoids, and we must wonder if this sort of thing is acceptable.
Worse yet, the presence of a beat frequency modulation envelope hints
there may be sinusoids in the digitized data that were not in the original
signal-that this modulation is really intermodulation distortion.... So, is
Shannon's 2: 1 ratio really sufficient?

10.3 SAMPLING PULSE TRAIN MODULATION

Again we return to the topic of modulation. As we well know,


when we multiply sinusoids, the original sinusoids disappear and two new
side-band sinusoids are produced (see Ch. 3). Furthermore, the frequencies
of the sidebands are equal to the sum and difference of the frequencies that
were multiplied together [We 're beginning to see that modulation
(frequency domain convolution) is a profound phenomenon-one that s
critical to understanding the world around us.}
Now, we 're not modulating sinusoids when we digitize a signal­
we're modulating sample pulses (see Figure 1 0.2 and 1 0.4), and we need
to look at these sampling pulses in terms of Fourier analysis . . . .

10.4.1 SAMPLING PULSES

First of all, we have sort of created this sampling pulse! In fact,


this sample pulse has no physical existence. Its conceptual existence comes
about when we back-through the AID conversion process, for in the
process of digitizing a signal we create perfect numbers which have no
extension in time or space. The digitized data points are mathematical
points that would be created ifwe multiplied the analog signal by a train
of impulses (of unit amplitude and infinitesimal width). [The mechanics
ofAID conversion are just technicalities asfar as this line of reasoning is
concerned.l So, we have deliberately created a fictitious sampling pulse,
which is the mathematical equivalent of what would have created our
sampled data, and we are now going to investigate its frequency spectrum.

4
lbe data extends in time and/or space, and the conversion process must
include this extension to some extent, but the numbers know nothing of this. We may use
them in mathematical developments that assume they are extended in time, but the
numbers know of that either'
112 Chapter 10

10.4.2 IMPULSE SPECTRUM

As you recall, when we illustrate the fundamental scheme of the


Fourier series (by summing odd numbered harmonics with amplitudes
inversely proportional to their harmonic numbers), our efforts are rewarded
by the gradual, almost magical appearance of a beautifully simple
function-a square wave. Now, if we sum the simplest series of sinusoids
possible-a series of cosine waves with no variation in amplitude-no
leaving out odd or even harmonics-just a simple summation of cosine
waves-we get a single data point (i.e., an impulse)followed by aflat line
ofperfectly zero amplitude.
So, the question that comes to mind is, how does the summation
of our simple, smooth, continuous, sinusoids create the most discontinuous
wave shape imaginable? This is another of those fundamental phenomena
that will tum out to be more important than you might think; so, let's use
another computer routine to investigate what happens here:

**************************************************
* APPL I CAT I ONS 1 0 . 2 - I MPULSE FUNCT I ON TEST *
**************************************************
12 I NPUT "NUMBER OF TERMS AS 2AN " ; N ' NUMBER OF S I NUSO I D S TO SUM
20 Q = 2 A ( N+4 ) ' MUL T I PLES OF 16 FREQUENCY COMPONENTS
22 P I = 3 . 1 4 1 59265358# ' NO I DEA BUT CAN ' T STOP NOW • • •
30 FOR I = 0 TO 2 * P I STEP P I I 8 ' COMPUTE EACH DATA PO I NT
32 Y = 0 ' I N I T I AL I ZE ACCUMULATOR
40 FOR J = 0 TO Q - 1 : Y = Y + COS ( I * J ) : NEXT ' SUM ALL HARMON I CS
50 PR I N T US I NG "#### . #####" ; Y ' PR I N T DATA PO I NT
60 NEXT I ' DO NEXT DATA PO I NT
62 I NPUT A$' WA I T HERE , TRUSTY 286 • • •

When you run this routine you will notice that the single point at the origin
has a value equal to the number of sinusoids summed (Table 1 0.2). The
reason is fairly obvious-the value of a cosine is 1 .0 when the argument
is zero. If we sum Q cosine waves, which all start with an argument of
zero (regardless of their frequency), they will all have an initial value of
1 .0; therefore, the initial data point must have a value of Q. Table 1 0.2
shows the value of each of the harmonic components (i.e., FOO, FO 1, etc.)
at the data sample times (TOO, TO 1, etc.). [It took a lot of time to create
this picture so I would appreciate it if you perused it carefully. ]
So, the first data point is 1 6.000, but how did all the other data
points get to be exactly zero? Let's step through the operation of this
routine and see what really happens. In line 40 we accumulate Cos(l*J) for
Sampling 1 13

TOO T01 T02 T03 T04 T05 T06 T07 T08

FOO + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 00


F01 + 1 . 000 +0 . 924 +0 . 707 +0 . 383 · 0 . 000 - 0 . 383 - 0 . 707 - 0 . 924 - 1 . 00
F02 +1 . 000 +0 . 707 - 0 . 000 - 0 . 707 - 1 . 000 · 0 . 707 +0 . 000 +0 . 707 + 1 . 00
F03 +1 . 000 +0 . 383 - 0 . 707 - 0 . 924 + 0 . 000 +0 . 924 +0 . 707 - 0 . 383 - 1 . 00
F04 +1 . 000 - 0 . 000 - 1 . 000 +0 . 000 + 1 . 000 · 0 . 000 - 1 . 000 +0 . 000 + 1 . 00
F05 +1 . 000 - 0 . 383 - 0 . 707 +0 . 924 · 0 . 000 - 0 . 924 +0 . 707 +0 . 383 - 1 . 00
F06 +1 . 000 - 0 . 707 +0 . 000 +0 . 707 - 1 . 000 +0 . 707 - 0 . 000 - 0 . 707 + 1 . 00
FO? +1 . 000 - 0 . 924 +0. 707 - 0 . 383 +0 . 000 +0 . 383 - 0 . 707 + 0 . 924 - 1 . 00
F08 +1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 +1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 00
F09 +1 . 000 - 0 . 924 +0 . 707 - 0 . 383 - 0 . 000 +0 . 383 - 0 . 707 +0 . 924 - 1 . 00
F10 +1 . 000 - 0 . 707 - 0 . 000 +0 . 707 - 1 . 000 +0 . 707 +0 . 000 - 0 . 707 + 1 . 00
F11 + 1 . 000 - 0 . 383 - 0 . 707 +0 . 924 - 0 . 000 - 0 . 924 +0 . 707 + 0 . 383 - 1 . 00
F12 +1 . 000 +0 . 000 - 1 . 000 - 0 . 000 + 1 . 000 +0 . 000 - 1 . 000 - 0 . 000 + 1 . 00
F13 +1 . 000 +0 . 383 - 0 . 707 - 0 . 924 - 0 . 000 +0 . 924 +0 . 707 - 0 . 383 - 1 . 00
F14 +1 . 000 +0 . 707 +0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 - 0 . 000 +0 . 707 + 1 . 00
F15 +1 . 000 +0 . 924 +0 . 707 +0 . 383 +0 . 000 - 0 . 383 - 0 . 707 - 0 . 924 - 1 . 00
1 6 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 00

TABLE 1 0.2 - Summation of Equal Amplitude Sinusoids

all Q hannonics. When 1 = 0 (i.e., the initial data point) Cos(l*J) will be
l .0 regardless of the value of J (J = hannonic number). The next data
point, howeveI; gives I a value of riS. Now, as J steps through each of the
1 6 hannonics, I *J steps through 2r radians, and Cos(I*J) will give a
sinusoidal pattern of values-the summation of which is zero (see column
T01). At the next data point the value of I will be 2rlS and we will only
have to step through S hannonic numbers to get a null summation (which
we will do twice). Table l O.2 shows the summation of 16 hannonics ( FOO
through F 1 5 ) for the first S data points ( TOO through T08) . This is simple
but important-these summations simply must come out to zero. [You
recognize, of course, that we 're playing with loaded dice again; but, this
is the very configuration we use in the DFT and FFT. Now, while we are
playing with loaded dice in the above illustration, it's important to
understand that this phenomenon (i.e., a large number of sinusoids
summing to zero under ,(onditions of symmetry) occurs naturally (i.e., even
when the dice are not loaded). ]
For now, we should note that these sinusoids will fail to yield a
zero summation whenever ! = 1 6rN/S [where N, is any integer (including
zero obviously)]. At these points Cos(I*J) = 1 .0 regardless of the integer
value of J (as we said J represents hannonic numbers, or frequency);
howeveI; the domain of our consideration extends only from I 0 to one =

data point less than 1 2 *PI. Note: The cosine waves we have been
=
1 14 Chapter 1 0

discussing here. all of equal amplitude and constant phase. represent the
transfonn ofthe impulsefunction. ofcourse. Ifwe take the transform ofan
impulse we will obtain a perfectlyflat spectrum of cosine waves
So, the impulse function has an amplitude equal to Q (where Q is
the number of hannonics in the frequency domain function), but if we
divide each hannonic by Q, they will all sum up to unity, and this function
will fulfill our requirements for a single sample pulse.

10.4.3 FREQUENCY DOMAIN STRETCHING

But this is a single impulse-to model the sampling process we


need a "train" of sampling pulses. We can get to the sampling pulse train
in various ways, but let's use the frequency domain stretching theorem
here.5 So, if we take an impulse function spectrum (of equal amplitude
hannonics-Table 1 0.2) and stretch it out by placing zeros between each
of the hannonic components, we get an interesting result on reconstruction
of the time based wavefonn. If we place zeros between all the hannonics
(equivalent to multiplying all the frequencies by two) we will have only
even numbered hannonics (with all the odd hannonics equal to zero). 6 You

TOO T01 T02 T03 T04 TOS T06 T07 T08

FOO + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 00


F01 +0 . 000 +0 . 000 +0 . 000 +0 . 000 - 0 . 000 - 0 . 000 - 0 . 000 - 0 . 000 - 0 . 00
F02 + 1 . 000 +0 . 707 - 0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 +0 . 000 +0 . 707 + 1 . 00
F03 +0 . 000 +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 +0 . 000 +0 . 000 - 0 . 000 - 0 . 00
F04 +1 . 000 - 0 . 000 - 1 . 000 + 0 . 000 + 1 . 000 - 0 . 000 - 1 . 000 +0 . 000 + 1 . 00
FOS +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 +0 . 000 - 0 . 00
F06 + 1 . 000 - 0 . 707 +0 . 000 +0 . 707 - 1 . 000 +0 . 707 - 0 . 000 - 0 . 707 + 1 . 00
F07 +0 . 000 - 0 . 000 +0 . 000 - 0 . 000 +0 . 000 +0 . 000 - 0 . 000 +0 . 000 - 0 . 00
F08 + 1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 00
F09 +0 . 000 - 0 . 000 +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 - 0 . 000 +0 . 000 - 0 . 00
F10 + 1 . 000 - 0 . 707 - 0 . 000 +0 . 707 - 1 . 000 +0 . 707 +0 . 000 - 0 . 707 + 1 . 00
F11 +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 - 0 . 000 - 0 . 000 +0 . 000 +0 . 000 - 0 . 00
F12 + 1 . 000 +0 . 000 - 1 . 000 - 0 . 000 + 1 . 000 +0 . 000 - 1 . 000 - 0 • 000 + 1 . 00
F13 +0 . 000 +0 . 000 - 0 . 000 - 0 . 000 - 0 . 000 +0 . 000 +0 . 000 - 0 . 000 - 0 . 00
F14 + 1 . 000 +0 . 707 +0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 - 0 . 000 +0 . 707 + 1 . 00
F1S +0 . 000 +0 . 000 +0 . 000 +0 . 000 +0 . 000 - 0 . 000 - 0 . 000 - 0 . 000 - 0 . 00
8 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 8 . 00

TABLE 10.3 - Summation of Equal Amplitude Sinusoids


5
The frequency domain stretching theorem will play an important role in
Chapter 12 when we change the playback rate of recorded audio.
�ote that FOI in the F02 position doesn't generate the same values it
produced in the FO I position.
Sampling 115

recognize this is the only way we can stretch the spectrum with our DFT
loaded dice scheme. This result is illustrated in Table 1 0.3, where you will
note that a minor miracle takes place-we get a second pulse in the T08
column (which, we recognize, would be halfway through the time domain
data array). This is the frequency domain equivalent of the time-based
stretching we used when we developed the FFT algorithm in Understand­
ing the FF1). [Note: A superior intellect would see this phenomenon
must happen for any function if we stretch its spectrum, but for you guys
we will extend this exposition in the next chapteI; making it obvious why
the time domain function repeats itself when the spectrum is stretehed.]
You may have noticed that Table 1 0.3 and Table 1 0.2 are actually
pictures. They're not the beautiful panoramas of an Ansel Adams, of
course . . . the beauty of these pictures lies in the details . . . and meaning.
They're pictures of sinusoids (of different frequency going down the page)
taken at succeeding points in time (going across the page}-they are
pictures of the Fourier transform! Table 1 0.3 is, in fact, just an expanded
frequency representation of 1 0.2. Our sampling times are unchanged
between these two pictures, so, in 1 0.3 we get only half as many sample
points in a cycle at each frequency. If we generate additional data points
between the ones shown in 1 0.3, howeveI; it becomes identical to 1 0.2
(ignoring scaling). [Note: It's worth repeating that all of the harmonics
of the waveform have doubled in frequency. If we turn a basso profundo
into a chipmunk by playing the record fasteI; all the harmonics of that
great voice must be scaledproportionally. Ifwe play the recordfaster. the
time domain is compressed and the frequency domain is expanded!]
Okay, take a sip of coffee here because we're about to reveal a
profound truth! In Table 1 0.3 we have stretched the frequency domain
function and so the time domain is compressed-the impulses are closer
togetheI: But pulses spaced on shorter time intervals are higherfrequency
Compression in time is expansion in frequency This most profound of
theorems is only profound if we don t think about what we 're doing.
So, stretching the spectrum (i.e., only summing even frequency
cosines) causes the time domain function to repeat itself (within the same
time interval). Ifwe stretch this spectrum again (i.e., we only sum in every
fourth harmonic), we will getfour impulse points. Stretching the spectrum
to every eighth harmonic yields eight impulses, and this begins to look
very much like a train of sampling pulses. In every case, howeveI; the
116 Chapter 10

relative relationship between the harmonics and impulse rate remains the
same! As more pulses occur in a given time, the harmonic frequencies
increase-the spectrum of this pulse train (made up of identical cosine
waves whose frequencies are integer multiples ofthe fundamental sampling
rate) must obviously "stretch."

1 0.5 SAMPLING PULSE MODULATION (RETURN JUMP)

Okay, sampling is equivalent to multiplying the signal by a string


of unit amplitude sample pulses. Now, as we discussed in the previous
chapteI; if we multiply a signal by a constant (for example), we multiply
all of the harmonic components by that constant:

K,f(t) = K,[A,,+A,Cos(t)+B,Sin(t) + A2Cos(2t)+B2Sin(2t) + .... J ( l OA)


= K,A" + K,A,Cos(t)+K,B,Sin(t) + K,A2Cos(2t)+K,B2Sin(2t) + .... ( I OAA)

where: K, = constant
f(t) = time domain function

This is fairly obvious-the relative amplitudes of the components remain


unchanged-they have all been scaled up. Suppose now that instead of
multiplying our function f(t) by a constant, we multiply it by another
function g(t). Obviously we now multiply every harmonic off(t) by g(t):

g(t)f(t) = g(t)[A,,+A, Cos(t)+B,Sin(t) + A2Cos(2t)+B2Sin(2t) + ... . ] ( 1 0 .5 )

= g(t) A" +g(t)[A.Cos(t)+B ,Sin(t)] +g(t)[A2Cos(2t)+B2Sin(2t)]+. .. ( 1 0.5A)

Take one of the harmonic components fromf(t)-the A,Cos(t) term from


Eqn. ( l O.5A) for example. We know, of course, that g(t) is a function in
its own right, and is composed of harmonics:

g(t) = Uo+U, Cos(t)+V,Sin(t) + U2Cos(2t)+V2Sin(2t) + .... ( 1 0.6)

So, when we multiply A,Cos(t) by g(t}-g(t)A,Cos(t}-we multiply it by


every harmonic component within g(t):

g(t)A.Cos(t) = UoA.Cos(t)+U,Cos(t)A,Cos(t)+V,Sin(t)A,Cos(t)+
U2Cos(2t)A,Cos(t)+V2Sin(2t)A,Cos(t) + .... ( 1 0.6A)

And, as we know, this replaces the harmonic component of f(t) with side
band components [i.e., a replica of the spectrum ofg(t) appears about each
and every component off(t)]. This is all pretty obvious, but it's important;
so, let's return to our FFT program to illustrate our point.
Sampling 117

10.6 DATA SAMPLING (RETURN JUMP)

We're going to do something unusual here-we're going to look


at something that's normally invisible to users of the DFT and FFT­
we're going to look at what happens beyond the spectrum that's usually
displayed. In Section 1 0.4.3 we saw how a train of impulses (a sampling
pulse train) was composed of a spectrum of equal amplitude cosine waves
at all integer multiple frequencies of the sampling rate. This spectrum (of
the sampling pulses) is normally invisible when we work with sampled
data, but in Fig. 1 0. 1 0, we show the spectrum of a string of impulses. We
see that the spectrum is a series of equally-spaced sinusoids (the spacing
between sinusoids being equal to the frequency ofthe sampling rate, as we
just explained for frequency domain stretching) .

• • • • • • • •

Sampling Harmonics of Sampling Pulse Train


Fundamental

Figure 1 0. 1 0 - Sampling Pulse Train Spectrum

Okay, if we now use our train of impulses to sample a band­


limited triangle wave-the same function we've used extensively before­
a triangle wave with the number of harmonics determined by the Nyquist
sampling rate (i.e., highest harmonic 1 /2 the sampling rate}-and then
transform this modulated pulse train ... we obtain Fig. 1 0. 1 1 (next page).
Note that, in the frequency domain displayed, sidebands appearon
each and every one of the sampling pulse train's harmonics. This, of
course, is the result we described above [Eqns. ( lO.5A) and ( 1O.6A)]. In
Eqn. ( 1 O.5A) /(t) would represent the sampling pulse train and g(t) the
modulating wave (a triangle wave in our example). We see exactly what
1 18 Chapter 10

has happened here: each of the harmonics of g(t) must multiply each and
every harmonic of f(t). We produce a set of sidebands about each of the
sampling pulse train harmonics. We see clearly how sampled data (i.e.,
modulated sample pulses) relates to modulated sinusoids and, more
importantly, how this relates to the sinusoids spaced equally above and
below the Nyquist frequency.

Sampling Harmonics of Sampling Pulse Train


Fundamental (no longer pbysically present)

1 { r/) )' -" •

Harmonics of
Modulating Waveform
Modulation
Sidebands

• • • • • • • • • •

• • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • •

Figure 1 0. 1 1 - Modulated Pulse Train Spectrum

Again, when we perform a normal DFTIFFT we only consider the


portion of Fig. 1 0. 1 1 which extends from zero up to the fundamental ofthe
sampling rate-as Fig. 1 0. 1 displays. It's now apparent why the negative
frequencies are above the positive frequencies in a normal DFT-they are
the negative frequency sidebands extending downward from the sampling
rate fundamental. The positive frequencies are the result of the zero
frequency component of the sampling pulse spectrum. We might easily
imagine there is another set of negative frequencies below the zero
frequency shown in Fig. 1 0. 1 1 .

1 0.7 SUFFICIENCY OF NYQUIST'S CRITERION

Finally, we come back to our original question. Let's suppose we


have some utility audio application with a bandwidth of, say, 3200 Hertz.
Claude and Harry say a sampling rate of 6400 samples/sec. will get the job
done. Suppose then, at some point in time, we have an input signal which
Sampling 119

is a single sinusoid at 3 1 99 Hz. From what we have just seen, the digitized
signal will look something like Fig. 1 0.4. That is, the negative frequency
component, extending downward from the fundamental of the sampling
impulse functionf(t}, will only be 2 Hz away from the single sinusoid of
our 3 1 99 Hz signal. Our digitized signal will be (for all practical purposes)
a summation of two sinusoids. One at a frequency of 3 1 99 Hz (i.e., the
original input signal) and another at 3201 Hz. We can hear both of these,
of course, and it will sound awful (like hitting c and c# on a piano-only
worse)! I f we can filter off the 3201 Hz component, however; everything
will then be as it should-the beatfrequencymodulation will disappear and
we will only hear the single high-pitched tone-but that's not very
realistic. Go back to the filter curves ofp. 60 and estimate the amount of
attenuation provided by the best of those curves when cutoff is exactly at
the Nyquist frequency.
The point is this: Shannon says the lower limit for the sampling
rate is twice the highest signal frequency. From what we have seen, ifwe
can filter off the negative frequencies above the Nyquist when we
reconstruct the signal, then Shannon's criterion is sufficient. Speaking
realistically, we must always leave a little room for ovemead in our system
design. Only ifwe can filter off the sidebands extending downward from
the first harmonic of the sampling pulse train can we faithfully reproduce
the original digitized signal.
Clearly, Shannon's criterion is a theoretical limit, and we will
seldom obtain that limit. We will look at the practical application of this
in detail in the next chapter

10.8 NYQUIST 2:1 vs. 1 : 1 SAMPLING

Suppose, instead of sampling the signal with a continuous stream


of positive impulses, we sample .......
with a string of alternately positive
and negative sampling pulses (see
Fi g. 1 0 . 1 2). If we do thi s the h-�....1..4t-r-.l...r�..,..-l-�...J..L.�
sample pulse train will have two
alternations per cycle, and the
frequency of the sample rate will Signal Sampled Data
Points
equal the highest frequency in the
Fig. 1 0. 1 2 - 1 : 1 Sampling Rate
signal being digitized-there will be
120 Chapter 10

only one Nyquist frequency. If every alternation of the pulse train is


inverted, a cosine wave at the Nyquist will yield a constant amplitude of
sampled data points; however; DC signal components (i.e., a constant
signal) will yield alternately positive and negative data points (at the
Nyquist rate). This is the opposite of what we normally expect from the
digitized data; however; it shows clearly what really happens when we
digitize a signal. Compare Fig. 1 0. 1 3 to Fig. 1 O. 1-the negative
frequencies now extend downward from the one-and-only Nyquist
frequency, and the positive frequencies extend upward.

• •

Negative Positive
Frequencies Frequencies
• •

• •

• •
• •
. .
... - - ...

t
Nyquist Frequency
Fig. 1 0. 1 3 - 1 : 1 Sampling Spectrum

We note the low frequencies of the sampled signal now appear


near the Nyquist frequency while the high frequencies of the sampled
signal appear near zero and 2fN'
So, in this configuration, the two Nyquist frequencies really are
the same thing. There's no magic here. There's no loss of information,
but neither is there a gain. Still, as with most things we digress upon, we
may find a use for this "acorn" later
CHAPTER 11

DIGITAL HIGH FIDELITY AUDIO


PART I - FREQUENCY RELATED PROBLEMS

In 1 877 (only 17 years before the birth of my father) Thomas


Edison announced his phonograph. In 1 883 Edison noticed that a current
would flow (between an incandescent filament and an unheated electrode)
through a vacuum. Sir John Fleming used this same effect to build an
electronic valve (i.e., a vacuum tube diode to restrict current flow to one
direction only). In 1 906 Lee De Forest placed a grid between the heated
cathode and the anode, thereby allowing a "weak" voltage to control a
"strong" current (i.e., to amplify a signal). Early amplifiers were not very
good, prompting research into lower distortion and higherfidelity.
The idea of "Hi-Fi" music became popular in the 1 940s and ' 50s
(as I recall), but concern for fidelity was already prominent in the '30s.
One pictures a progression of technological improvements yielding ever
better sound . . .but this may not be accurate. I recall, in the late ' 50s,
listening to a particular female vocalist (33Y3 rpm stereo vinyl) when I
suddenly realized how real the sound was. Now, you could always hear
the "grooves" of a vinyl recording (in the silence), as well as occasional
little "tics," but with a good recording, and a good system, these were
separate from the music (like someone next to you turning pages at a live
performance). If, howeveI; the music itself is distorted, we immediately
perceive it's not the real thing... and there are those who claim the music
recorded on CDs falls into this category. Indeed, there are groups who
insist the old vacuum tube amplifiers are better. . . and refuse to buy
CDs...and go to extremes to protect their old vinyl collections.
So, are CDs better?

11.1 FREQUENCY RESPONSE

What frequency response


do we need for true high fidelity?
Feeling
We are told the human ear can hear
Hearing
from about 20 Hz to about 20,000
Hz; howeveI; when a train rumbles �----�---
by just outside your motel window, 2 Hz 20 Hz 200 Hz 2000 Hz 20 kHz
much of what you experience is Figure 1 1 . 1 - Frequency Response
1 22 Chapter 11

feeling. This effect i s present when a symphony orchestra plays the 1 8 1 2


Overture (especially when they use real cannons). At the other end o f the
spectrum we can hear frequencies above 20,000 Hz; but these sensations
too are more like feeling than hearing. So, how important are these
extreme frequencies? How "Hi" do you want your Hi-Fi?1
When a musical instrument plays a note, it creates a harmonically
rich tone. As the instrument plays up and down the scale the relationships
of the harmonics change-a trumpet in the high register sounds different
from a trumpet in the middle or low register-trumpet players create
distinctive tones that are as recognizable as individual voices-even
different pianos have different "voices." If we want our sound system to
faithfully reproduce the real instruments, we must surely reproduce the
major portion of the audible spectrum . . . but it's virtually impossible to find
a compromise specification that will please everyone. If, however, we
faithfully reproduce the complete spectrum, no one can complain. . . and we
can't get it wrong. Regardless of all the opinions about acceptable
compromise, this must be the ultimate aim of Hi-Fidelity sound.
Still, playing time ( for example) is inversely proportional to
bandwidth, and many systems with a frequency response of only 1 00 to
1 2,000 Hz sound pretty good; so, what do we really need? Well, the
middle A on a piano keyboard is tuned to 440 Hz (this is concert A). An
octave is a 2: 1 frequency ratio so the next A going up will be 880 Hz, and
the next 1 760 Hz, etc. Now, if each A is 2: 1 in frequency, then each B
must also be 2: 1 , etc. There are 1 2 tones between octaves (i.e., including
sharps andflats there are 12 keys from A to A ), so a little thought reveals
that, for an equal-tempered scale, each tone must be 1 .059463 . . . : 1 (i.e.,
1 \12 : 1) higher than the previous note. The highest note on a standard
keyboard is C at 4 1 86.0 1 Hz { four octaves up from middle C (i.e., the C
below concert A) which must be tuned to 261 .626 Hz (i.e., 3 half-tones up
from A = 220-A N, B, C) times 24 } . The thinness of this highest C tells us
2
there are few harmonics in this tone-its 5th harmonic is 20,930 Hz.
Now, 20,930 Hz is audible so, if we're trying to guarantee realistic sound,
shouldn't our ultimate system include maybe 20-30% more than 20 kHz?

(
Modem CD players spec the low end at 5 Hz and the high end at 20 kHz.
2
This is very simplified. Actually, the hannonics of a piano wire are not exact
integer multiples of the fundamental, causing problems for piano tuners, but causing much
greater problems for engineers building Piano Tuners Each note must be tuned to a sort
of weighted average of the hannonics in each tone.
Digital Audio 123

On the other end of the keyboard, the lowest note is A (4 octaves


below concert A), at 27.5 Hz. The over-richness of hannonics in this last
half-octave make these keys infrequently used; nonetheless, we surely hear
these frequencies. Again, we might limit the low end to 30 Hz . . . or 25
Hz. . . but our ultimate system will include frequencies below 20 Hz.

11.2 THE PLAYBACK RATE (OVERSAMPLlNG)

D/A Sample Rate = 44.1 kHz Okay, we come (finally) to


the meat of this chaptet; which is to
explore FFT applications. We set
t h e fre q u e n c y r e s p o n s e o f o u r

J Highest Signal Frequency 22.05 kHz


=
hypothetical sound system at 5 to
20,000 Hz. Now, we will need a
l ittle extra bandwi dth ( for fi lter
Fi gure 1 1 .4 Nyquist Frequency rolloff, etc.); so, for storing the data
-

on the CD, we will select a data rate of, say, 44. 1 kHz !-) Now, from Fig.
JJ. 4, this is definitely equal to a Nyquist signal frequency of 22.05 kHz.
We know (Chapter 1 0) there will be
beat-frequency modulation near the
Nyquist, implying unwanted sinusoids
above the Nyquist. Furthermore, from HttHtttttHttHtttltltl1ftttb"'tHtHttH-Itt
what we know about filters, rolling
off the passband between 20 kHz and
22.05 kHz will be difficult.3
The way we handle this is by
Fig . 1 1 .5 - Beat-Frequencies
oversampling. Oversampling refers to the technique of introducing extra


data words into the data stream. For example, we might generate 2: 1 over­
AVerage Valne
�. _ Oversampling
sampling by summing each word with its
successor, dividing by two, and inserting the
. . resultant between the digitized data points

1 ��
"I t · I··· (dotted lines Fig. 1 1 .6). By inserting average
values between data samples, we generate twice
Fig. 1 1 . 6 - Oversampling as many steps per unit time (i.e., the data rate,
or sample rate is doubled to 88.2 kHz).

3
Modem filters do a pretty good job, still, we only have from 20 kHz up to
22.05 kHz to achieve about 1 00-120 db attenuation.
1 24 Chapter 11

Unfortunately, while this pseudo-sampling does double the data


rate, it provides no help with beat­
frequency modulation-Figure 1 1 . 7
shows this type o f oversamp l i n g
applied to Fig. 1 1 .5; so, how do w e I'n"nI'IllNtll+JYlhW'ItN'rMWANI!YnIiNlM
over-sample in a way that helps?4
I f we tran s form the data
shown in Fig. 1 1 . 5 we will get the
spectrum of Fig. 1 1 . 8 (we ' re only Fig. 1 1 .7 Oversampled Data
-

taking the positive frequencies here,


but we know there is a companion negative frequency component just
above the Nyquist). If we now recon­
struct the time domain signal we will
f = 15
get the waveform we started with;
however, bearing in mind that the
frequency domain is (a phasor repre­
Nyquist sentation of) the sinusoids that make

Fi g. 1 1 . 8 _ Transformed Data up the time domain data, it's apparent


we may reconstruct the sinusoids (i.e.,
the time domain signal) at twice the original sampling rate (i.e., calculate
the data points at half the original data intervals) . . . . s If we have obtained
the real harmonic components in the transform, and we haven t done
something wrong again, it shouldn't matter what sample rate we use to re­
create the time domain data. The neatest part of this scheme is that we can
obtain the desired oversampling by simply increasing the size of the
frequency domaIn array (packing the upper locations with zeros). Fig. 1 1 .9
shows the resulting spectrum of the oversampled data (here we've in­
creased the sample rate by a factor of
1 6 : 1 ) . The single harmonic of Fig. f= 15
1 1 . 8 l i e s near the bottom of th is
16 X Oversample
spectrum. Reconstructing the time
domain waveform we get Fig. 1 1 . 1 0,
and the intermodulation distortion is Nyquist
gone (without filtering).
Fi g 1 1 .9 - Oversampled Data
4
We discuss how this is done in commercial CD players at the end of this
chapter, but our first interest is Fourier transfonns.
S
We can reconstruct at 4x or 8x the original data rate too, of course.
Digital Audio 1 25

Program FFT l I . O l is designed to generate this type of over­


sampling, and we will need to experiment with it a little (as will become
apparent shortly). Initially, it appears
! • • • ,
� , , • • •
t � t

we can solve the beat-frequency prob­


lem if we oversample by 1 6 : 1 (actually,
Tbne -
8: 1 does the same thing);6 but, unfortu­
; i i , nately, this illustration is (once again)
16 X Oversampled Sinusoid
(Original @ 15116 Nyquist)
just a little too simple. The problem
here is that, as with spectrum analyzers,
Fi g. 1 1 . 1 0 - Reconstructed Data we must deal with real world signals,
and these are not so well behaved as the signals of Figs. 1 1 .5 & 1 1 . 1 0.

11.3 THE MALEFICENT GIBBS

As we saw in Chapter 9, things get messy when frequencies are


not exact integer multiples of the time domain fundamental, and while
musical sounds are composed of quasi­
integer multiple frequencies, as far as the
Fourier transform is concerned, they're
not integer at all! In Fig. 1 1 . 1 1 we
show the now familiar spectrum of a
. .
.
. . . . . . non-integer multiple harmonic, and Fig.
. . .

Fi g. 1 1 . 1 1 - 4.5 Hz Spectrum 1 1 . 1 2 shows the oversampled spectrum.


Figure 1 1 . 1 3 shows what happens when
we reconstruct this oversampled, non-orthogonal, fractional-frequency
sinusoid . . . =( Oops!
The reconstructed fractional

I
frequency (that has been oversampled) of
Fig. 1 1 . 1 3 is, of course, incompatible
with high fidelity sound-this will never I
work, but why does this fractional fre- � \.. -------------------
.

quency component reconstruct with so Fi g. 1 1 . l 2 1 6 X Oversampling_

much distortion? [We know that, without


oversampling, fractionalfrequencies reconstruct perfectly}.
If you look closely at Figure 1 1 . 1 2 you will see that the spectrum
looks very much like the truncated spectrums we created when we
6We use 16 X here to make a pretty picture. In practical systems this would not
need to be more than 4 X (or maybe 8 X in a "top-of-the-line" system).
126 Chapter 1 1

i\ !\ f\ LJfj f
!\
illustrated Gibbs phenomenon-the upper


1 5/ 1 6 of this spectrum is packed with

V V VVV
--+--i-
I- ---<I--+- - -
---\---;f--+--I---;� zeros . If we had actually sampled a 4.5
Hz signal at the oversampled rate the
spectrum wouldn't simply truncate at
Fi g. i 1 . 1 3 _ 4.5 Hz Oversampied 1 / 1 6 of the available frequency space.
Apparently the distortion we see in Fig.
1 1 . 1 3 is a close relative of Gibbs ! Now, we have seen how we can
alleviate this problem in previous chapters, and we will investigate that
p o s s i b i l ity s hortl y ; however, we w i l l never b e very good at FFT
applications unless we understand it's internal workings. We have a
golden opportunity to look inside the Fourier transform here, so let's listen
to ole' Yogi and take this "fork in the road."

11.4.1 ABOUT THE DFT

When we oversample as we have just done, we are creating data


points between the original digitized data points, based only on the
spectrum obtained from those original data points! This seemed like a
good approach initially but now we have encountered problems, and we
need to look a little closer at the underlying mechanisms.
When we studied impulse functions in Chapter 10 (pfJ. 1 12) we
found that equal amplitude harmonic components summed to an impulse
at the initial data point, but cancelled to zero at all following data points.
If you review Table 1 0.2 (p. 1 1 3), it's obvious that, at points between the
data points shown, these sinusoids will probably not cancel to zero! Table
10.2 can tell us much about what's going on here, but first let's explore
this mechanism by considering a couple of theorems.

11 .4.2 THE SHIFTING THEOREM

When we first discover the theorems of Fourier analysis they seem


like magic; but, in truth, they expose simple relationships between the time
and frequency domains. For example, time domain shifting (we used this
in developing the FFT algorithm). This theorem says: if we shift a time
domainfunction (in time), itsfrequencydomainfunction will experience a
linear shift in phase proportional to the harmonic number.
Let's use the impulse function to examine the mechanics of this
Digital Audio 1 27

relationship. The reason we obtain an impulse at the beginrnng of the time


domain (Table 1 0 . 2) is that all the cosines have an argument of zero there.
All other data points are zero because the harmonics shift incrementally
over 2N7I' radians (because of their different frequencies). That is, going
down any column of frequencies, the cosine functions are shifted by equal
increments over a number offull cycles. Now consider the table below:

TOO T01 T02 T03 T04 T05 T06 T07 T08

FOO + 1 . 000 + 1 . 00 +1 . 000 +1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 00


F01 +0 . 924 +1 . 00 +0 . 924 +0 . 707 +0 . 383 - 0 . 000 - 0 . 383 - 0 . 707 - 0 . 92
F02 +0. 707 +1 . 00 +0 . 707 - 0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 +0 . 000 +0 . 70
F03 +0. 383 +1 . 00 +0 . 383 - 0 . 707 - 0 . 924 +0 . 000 +0 . 924 +0 . 707 - 0 . 38
F04 +0. 000 +1 . 00 - 0 . 000 - 1 . 000 +0 . 000 + 1 . 000 - 0 . 000 - 1 . 000 +0 . 00
F05 - 0 . 383 + 1 . 00 - 0 . 383 - 0 . 707 +0 . 924 - 0 . 000 - 0 . 924 +0 . 707 +0 . 38
F06 - 0 . 707 +1 . 00 - 0 . 707 +0 . 000 +0 . 707 - 1 . 000 +0 . 707 - 0 . 000 - 0 . 70
F07 - 0 . 924 +1 . 00 - 0 . 924 +0 . 707 - 0 . 383 +0 . 000 +0 . 383 - 0 . 707 +0 . 92
F08 - 1 . 000 +1 . 00 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 000 - 1 . 000 + 1 . 000 - 1 . 00
F09 - 0 . 924 + 1 . 00 - 0 . 924 +0 . 707 - 0 . 383 - 0 . 000 +0 . 383 - 0 . 707 +0 . 92
F10 - 0 . 707 +1 . 00 - 0 . 707 - 0 . 000 +0 . 707 - 1 . 000 +0 . 707 +0 . 000 - 0 . 70
F11 - 0 . 383 +1 . 00 - 0 . 383 - 0 . 707 +0 . 924 - 0 . 000 - 0 . 924 +0 . 707 +0 . 38
F12 +0. 000 +1 . 00 +0 . 000 - 1 . 000 - 0 . 000 + 1 . 000 +0 . 000 - 1 . 000 - 0 . 00
F13 +0.383 + 1 . 00 +0 . 383 - 0 . 707 - 0 . 924 - 0 . 000 +0 . 924 +0 . 707 - 0 . 38
F14 +0. 707 +1 . 00 +0 . 707 +0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 - 0 . 000 +0 . 70
F15 +0 . 924 + 1 . 00 +0 . 924 +0 . 707 +0 . 383 +0 . 000 - 0 . 383 - 0 . 707 - 0 . 92
0 . 000 1 6 . 00 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 00

TABLE 1 1 . 1 - Summation of Phase-Shifted Sinusoids


When we shift the impulse one data location to the nght, the harmonics
must all shift such that their zero arguments align in the second data
position. Going across the rows we read the time- sampled harmonic
components, so the top row (i.e., FOO) is the constant term and the second
row (i.e., FO I ) is the fundamental (again, only the first half of the time
domain is shown). Note carefully that, for the fundamental, the "distance"
between data points represents a phase increment of22.5° (i.e., 360°/1 6 =
22.5°); however; the second harmonic has 45° increments, and the 3rd gets
67.5°, etc. To get the impulse in the second column, we must shift every
harmonic one position to the right, so the following must occur:

1 . The fundamental shifts by a phase of 271'/N where N is the number


of data points in the sample interval (in Table 1 1 . 1 , as we said, the phase
shift is 22.so).
2. The 2nd harmonic shifts by twice that amount (i.e., 45°).
3. The 3rd harmonic shifts by three tlffies as much as the fundamental.
4. Etc., etc.
1 28 Chapter 1 1

(Note that thefirst column is replaced with the data that would naturally
occur at the phase shift given to each sinusoid.)
In general, each harmonic is shifted by 27rF/Q (where F is the
harmonic number and Q is the number of data points). Furthermore, it's
relatively obvious this relationship must hold between any time-shifted
function and its frequency domain counterpart-it's completely general-it
applies to any function.7 It's also bilateral (as are all the theorems). That
is, if we shift a data point in time the harmonics must shift linearly in
phase; and, conversely, the equivalent phase shifts in the frequency domain
must move the data points in time. The linear phase shift phenomenon is
nothing but the result of shifting all of the different frequencies by the
same time increment! No magic here-it's simply what happens.

11 .4.3 THE ADDITION THEOREM

If the sinusoids of an impulse function sum to zero at the second


data point (Table 1 0.2) then, if we add in the spectrum of another impulse
which has been shifted one position to the right (Table 1 1 . 1 above) the
summation of both spectrums at this second data point will simply be
equal to the summation of the components of the 2nd spectrum (the
summation of the 1 st spectrum yielding zero as we know). But then,
when we sum two spectrums, the value of every data point will be equal
to the summation of the values of the sinusoids for both spectrums. In this
specific case, summation of the two spectrums will yield an impulse in the
first and second data positions (but still zero in all others). Note: We have
said a lot in this short paragraph, and it s important; so, ifyou need to go
back and re-read it (especially that second sentence) its okay.
Now, since we know sinusoids of the same frequency can be
added by simply adding their phasors, and we know that the DFT is
nothing but phasors (i.e., the amplitude coefficients for each harmonic's
complex components), then we can accomplish the summation of any two
time domain functions by the summation of their Fourier components.
From Tables 1 0.2 and 1 1 . 1 , which show the explicit relationship of the
frequency domain to the time domain, it should be clear this may be done

7Since any real function may be represented by a unique summation of sinusoids

that are integer multiples of the fundamental, the phase shift between each sampled point
will always be as descnbed above (i.e., 211"FIN). Ifwe time-shift any function the sinusoids
of its frequency domain representation must shift by the rules given above.
Digital Audio 129

for any two frequency domain representations. It should be clear that


summing the OFf coefficients is the same as summing the sinusoids them­
selves-which is the same thing as summing the time domain functions.
This obviously bilateral relationship is the Addition theorem (also
known as the Superposition theorem), and there's certainly no magic
here-only a time/frequency domain relationship.

11.4.4 THE DFT AS IMPULSES

So then, if we sum in the individual spectrums of N sequentially


time-shifted impulse functions, we will certainly get the spectrum of the
sum of N sequentially time- shifted impulses (if you 're finding these
statements more and more difficult it's because I've been advised to make
this stuff sound more like a typical textbook). Consider this : every
function that's composed of discrete data points may be considered to be
the summation of N time-shifted impulses of amplitude � (where � is the
amplitude of data point n). For a single impulse (i.e., a single data point),
the amplitude of each harmonic component is equal to �/Q [where Q is
the number of data points (and harmonics) in the array]. Our point is that
every data point, when considered as a separate impulse, has the "same"
transform (i.e., a flat spectrum of amplitude A,IQ), except that each
harmonic is shifted in phase to get the impulse into the right position.
Now, summing time domain signals is equivalent to summing
their transforms, and since any digitized signal is nothing but a summation
of time-displaced impulses, it's apparent that any signal we can digitize
must always have a real, unique, frequency domain transform. It's simply
the summation of all the transforms of the individual data points! That is,
a spectrum of equal amplitude cosine waves unquestionably produces an
impulse; and shifting the phases of an impulse spectrum will shift the
impulse in time-and if we add sequentially shifted impulses we can
reproduce any digitized data . . .and, if all this is true, then every digitized
function obviously has a transform !8
There 's a specific reason we've gone to this trouble, and it hinges
on the ultimate nature of this impulse function we have been considering
here; so, without further ado, let's now consider an oversampled impulse
function.
S
It's apparent, then, that if stretching the spectrum of an impulse function
duplicates the impulse, stretching the spectrum of any function will duplicate that function.
130 Chapter 1 1

11.4.5 THE IMPULSE/SINC FUNCTION RELATIONSHIP

In FFT l l . 01 we've provided


an impulse function generator. The
impulse function, of course, yields a Impulse Function
flat spectrum of unit amplitude cosines Transfonn

(Fig. 1 1 . 1 5 ). If we oversample this fNYQ


spectrum we get the result pictured in
Fig. 1 1 . 1 5 - Impulse Xfonn
F i g 1 1 . 1 6 . Reconstruct the time
domain and, voila-you have a sinc function (see Figure 1 1 . 1 7). [Note:
The DFTIFFT thinks all data is periodic, whether it is or not, and we 're
seeing the beginning of the next im­
pulse which is the part of the impulse
16 X that occurred prior to the beginning of
Oversampled
our data sample.]
Thi s i s remi n i scent of the
result obtained when we oversampled
Fig. 1 1 . 1 6 - 1 6 X Oversampled
a fractional frequency; so, let's take a
closer look at why we get a sinc function instead of an impulse when we
oversample. Let's return to that impulse function table-the one we've
been using to investigate the internal
mechanics of the DFT-and look at
16 X Oversampled
what happens when we generate data
Impulse
points between the original digitized
points . We need only look at the
leading edge (see Table 1 1 .2), and we
=j
will consider points that are generated
Fig. 1 1 . 1 7 - Reconstruction
by 8 x over-sampling. Note that the
zero time and zero frequency still yield values of 1 .00, but now only the
4th and 8th data points sum to 0.00. A careful perusal of this table will tell
you why a sinc function appears at the oversampled data points. [We will
accept that this is, in fact, a sinc function (i.e., sin(x)/x-this is derived in
the text books).]
So, when we oversample a signal, we 're doing something very
similar to when we whack-offthe upper end of the spectrum and create the
Gibbs phenomenon; however; we're doing more than just that. We are
(literally) looking between the data points-at the continuous function we
called previously " an incomplete summation of sinusoids." This is similar
Digital Audio 131

to where, in Chapter 1 0 (with fractional-frequencies), we looked between


the pickets in the frequency domain, but with oversampling we're looking
between the pickets in the time domain.9

TOO T01 T02 T03 T04 T05 T06 T07 T08

FOO + 1 . 000 + 1 . 00 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 000 + 1 . 00


F01 + 1 . 000 +0 . 99 +0 . 981 +0 . 957 + 0 . 924 +0 . 882 +0 . 832 +o . m +0 . 70
F02 + 1 . 000 +0 . 98 +0 . 924 +0 . 832 +0 . 707 + 0 . 556 +0 . 383 +0 . 1 95 +0 . 00
F03 + 1 . 000 +0 . 96 +0 . 832 +0 . 634 + 0 . 383 + 0 . 098 - 0 . 1 95 - 0 . 471 - 0 . 70
F04 + 1 . 000 +0 . 92 +0 . 707 + 0 . 383 +0 . 000 - 0 . 383 - 0 . 707 - 0 . 924 - 1 . 00
F05 + 1 . 000 +0 . 88 +0 . 556 +0 . 098 - 0 . 383 -o.m - 0 . 981 - 0 . 956 - 0 . 70
F06 + 1 . 000 +0.83 +0 . 383 - 0 . 1 95 - 0 . 707 - 0 . 981 - 0 . 924 - 0 . 556 - 0 . 00
F07 + 1 . 000 +0 . 77 +0 . 1 95 - 0 . 471 - 0 . 924 - 0 . 957 - 0 . 556 +0 . 098 +0 . 70
F08 + 1 . 000 +0 . 70 - 0 . 000 - 0 . 707 - 1 . 000 - 0 . 707 - 0 . 000 +0 . 707 + 1 . 00
F09 +1 . 000 +0 . 63 - 0 . 195 - 0 . 882 - 0 . 934 - 0 . 290 + 0 . 556 +0 . 995 +0 . 70
F10 +1 . 000 +0 . 56 - 0 . 383 - 0 . 981 - 0 . 707 +0 . 1 95 +0 . 924 + 0 . 83 1 - 0 . 00
F11 + 1 . 000 +0 . 47 - 0 . 556 - 0 . 995 - 0 . 383 + 0 . 634 +0 . 981 +0 . 290 - 0 . 70
F12 + 1 . 000 +0 . 38 - 0 . 707 - 0 . 924 - 0 . 000 +0 . 924 +0 . 707 - 0 . 383 - 1 . 00
F13 + 1 . 000 +0 . 29 - 0 . 832 -o.m + 0 . 383 + 0 . 995 +0 . 1 95 - 0 . 882 - 0 . 70
F14 + 1 . 000 +0 . 1 9 - 0 . 924 - 0 . 556 +0 . 707 +0 . 831 - 0 . 383 - 0 . 981 +0 . 00
F15 + 1 . 000 +0 . 1 0 - 0 . 981 - 0 . 290 +0 . 924 + 0 . 471 - 0 . 83 1 - 0 . 634 +0 . 70
1 6 . 000 1 0 . 68 1 . 000 - 2 . 871 0 . 000 2 . 496 1 . 000 - 0 . 897 0 . 00

TABLE 1 1 .2 Summation of Over-Sampled Impulse


-

Now, in the above illustration, we have deliberately used a single


data point so the sinc function phenomenon will be apparent; but, when there
is more than one data point, each of them will have its own time domain sinc
function. The oscillatory nature of all these sinc functions makes them tend
to cancel-except at edges-at boundaries-similar to the way Gibbs
phenomenon appears at discontinuities. We might, therefore, reasonably
expect the problem to be greatly relieved by using greater array sizes. 10
While we would still expect to see the distortion near the boundaries of the
data array we should see a greatly reduced effect throughout most of the
reconstructed data. This provides us with an avenue to pursue the problem.
9
This similanty between the time and frequency domain sinc functions is very
fundamental. When we deal with a finite number of data points with a finite number of
harmonic components (i.e., the DFf), a sinc function (which, as we know, exists as side­
bands about the harmonic components simply because the data starts and stops) also appears
about time domain data points when their spectrums start and stop. We have noted the
similanty between the forward and inverse transforms-except for the negated sine
component and a multiplied constant, they're identical. We shouldn't be too surprised, then,
if a truncated spectrum produces a sinc function about each data point.
1 0As
the array size increases the number of harmonics increases, and we might
reasonably expect the distortion to shrink toward the edges just as the Gibbs phenomenon
shrinks toward the edges as we add harmonic components.
132 Chapter 1 1

11.5 SOLVING THE OVERSAMPLING PROBLEM

First of all, the advent of the DVD format makes solving this
problem (as we have currently framed it) unnecessary, I I but there are other
reasons for pursuing this technology. For example, when loud-speakers are
driven outside oftheir optimum frequency range the overall sound tends to
be degraded. Speakers are sometimes connected using filter networks to
attenuate frequencies outside the optimum band, but it's difficult to do this
effectively. In our ultimate system we could separate frequencies via the
FFT and drive the speakers with an optimum band of frequencies, but here
oversampling would be unavoidable.
Now, every sinusoid in an audio signal
Save last 512 words - must have some function's sidebands (since the
Load 512 new words for data starts and stops); but, when we transform
1024 data word array
blocks of data we introduce sine function side­
I
Multiply by
bands. When we look between the original
Weighting data points (i.e., we oversample) we will see
Function
these (except when they cancel each other).
One way to minimize this phenomenon, we
PFFFT know, is to use a weighting function before
taking the transform. As we saw with our

20-80 \�"...
80-320 1 280-5120 Hz
Hz
spectrum analyzer, this produces tight little
sidebands... which, hopefully, will not be too
320-1280 Hz distorted if we oversample and reconstruct.
Oversampling
Reconstructor
There is one prob lem-when we use this
technique what we transform is not the same
thing as the original audio [ i . e . , we w i l l
D/A, Filter
& Speaker transform (for example) a cos2 weighted version
Fig. 1 1 . 1 8
of the audio]. But this is no big problem-on
reconstruction we can de-weight the recon­
structed signal (i.e., divide by the weighting function). So, when we
oversample this weighted function spectrum, the effect we encountered
earlier should be greatly reduced. We find, in fact, with weighting and de­
weighting, distortion is attenuated, but not completely eliminated. There
II
DVDs alleviate this problem by storing data at a rate of 96 kHz. Via a
compressed data format they provide two hours of 5 channel, 24 bit words at this 96
kHz-truly high fidelity sound. We will discuss the benefits of using 24 bit words shortly,
but we should see the eminent demise of the CD format in this.
Digital Audio 133

are sti ll vestiges of the problem near the beginning and end of the
reconstructed signal. So, how shall we solve this problem?! !
[If we, say, load 1024 data words into a buffer and oversample as
we described above, on reconstruction we know we will get distortion at
the seams of these buffers. If, however; we have really fast hardware, we
can transform, oversample, reconstruct, and then throw away thefirst and
last quarters of the reconstructed data. 1 2 Only the middle half would go to
the DIA . We would then load the second half of the data to the first half
of the data array, load the next 5 12 data points into the (last half) of the
array, and repeat the process. If the transient distortion has decayed far
enough after 256 data points, we get practically seamless output data.]

11.6 OVERSAMPLING VIA CONVOLUTION

Let's look at how oversampling is accomplished in practical CD


players. The FFT is not used, but rather, an algorithm based on the
convolution integral we discussed in the last chapter of Understanding the
FFT. Since the data we end up with will be oversampled (i.e., we will
have extra data points), we know a sinc function will exist about these data
points. To de-convolve this oversampled data we essentially must convolve
it with another sinc function. Program APS 1 1 .0 illustrates how this works:
I **************************************************

, * *
APS1 1 . 00 OVERSAMPLE I L LUSTRAT I ON
I **************************************************

' T H I S PROGRAM GENERATES A GRAPH I C OF A SAMPLED S I GNAL NEAR T H E


' NYQU I ST . THE SECOND PART OF THE I L LUSTRAT I ON CONVOLVES
' THE OVERSAMPLED DATA W I TH A S I NC FUNCT I ON .
1 0 SCREEN 1 1 : CLS : PM = 1 : F 1 = 0 . 9
P I = 3 . 1 4 1 592653589793# : P I 2 = 2 * P I : K 1 = P 1 2/200
D I M C ( 1 28)
XO = 20: YO = 20: XX = 620: YX = 320 : YM = 220
L I NE ( X O , YO ) - ( X O , YX ) ' DRAW Y AX I S
L I NE ( XX , YM ) - ( X O , YM ) ' DRAW X AX I S
20 FOR N = 0 TO 20 . 0 1 STEP . 0 1 ' CREATE SAMPLED DATA PAT TERN
X1 = N * F 1 * P I : Y1 = COS( X 1 ) ' CALCULATE DATA P O I N T
L I NE - ( XO + N * 600 / 2 0 , YM - Y 1 * 1 5 0 ) ' DRAW S I N E WAVE
22 I F C I NT ( N ) = C I N T ( 1 00* ( N » / 1 00 THEN GOSUB 60 ' SAMPLE DATA
NEXT N
I NPUT AS ' WAI T FOR USER PROMPT
, *****
1 6XOVERSAMPLE & CONVOLVE DATA W I T H S I NC FUNCT I ON *****
,
F I RST EXPAND DATA ARRAY
30 FOR N = 20 TO 40 : C ( N ) = C ( N - 20 ) : NEXT N ' REPEAT 1 ST 20
31 FOR N = 40 TO 80 : C ( N ) = C ( N - 20 ) : NEXT N ' REPEAT 1 ST 40
12
We may not need to throw so much away-this is just "brain-stonning."
134 Chapter 1 1

3 1 FOR N = 40 TO 80 : C ( N ) = C ( N - 20 ) : NEXT N ' REPEAT 1 ST 40


32 FOR N = 20 TO 40 , *** START OVERSAMPLE - CONVOLUT I ON ***
34 FOR D = 0 TO . 875 STEP . 1 25
36 I F D = 0 THEN Y2 = C ( N ) E L SE GOSUB 62
38 FOR I = 1 TO 20
Y2 = Y2 + ( C ( N+ I ) * S I N ( P I * ( I - D » + C ( N - I )*SI N ( P I * ( I +D » )/ ( P I * ( I +D »
NEXT I
40 C I RCLE ( X O + « N + D - 20)*600) / 20 , YM - ( PM*Y2* 1 5 0 » , 2 , 1 4
NEXT D
NEXT N
I NPUT AS: STOP
60 , * SUBROUT I NES TO SAMPLE AND PLOT DATA ( EVERY 20TH DATA PO I N T ) *
L I NE ( X O + N * 600 / 20, YM ) - ( X O + N * 600 / 20, YM - Y 1 * 1 50 )
C ( N ) = Y 1 ' SAVE SAMPLED DATA PO I NT
C I RCLE (XO + N*600/20, YM - ( PM* Y 1 * 1 5 0 » , 4 , 1 5 ' DRAW DATA PO I N T
RETURN
62 Y2 = ( C ( N ) *S I N ( P I *D )/ ( P I *D » + ( C ( N+ 1 )*S I N ( P I * ( 1 - D » / ( P I * ( 1 - D » )
RETURN

Let's cover this quickly-lines 10 to 20 generate constants, etc.


At line 20 we start generating (and drawing) a cosine wave, and at line 22
we test to see if the variable N is an integer If so, we jump down to line
60 and sample the data (a circle drawn on the signal indicates the sample
point). The program then halts and allows the user to examine the result.
At the user's prompt we oversample and convolve this data. Since
this data extends in both directions, we extend the data array (lines 30 &
3 1) giving the program access to past and future data points. At line 32 we
begin the oversample-convolution algorithm. We will generate four data
points for every one that exists in the original array by stepping one quarter
of the time interval between the original data points (line 34). Now, for
the original data points themselves, we know the sinc functions will all be
zero, so when D 0 we need only transfer the data point to the output
=

array-if D ¢ 0 we are generating an oversampled data point and jump


down to line 62 to approximate the initial value of this data point. We set
this data point to a sinc function weighted average value of the two data
points on either s i d e . We then move to line 3 8 and complete the
convolution by summing in the sinc function weighted values of the data
points (going in both directions-as we explained in Understanding the
FF1). The result of this routine is then plotted on the same graphic we
generated before, and the results are as shown in Fig. 1 1 . 19.
This program does indeed essentially remove the beat frequency
modulation, but it obviously fails to yield perfect results and the reasons
why are not hard to see. First of all we have only oversampled by 4: 1 , but
more importantly we have only extended our convolving sinc function to
Digital Audio 13S

plus and minus 20 data points. If you take the trouble to extend this
algorithm to ± 30 data points you will find the approximation to the
original sinusoid is considerably better. If, however, we suppose
harmonics generated by the distortion in the reconstructed oversampled
signal are integer multiples of the sinusoid itself, we realize this distortion
will be well above the audible range.

o
1"

Figure 1 1 . 1 9 - Oversampling Via Convolution

Use of the Fourier transform in the above development has been


only to analyze the nature of the problem; nonetheless, we recognize this
convolution algorithm actually does the same thing as manipulating the
frequency domain signal-in this case it's simply better to accomplish the
convolution in the time domain. If a solution to an engineering problem
exists, an infinite number of solutions exist. We can frequently discover
how to build a better mousetrap by simply exploring this fundamental
theorem of engineering.
PART II

AMPLITUDE RELATED PROBLEMS

We must talk a little about digitized signals, and the best way to
do that is to review how a typical AID converter digitizes a signal. 1 3 A
simplified 3 bit "flash converter" is shown below:

ANALOG VOLTAGE COMPARATORS


IN PUT ''LATCH E S ' ' or "FLlP·FLOPS"

V
REF
R8
.AAA
-y v T r-
�»
(
D {;I
"AN D" GATE

r C (l
R7 : � r- +'- � "OR" GATE
?- -


D {;I
r- C Q r-- I
R6 : '\
...
?- D Q �
V D IGITAL
I- C Q 0 UTPUT
R5 : �
?- - D
2
-
2
>

r- C Q
R4 :
� r- +
- D Q
-
>


r- C Q
R3
� - D Q
"-


r- C Q
:� �
r--
R2 -;
+'-
-

D Q �


I- C Q
R l :�
� SAMPLE
-....
CLOCK
Figure 1 1 .20 - Flash AID Converter
There are eight identical resistors (RI through Rs) in the "divider string."
If VREF is equal to 8 volts (and circuit loading is negligible) the voltage
comparators will have thresholds increasing incrementally in 1 volt steps
(the triangle shaped functional blocks compare two voltages and output a
" 1 " if the + side is greater-otherwise "0"). Now, during normal operation,
the analog input voltage will vary between 0 and 8 volts. When the
comparison voltage is exceeded, the comparator will output a " 1 ." The
clock pulses occur at a constant, precise rate, strobing the states of the
comparators into a series of "latches" or "Flip-Flops" (i.e., bistable
multivibrators). Note that when the input voltage exceeds the threshold of
some comparator, turning it on, all comparators below it will also be turned
on. The logic to the right of the latches encodes the state of the latches

13 AIDstands for analog to digital There are many different ways to convert
analog to digital data but a flash converter is easy to understand
Digital Audio 137

into a 3 "bit" binary number output. 1 4


We muse now consider the AID "transfer" curve (Fig. 1 1 .2 1 ) of
a typical AID converter Note that the output reads 000 until the input
voltage exceeds 1 .00 volt. It then reads 001 until the input exceeds 2.00

ttl
S
=-
I l O
S 101
0 1 00
..J
� 01 1
G 010
-

Q 00 1
000 1 1 I I 1
1 . 00 2.00 3.0() 4.00 S.O() 6.00 7.00

INPUT VOLTAGE
Figure 1 1 .2 1 - AID "Transfer" Curve
volts, etc. , etc. This represents a form of truncation error, where the
fractional portion of the input is truncated, resulting in the digital output
always being lower than the input (except when the input exactly equals a
transition voltage). If the input varies continuously the output will be, on
average, 112 of a least significant bit (LSB) too low. When working with
a 1 6 bit AID converteJ; this error (which corrupts the 5th decimal place)
may be negligible. If, on the other hand, we're working with an 8 bit
converteJ; where the error corrupts the 3rd decimal place, it just might be
a problem (in our 3 bit converter it's a serious problem).ls
This problem can be alleviated by changing the threshold voltages.
If the two end resistors in the voltage divider string of Fig. 1 1 .20 are made
1/2 the value of all the others, and the reference voltage is reduced to 7
volts, the first threshold will be at 0.5 volts, the next at 1 .5 volts, the 3rd
14
Jt works like this J only if both inputs are J
AND gates (flat backs) put out a
(i.e., one input is a J AND the other input is a J ) OR gates (concave backs) put out a J if
either input is a J (i e., one input is a J OR the other input is a J ) The little circles negate
the input (i e , tum J into 0 and 0 into J. Most often a J is 3 to 5 volts and a 0 is less than
0 5 volts
IS
When we perfonn cumulative computations on data the truncation error may be
significant in any digital system The error accumulates at an average rate of 1/2 LSB per
computation Obviously, then, the nght-most digit is compromised immediately, and ten
successive computations may discredit the second decimal place. Even if your software
returns 7 decimal digits. if you're doing a lot of computatJon, the last two digits may be
inaccurate (if you need more accuracy you may want to use double precision anthmetJc).
138 Chapter 1 1

at 2.5 volts, etc., etc. The output will now be 00 1 for any input from 0.5
volts to 1 .5 volts, 0 1 0 (binary 2) for inputs from 1 .5 to 2.5, etc. The
average values are now correct, but we haven't completely solved the
problem; in fact, we have exposed a more fundamental error-the
digitization error. When we convert continuous variables into discrete
numbers, we encounter this digitization error. We can no longer "see"
what the input is doing below the least significant digit. In binary systems
this introduces an error of ± 112 of the least significant bit. 1 6
So, then, how many bits do we need in our AID converter? An
8 bit converter splits the input signal into 256 increments, and a 1 6 bit
converter yields 65,536 different values. High fidelity compact discs use
1 6 bits for each sound channel and provides pretty good audio-True Color
digital pictures use 8 bits for each of three primary colors. Our present
example is digital audio, so let's look at this 1 6 bit digital word.

11.7 DYNAMIC RANGE

120 _ Threshold
of Pain
The dynamic range of the human ear is about 1 20
110 - db (from the threshold of hearing to the threshold of pain).
100 --.--
Now, playing music at the threshold of pain must surely
imply masochistic tendencies-one would think we need
90 -
not produce levels greater than about 1 20 db (above the
80 - threshold of hearing).
70 -
Unfortunately, the quasi-coherent nature of the
harmonics in real music cause them to add in ways that
60 Mnslc ?
-

make peak amplitudes 1 0- 1 2 db higher than a simple


50 - analysis of dynamic range would indicate (Fig. 1 1 . 2 1 ) .
This extends the range to 1 30- 1 35 db (?).
40 -
Neither do we listen to music at the threshold of
30 - hearing-if the sound is too low we turn the volume up.
20 ----''-- In the home, background noise usually makes threshold a
moot point-in an automobile 40 db above threshold might
10 -
Threshold very well be inaudible. This consideration doesn't reduce
o _ of Hearing
the dynamic range; but, rather; if we boost a quiet passage
Fig. 1 1 .22

16
Tuming the average - 1 /2 LSB truncation error into a ± 112 bit error doesn't
completely eliminate the cumulative error. With a ± 1 /2 bit error the cumulative error then
wanders orrin a random walk. Fortunately, 5 decimal digits is more than adequate for most
applications.
Digital Audio 139

by 20 db, noise (and distortion) are boosted by 20 db. 1 7


Now, to optimize signal to
noise ratio, recording studios could
scan the digital master and make sure
the highest peak amplitude is set to
the maximum digital word size-but
doing s o would make the l oudest
passage m the Moonlight Sonata equal Figure 1 1 .23 Two signals composed of
_

the loudest in the 1812, and when we 32 harmonics of equal amplitude Phases
play a disc with more than one selec- are randomized in the lower waveform
tion, most people would find this unacceptable. So, we lose 20-30 db here
(so far as noise and distortion are concerned). 18 We consider this in greater
detail late[
So, we need about 1 3 0 db of distortionless dynamic range (i.e.,
practical considerations expand the range between 20 and 1 1 0 db
considerably). [Note: "distortionless" doesn't mean no distortion at all!
We need only guarantee that distortion is below the threshold of hearing.

11.8 DYNAMIC RANGE (LINEARITY DISTORTION)

CDs specify their dynamic range at 96 db-let's look at this


specification. On a CD the signal is stored as 1 6 bit binary words (the data
on the disc is stored in a reasonably elaborate encoding scheme but the
sound data is still stored as 1 6 bit words). Now, we know that 2 1 6 =

65,536, so the largest peak to peak sinusoid that can be stored with this
word size must fit between zero and 6 5 , 5 3 5 (effectively the most
significant bit is a sign bit and the sinusoids vary between ±32,767 but let's
not get bogged-down in details). The smallest possible peak to peak signal
would be a change of 1 bit, yielding a dynamic range of 20 LoglO(65,535)
=
96.3 db. Okay, it's apparent where they get the 96 db, but let 's not kid
ourselves-a signal switching between zero and one is a square wave (see
Fig. 1 1 .24). Surely this is a very low sound level (about 20 db above the
threshold of hearing if the max. amplitude 1 20 db, but if you reach over
=

17
Again, the real situation is complicated-threshold of heanng is frequency
dependent, loud sounds "mask" soft ones, etc. (see, for example, Chapter 2 of Ballou's
Handbook of Sound Engineering, Howard W Sams).
18
Things could be greatly improved with an embedded "loudness" (i.e , gain)
word which could be updated every 0 . 1 seconds or so.
140 Chapter 1 1

and tum up the volume on your amplifier; this will not sound musical (if
your voice sounds like this don't bother sending your resume to the "Met").
Now, we 're not s o m u c h c oncerned w i t h s u c h a s i mp l e-minded
determination of dynamic range, but with distortionless dynamic range!
Let's look at this just a little bit closer
Let's look at how digitiza-
tion error (see Fig. 1 1 .2 1 ) affects
digital sound. Not only do we
acquire an error from the finite
increment of the digital steps but f= 1.45kHz
we digitize at precise times, and the level 40 dblthreshold
,---'
=

signal's crossing a threshold doesn't


guarantee the AID converter will F-......l.._-'----'�-"-_..L...-___L_...L...--1
record that fact. For example, by Sample Rate 44.1 kHz
-

Fig. 1 1 .24 - Digitization Error


the time we perform the first AID
conversion in Fig. 1 1 . 24, the signal has exceeded two digitization
increments, and the 2nd converted word includes three increments (the
data, as noted earlier; is always digitized at less than the signal). This
error, then, doesn't simply fail to capture the exact amplitude of the signal,
but actually records an incorrect form /or the signal! This is, of course,
a non-linear distortion; but, if it doesn't repeat every cycle (in general it
won't), it becomes quantization noise. As the quantization increment
becomes smaller, and the sampling rate becomes faster, this form of
distortion/noise rapidly decreases (otherwise CDs would be neither
technically nor commercially viable). But how much distortion do we
encounter? While this process isn't easy to analyze we have in our
possession a powerful analytical tool-an FFT spectrum analyzer We can
model the whole AlDIDIA chain and then analyze the signal for harmonics
(in the output) that shouldn't be there. (This is too good to pass-up.)

11.9 MODELING THE D/A MECHANISM

We will put together a fairly simple model of the D/A output to


illustrate this technique, but if you're really building digital sound systems
you might want to consider this in greater detail. The D/A converter (for
1 6 bits) has maximum peak amplitudes of 215 (i.e., ±32,768), so if we
multiply a unit amplitude sine wave by 32,768, and take the integer portion
Digital Audio 141

of that sinusoid, we will pretty well duplicate the action of an AID


converter We can then attenuate the sine wave before putting it into this
AID converter to simulate the digital signals. We will do all this with the
following routine (see Appendix 1 1 .3-FFTl I-03):

400 REM GENERATE FUNCT I ON


402 FOR I = 0 TO Q- 1 : C ( I ) = 0 : S( I ) = 0 : NEXT I ' CLEAR ARRAY
404 MAMP = 2 A 1 5 : GA I N = 1 / MAMP : Y = 0 : I SAMP = 0 ' SET - UP D I G I T I ZER
410 FOR I = 0 TO QDT ' GENERATE FUNCT I ON
414 Y = GAI N * I NT (AMP * MAMP * S I N ( F9 * K 1 * I »
420 S( I ) = Y
430 NEXT I
432 I F WT FLG = 2 THEN 450 ' USE WE I GHT I NG FUNCT I ON?
440 RETURN

In line 404 we set up a maximum possible amplitude of 2 1 S (MAMP) and


a GAIN constant of IIMAMP. The gain constant is used (in line 4 14) to
convert the maximum signal back to 1 .0, keeping our maximum signal at
zero db for easy reference when reading the distortion!9 In line 410 we set
up a loop to generate the signal to be analyzed. We generate this digitized
data at line 4 1 4 as we discussed above. The variable AMP must range
from zero to a maximum of 1 .0, and acts to attenuate the signal input so
that we can see the effect of distortion for variable amplitude signals. In
line 420 we place the value Y in the S(I) array and at line 430 jump back
to generate the next data point. At line 432 we invoke the weighting
function routine if it has been selected (just as in the standard spectrum
analyzer of Chapter 9).
The Generate Function routine above i s contro lled by the
Generate Function & Analyze routine shown below. In lines 602-604 we
specify the frequency ofthe sinusoid to be analyzed. At line 6 1 2 we jump
down to the Generate Function routine to simulate the DIA process.

, *********************************
, * GENERATE FUNCT I ON & ANALYZE *
, *********************************
600 CLS : PR I NT : PR I NT
602 I NPUT "SPE C I FY AMPL I TUD E , FREQUENCY ( E . G . , . 8 , 1 6 ) " ; AMP, F8
604 F9 = F8 * FRACF ' CONVERT TO FRACT I ONAL ARRAY DOMA I N S I ZE
606 PR I NT "PREPAR I NG DATA I NPUT - PLEASE WAI T ! "
61 2 GOSUB 400 ' GENERATE S I NUSO I D
6 1 4 GOSUB 1 00 ' ANALYZE S I GNAL

19As we discussed earlier (Section 1 1 .7 and Fig. 1 1 .22), the maximum amplitude
will generally be less than - 1 0 db (and in many cases much lower), making the ratio of the
signal to distortion/noise about 1 0 db less (i e . worse).
142 Chapter II

We can now put this


.....
.., II1 I1 Qlrn...

, . U1I I2S
digital output simulation into our
29
spectrum analyzer (we need only
40
add it to the spectrum analyzer of
60
the previous chapter) to see what
89
distortion is generated. We find, as
100

U\J\..AJVV\.A
I I I I I I should have been expected. that
129
Li
non-linear distortion shows up as
harmon ics that were not in the
Fig. 1 1 .25 - Synchronized Signal
original signal (intermodulation
distortion, on the other hand, creates side band components). The sum­
total of all these distortion harmonics must be below audible levels for a
perfect system. You will find the worst distortions occur when the signal
is an integer sub-multiple of the sampling rate (Fig. 1 1 .25). This happens
because the digitization non-linearity locks in and is identical for each
cycle (as we explained on p 140); however, if the digitization error is not
identical i n sequential cycles, it shows up as digitization noise.
Fortunately, this lock-in phenomenon is rare.
. mn�
n------ ...
You will want to see what
• ---
happens over both the frequency 21
range and the dynamic range. The &I lII----­
routine given in Appendix 1 1 .3 will " ift------­
step through the chromatic scale, • !it-----
allowing amplitude to be changed . '-'- __________

I ,
so you may observe signal to noise +-��-:----:-----:--
and distortion ratios for various 2I ����������in
I

system conditions-it's an interest- _

Fig. 1 1 .26 - Non-Synchronized Signal


ing exercise. You w i l l need to
know what happens if you reduce the size of the maximum digital word
from 2 1S to 2 14 (or smaller). What happens when you increase the size of
the digital word? [Ob, yes, and what happens as you change the resolution,
etc., of the spectrum analyzer?]
NOTE: The coming of DVDs has changed things considerably
D VD audio addresses my major complaints concerning CD audio (i.e.,
primarily sampling rate and digital resolution, but it also expands on the
technique of stereo sound). The D VD uses 24 bit words (/6. 777,216
values) for each channel, at a data rate of 96 kHz (or greater), which
pretty well takes care of the problems discussed above.
Digital Audio 143

11.10 RECORDING HIGH FIDELITY SOUND

The acoustic problems of recording sound today are no different


than they were fifty years ago. If you have tried to record a performance
you probably know that extraneous sounds can utterly destroy the
recording (e.g., crinkling of paper, someone coughing, etc.). Technicall)l
the way to capture a high fidelity recording is to lock the musicians in an
anechoic chamber, but this approach greatly influences the musicians, and
may change the final result dramatically). A more practical solution is to
place a microphone just-off-the-nose of each musician, but this becomes
cumbersome when recording a 1 00 piece orchestra. These acoustic
problems, that plague the art and technology of recording sound, are much
too far from our subject-we mention them here only to emphasize their
impact on the following comments.

11.11 A GLANCE AT THE FUTURE

In the 2 1 st Century we will surely see miraculous developments


in high fidelity sound. Let's consider what might be forthcoming. A piano
can be digitized and analyzed into perhaps a dozen or so harmonics (fewer

u Fig. 1 1 -2 7
, I ,

- Piano A = 440 Hz.

in the higher register). To analyze this sound we need to digitize a single


note at about 80 kHz for perhaps 20 -30 seconds; however, once you
analyze a note, it can be stored in about 200 data words ( 1 00 sine and
cosine components). Now, the tone of a good piano should vary little
between adjacent notes, so you would need to store only every tenth or
twelfth key on the keyboard (the intervening keys would be reproduced by
shifting the frequencies up and down by llv2 for each half tone. We
might need a frequency domain weighting function (i.e., a filter) to
represent the piano "box," but this would be a single constant. There are
88 keys on a piano keyboard which could be stored as 1 1 x 1 00 x 2 = 2200
1 44 Chapter 1 1

data words. We could store a high fidelity symphony orchestra in perhaps


256 k-words (i.e., a mega-byte). We could then type-in the score to
B eethoven's 9th ( excluding the choral parts, of course) and hear a
performance without all the imperfection accompanying the recording
process. We could even glue an accelerometer to a baton and conduct the
orchestra as we know it should be conducted (eat your heart out Arturo).
Theater groups do Oklahoma! with little more than a piano-they could
use a good synthetic orchestra. 2o
Along the same line of reasoning, we could put the cast of La
Boheme in a carefully engineered acoustic room (using hearing-aid type
earphones to hear the synthesized orchestra?), and record the voices of
Rodolfo, Mimi, et. al. The synthesized orchestra, of course, could be
added when the master is made; or, on playback, we could replay the
voices, and synthesize a perfect orchestra at that time. This potential for
synthesizing perfect orchestras eliminates the myriad problems associated
with recording live performances.
Even more exciting, perhaps, is the possibility of enhancing very
early recordings of famous artists. There are two approaches to the general
problem of enhancement-one is to try to remove the noise and distortion
captured in the original recording-the other is to replace each recorded
elemenr l with a perfect element. In the latter approach we must know a
priori what the element should look like. We know what a piano (or
trumpet, etc. ) sounds like, so the problem reduces to optimizing the
replacement element by minimizing the error between original and
replacement according to some criterion. It would not be too difficult to
measure the dynamics of a Rachmaninoff recording and synthesize his
performance with a perfect piano-so too with the classic cornet solos of
Bix Biderbeck.
In this new century we will also employ such techniques as
separating the spectrum into perfect parcels and driving each speaker in the
sound reproduction system with only its optimum frequency band­
perhaps even measure the distortion of the speaker in this range and, prior
to sending recorded sounds to a speaker, compensate for the distortion.
Surely we can look forward to virtually perfect (i.e., inaudible
distortion) sound systems in the next 1 00 years.

20A simple program to synthesize a piano is given in the next chapter


2 1 Use of the term "element" will become clearer in the next chapter
CHAPTER XII

CHANGING THE PLAYBACK RATE


& SOUND SYNTHESIS

In Chapter 1 1 we considered the problem of changing the


sampling rate while keeping the data unchanged (i.e., oversampling); but
in this chapter we consider a much more difficult variation on that
theme-the problem of slowing or speeding the data playback without
changing the "pitch . " Our investigation will bring us into contact with
some interesting audio applications.

12.1 SIMILARITY

We may, by slowing down a record, turn a soprano into a basso­


profundo . As we know, in FFT jargon, this is the Similarity theorem-if
we expand a function in time the frequency domain shrinks. This
relationship is so fundamental and obvious it's hard to imagine how a
recording could be slowed without turning sopranos into bassos, but our
bout with oversampling hints at a crack in the armor-we added data
points, but increased the data rate, yielding a null result. . . only the data
sample rate was increased. Apparently we can manipulate the frequency
domain data to achieve a desired result; but, compared to our present
objective, that was child's play. Our problem here is considerably more
formidable-we want to slow the record without turning sopranos into
bassos-we want to directly violate the Similarity relationship! Now, this
is almost sacrilege. . . sort of like breaking the laws of physics. (For those
who believe man wasn't meant to have such knowledge, I'm writing this
chapter to the ladies only-man reads it at his own risk.)l

12.2 THE FREQUENCY SHIFTING THEOREM2

We are well familiar with the time shifting theorem-if we shift


a function in time, all of the harmonics shift in phase, proportional to the
time shift and the harmonic number (see Section 1 1 .4.2). There's a similar
theorem about shifting in the frequency domain, of course, but before we
discuss it we need to talk about the mechanics of shifting frequency
components up and down.

1 ------
You never hear anyone say "Woman wasn't meant to have such knowledge!"(?)
2
Ifchanging the playback-rate shifts the frequency, it's more or less obvious we
will need this-it's just not apparent how we can use it to break the law.
146 Chapter 12

1.0

L

•••• • • •••••••••••••••••••••••• Ifwe transfonn a con-
1.0 .
stant amp l Jtu' d e function we
get a zero frequency com­
ponent only (Figure 1 2. 1 left).
Tim e Freq uency This is simply what a constant
Fig. 1 2 . 1 j(x) 1 - = function is (forget about the
sinc function for now-we're in deep swampwater here ! ).
Okay, suppose we shift this zero frequency component up one
notch in the frequency domain-up to the first harmonic position. We
know this spectrum will reconstruct as a single sinusoid (Fig. 1 2.2). We
will tum a constant amplitude Shifted
1.00

L
into a sinusoid by shifting its o.so -+
• • • • ••
• •
• •

• •
. .
transform (from zero) up one . .

..
. . . .. .
harmonic number. If we shift . '.
. .

t h is h arm o n i c up another
notch, w e will turn a singl e Frequency Time

c y c l e o f s i nu s o i d i nto two Fig. 1 2.2 - j(x) Sin(wt ) =

cycles, etc., etc.


Keeping this in mind let's now consider the frequency shifting
theorem. What happens if we shift the spectrum of a more complicated
function (e.g., a triangle wave)? [Note: � have been using the PFFFT
extensively in the last few chapters, but it will be best to revert to the
conventional FFT for this illustration-we need the negative frequency
components here.}

Fig. 1 2.3 - Triangle Wave

It was the negative sidebands (extending downward from the pulse


train fundamental) that caused the beat-frequency modulation we struggled
with in the last chaptet Clearly, these negative frequencies really exist, so
if we frequency-shift the harmonics of a sampled data spectrum (i.e., any
transform), we must also remember to include the negative frequencies.
Playback Rate 147

So, then, if we shift the spectrum of a triangle wave upward, we


must fill the harmonic positions that have been vacated by the shift with
the negative frequency components that lie just below zero (Fig 1 2.4). In
practice we do this by shifting the nega- 1 DO

tive frequencies end-around into the zero


frequency position. This shifting mecha-
nism creates a set of sidebands about a
center frequency-a frequency equal to
the frequency shift. This result is, of
course, an amplitude modulated (sup­
Fig. 1 2.4 - Shifted Xform
pressed) carrier. It's exactly as i f we
multiplied a sinusoid (carrier) with the original function. Note that the
modulation of Fig. 1 2.5 is identical to the triangle wave of Fig. 1 2.3. Here
we have increased the frequency without speeding-up the function! More
to the point, we may shift the spectrum of Fig. 1 2.4 and only change the
frequency-not the duration. This
is not quite what we wanted, but it
sure looks promising! It shows that
the pitch and speed of playback are
not eternally locked together-that
while similarity surely describes a
fundamental relationship, other
Fig. 12.5 _ Frequency-Shifted Triangle
relationships are possible. We will
return to this line of investigation shortly, but for now let's look at the
nature of the beast we have to tame.3

3
Time domain theorems have frequency domain equivalents which, because of the
similanty of forward and inverse transforms. are always similar. The similanty between the
time and frequency shilling theorems may not be apparent as we have presented them;
however, mathematically the time shifting theorem is wntten:

Xform{j(I-I,)} = e';"' '' F(f) ------------ (12.1)

and the frequency domain shifting theorem is written'

Inverse Xform {F(f:t;)} = e ;"'/, j(1) ------------ ( 1 2.2)

In Section 1 1 .4.2 we investigated time domain shifting sufficiently to know that Eqn. ( 1 2. 1 )
says a time shift is a phase shift o fthe frequency components. Keeping in mind that the time
domain function isjust the summation of the harmonics, it becomes apparent that Eqn. ( 1 2.2)
says a frequency domain shift produces a frequency shift of the time domain function. Note
that Eqn. ( 1 2.2) multiplies the time domain function by a sinusoid-this is modulation--the
equivalent of side bands in the frequency domain That, of course, is exactly what we have
produced in Figs 1 2.3, 1 2 4 and 1 2 5 above
148 Chapter 12

1 2.3 DISSECTING THE PARTS OF SPEECH

We're working with audio, so let's actually look at something


audible. The time domain signal shown below is the audible function:
"This is a test." At this scale it's hard to tell much about the individual
sounds but there is something .­

that's pretty obvious-this has the


ap p e a r a n c e o f a n amp l i t u de
modulated function. We note that
the first three words are slurred to­
gether and, taken together, are
only slightly longer than the single T......e ss.... ..t

•••• ••••

last word "test." We are severely


Fig. 1 2.7 - "This is a test."
limited in what we can do here­
we will not be able to handle whole phrases, but we can handle individual
words (as elements). Let's take a closer look at "this."
In Figure 1 2.8 we see there
is a distinct separation of this word
�..�..,.�-- into two parts-the "sss" sound is
distinctly separate from the rest of
Fig. 1 2.8 - "This" the word. It's of much higher fre-
quency and, as we see in Fig. 1 2.7,
it's this "sss" sound that bridges the words in the phrase "thisisa." The
"sss" sound is further expanded in Fig. 1 2.9.
Figure 1 2.9 covers a 1 0

I
ms. interval so the fundamental
loA �...,.u� d�U�Aa�.
Ot' vtQ4•viiWi.,
frequency appears to be around 4.5

T
. V. ,,1 r .,4...
kHz. With a sampling rate of 1 1 i\. f' 1,"
kHz (Nyquist = 5 . 5 kHz) we're
marginal here. If we look at the
first half of "this" word under the Fig. 1 2.9 - The "sss" Sound
same microscope, we find its dominant frequency is about 400 Hz.
Okay, let's now look at the spectrum of this word. In Fig. 1 2. 10
we see there are four major frequency components (ignoring the very
lowest component). Each frequency tick on the x axis is 550 Hz. so the
dominant component is around 400 Hz. Note that at about 4.5 kHz, we
have something that looks like wide band noise. This, of course, is the
" sss" sound shown in Fig 1 2.9. Finally, you will note the major harmonics
Playback Rate 149

-
are approximately integer multiples of
the lowest major harmonic frequency.
These are produced by the voice-box,
and must, of course, vibrate according
to the laws of physics. It's unlikely
they would not be integer multiples
(approximately).
�w.������-
We m ay s ep arat e - o u t t h e
Fig 1 2 . 1 0 Transform of "This"
-

major frequency domain components


of this word and inverse transform them individually (see Figure 1 2. 1 1 ).
Note they all reconstruct faithfully with respect to position--even the "sss"
sound in the bottom trace. These major components represent sound
elements that make up spoken words (and most other common sounds too).
Note that the amplitude modulation on these
components is very low frequency-a couple of
Hertz at most. We can recombine these sound �9 1
elements, of course, and even though we elimi­
nate everything else from the spectrum, we will 319 '
obtain a reasonably good reproduction of the
original function "this." If you do this and then
518.3
play it back on your computer, it will actually
sound like "This." (This particular reconstruction 647.1 H-...__--HH---H�
yields a slightly deadened sound, but a clever
engineer/programmer could probably figure out -I.5kf--+l....Io<+ .. ...ItoII�
why and fix that-surely these sound elements
contain the complete sound.) Fig. 1 2. 1 1 - "This"
We s h o u l d note that t h e s e s p e e c h
components carry their own weighting functions, generally simplifying our
task. This built-in weighting is part of the spoken word but, for our
analysis, it means what we see is what we really want to see. Coinciden­
tally, this built-in weighting function sort or validates our earlier decision
to ignore the effects of the ever-present sinc function. Before we continue
our investigation of variable playback rate let's digress to consider a very
interesting problem that remains to be completely solved. Let's talk about
how we might recognize speech.4
41 have no idea how the great gurus of Speech Recognition actually do this-this
is only a "straw man" we can beat-up while we point out a few things. Our primary
objective here is to develop the notion of sound elements as modulated sinusoids whose
sidebands give a distinctive pattern
150 Chapter 12

12.4 SPEECH RECOGNITION

We might create a dictionary of syllables corresponding to the


sound elements of the preceding section, then break each digitized word
into its sound elements and pattern match (i.e., recognize) syllables (and/or
phonemes). We would then construct ( i . e . , recognize) words from
syllables, and probably phrases from the words . It may be, however, that
pattern matching at the syllable level isn't sufficient-we may have to look
at a lower level-perhaps try to recognize vowel sounds. If, for example,
we could detect a "th" sound at the beginning, "sss" at the end, and a short I
sound for the middle vowel, we have "this." If the vowel is a short u we
have "thus." Now, these low level elements all sound pretty Neanderthal;
still, these components can be recombined to get the original words, so the
vowel sounds, t sounds, p sounds, etc., must be there somewhere.
Let's look at what we know so far:
1 . The mid-range frequency (i.e., 300-900 Hz) major harmonics
are the things that, together, give an individual voice its "identity." They
generally coincide with the vowel sounds or "phonemes," and may be used
as a "locator" for vowel sounds in words.
2. The "sss" sound is a wide band noise hiss which frequently
blends words into run-on phrases (e.g., "thisisa").
3. T, P, etc., are distinctive elements which frequently identify
beginnings/endings of words and syllables (e.g., Test or Perpetuate).

by studying phrases as we have done above, but .99.2 �••••�f-


We can surely discover many such rules

there are a great many other problems in speech


403.7
recognition. To illustrate we repeat the example
of the previous section but spoken by a different
person. Immediately we notice the sss sound is 594..
missing. The voice depicted in Fig. 1 2. 1 2 was
digitized at a rate of 1 1 ,025 samples/sec (Nyquist 794 0 f-+-I-......�f­
of 5,5 1 2 . 5 Hz). Now, AM radio bandwidth is
only 5 kHz, and we would think that should be 917.. I-+-+-......oH-
plenty for what we 're doing; however, in this -4. k
2 I-�"••o!-+-+-
particular voice, the sss sound peaks at almost 9
kHz. We must sample at about 20 kHz (Nyquist Fig. 1 2. 1 2 "This" -

of 10 kHz) and, indeed, the same voice, sampled


at 22,050 samples/sec, recovers our sss sound. If we hope to do decent
speech recognition, then, we will need high fidelity sound.
Playback Rate 151

So, what about recognizing speech by pattern matching these


sound elements? Figs. 1 2. 1 1 and 1 2 . 1 2 are close, but they're far from a
perfect match. Nonetheless, when we combine these components, the
words are reproduced- the identity must be in there.
Okay, this is a world-class puzzle. If you have a multi-media
computer at your disposal, you have all the laboratory you need to do the
R&D. You can record voice using any sound board and the program in
Appendix 12.1 can be used to analyze and butcher the * . WAY files. [If
you decide to tackle any part ofthis problem you should look this program
over carefully just so you know exactly what each function does-you might
want to write your own version.]
In any case, if you intend to use the Fourier transform to work on
audio, you will have to butcher the files as described here. Here are a few
hints that might be helpful: You can separate
the words in run-on phrases by filtering off the
"aaa", pitch = C
spectrum above 2 kHz (i.e., by eliminating the
" s s s " sounds) and then reconstructing the
������--��
phrase. You will need to add the "sss" back
after separating the words, of course, and test to
see which of the words it belongs to (e.g., "this
is a sea shell").
f!1"'....-
.. -....-- ... --�� Reco g n i z i n g v o w e l sounds i s a
particularly intriguing problem. You might
"aaa", pitch = G want to record prolonged vowel sounds ( i . e. ,
"aaa", "eee", " i i i " , etc.) and investigate both
....__
... ....-
... ...... &...--
.t-- �� their spectrums and time domain waves. You
Fig. 12 14 Vowel "A"
-
might need to say these at different musical
pitches to find the tone invariant characteristic of each vowel.
Surely this is a world c l ass problem, and its s o l u t i o n i s ,
apparently, not out o f our reach . . .ifwe have access t o nothing more than
good desk top computet . . .

12.5 SPEEDING UP THE PLAYBACK

So, what was our intention when we went out into that swamp?
Well, what we want is to get the opera over in less time so we can go to
bed. We can do this by playing the 33V3 record at 45 RPM; but, that basso
will turn into a soprano (i.e., the frequency domain wIll be expanded as the
time domain shrinks.) Right-but why couldn't we just use the frequency
152 Chapter 12

shifting theorem to shift him back down to bass again? In fact, we can, but
it's not completely straightforward. When we speed up the record, every
frequency will be increased proportionally to the increase in playback rate
(i.e., if we double the speed of the record, every frequency that was
recorded will be multiplied by 2), but frequency shifting shifts all the
frequencies by a constant increment. That is, the result of shifting is:

not fer = Ai;


To accomplish the result w e desire w e w i l l have to recognize the
distinction between these two, and use both mechanisms ... and that is why
we had to develop the notion of sound elements (as we shall see).
We have already considered a form of proportional shifting-the
frequency stretching theorem. When we stretch the spectrum (by placing

Tralngle Wave Traingle Wave


Spectrum Stretched Spectrum

Fig. 1 2. 1 5 - Triangle Wave Spectrums

zeros between every frequency component-see Figs. 1 2 . 1 5 above) we


duplicate the data on reconstruction-we get a second copy (in the same
time domain). If we reconstruct this stretched spectrum we will get two
cycles of that triangle wave (if we had taken the transform of two cycles
we would have gotten this stretched spectrum in the first place).
But suppose we start with the modulated carrier spectrum of the
triangle wave we discussed back in Section 12.2 (see below--consider it

Frequency Stretched
Shifted & Shifted

Fig. 12. 1 6 - Stretched and Shifted


Playback Rate 1 53

to be one of our sound elements). Using what we have discussed, how can
we speed up this triangle wave without changing the frequency? Well, if
we had shifted the stretched waveform of Fig 1 2. 1 5 by the same amount
we shifted the original function (i.e., to the same center frequency see Fig
1 2. 1 6 above), then when we reconstruct this spectrum we will surely get
the waveform shown on the right hand side of Fig. 1 2 . 1 7 . Consider this
carefully for in this case all we have done is stretch the modulation
sidebands-the carrier frequency is unchanged. We get twice as many
cycles in the same time interval but the frequency is the same . . . that sure
looks like a light at the end of the tunnel.
• •

Frequency Stretched
Shifted & Shifted
Fig. 1 2 . 1 7 - Stretched & Shifted & Reconstructed

Okay, so, how do we use this trick to speed up the playback and
keep our basso basso? Well, we have seen how we can decompose spoken
words into elements based on their frequency domain function, and these
components can then be recombined to yield the original words (see Fig.
1 2. 1 1 ). These major components are simple enough that they are not
significantly different from the triangle wave of Fig. -
1 2 . 1 7 . I f, then, we tran s form any one o f the
components of Fig. 1 2. 1 1 , stretch the sidebands
about the component's dominant frequency (there's
no need to shift it down to zero, stretch it, and shift
it back up again) then, when we reconstruct, these
components will occur twice in the same time period
Figure 1 2. 1 8
(we will j ust throw away the back half). If we
perform this operation for all major components and then recombine them
(from superposition we can do that in either the frequency domain or time
domain), we will have our basso singing the opera twice as fast, and he
will still be a basso. [We can go to sleep in two hours instead of.. one?}
But this raises another problem-if they gallop through the opera
at twice the tempo that's too much (Figaro might be interesting though).
What we really need is something maybe 1 2.5% faster (that could still
1 54 Chapter 12

shave 30 minutes). The problem is that, in a conventional DFT, we are


limited by the discrete nature of the data. Trying to move between discrete
data points presents problems (as we all know by now). We are fortunate
in that we know about fractional frequency transforms, which allows a
certain amount of maneuvering.

12.6 THE 1 2.5% SOLUTION

Suppose we use a 1 1 1 6 fractional frequency configuration-we


know (from Chapter 9) this can be done by packing the last 1 51 1 6 of the
array with zeros. We also know that every 1 6th frequency component will
yield the same data as a conventional FFT, so it's apparent we could
extract every 1 6th frequency component, put them into a smaller array,
perform a conventional inverse transform and get the same data we started
with (except for a 16: 1 amplitude scaling factor). If this is not obvious, go
back and review Chapter 91
Okay, but we could also extract every 8th harmonic, put these
through a conventional inverse FFT, and we would then get the Y2
fractional frequency configuration (i.e., data in the front half of the time
domain and zeros in the back). In fact, that is the configuration we
actually need-it will give us room to both stretch and contract the
waveform ; but, before we start transferring harmonics over to this
conventional half-frequency inverse FFT, we need to look at how we're
going to speed things up (and slow them down) in this scheme. We will
keep the center frequencies of each sound element constant (just as we
described in the preceding section), and we will expand (or contract) the
side bands about each of these major components ... and here's how we're
going to do that in 1 2.5% increments: While we are still in the 1 1 1 6
fractional frequency array, we must pick out all of the maj or sound
elements of the trans formed voice. We then extract these m aj o r
components, taking care to preserve some 1 0-20 full sidebands about each
major component (i.e., that's 1 0 x 1 6 fractional frequency components).
So, when we transfer over every 8th fractional frequency component, we
will transfer the center frequency of every major component faithfully;
however; instead of simply transferring every 8th sideband component, we
might transfer every 7th sideband (counting plus and minus from the center
frequency) ... OI; perhaps, every 9th, or.... We will select every 8th ± nth
Playback Rate 155

sideband depending on how much .u .. MlIl.. _

we want to speed up or slow down


the playback. We will then be
stretching the sidebands in 1 /8th
harmonic steps, and the playback
w i l l compress in 1 2 . 5 % steps.
Unfortunately, we are up against
the limitations of QuickBasic™,
and (when we consider people like
Harry Nyquist and Edsel Murphy)
we can 't quite swing a 1 1 1 6th
transform; but, we can still dem­
onstrate the basic concept (see
Appendix 1 2. 1 ). Fig. 1 2. 1 9 is the
3rd major component of the word
"This" (from Fig. 1 2 . 1 1 ), and it
has been made large enough (but
just barely) to see the frequency
remains constant.
To produce a practical
system, of course, we must address
the problems we mentioned under
speech recognition (e.g., how to
detellnine major components, how
many sidebands to include, how
and where to sum components,
how to separate words, etc., etc.,
etc.) It m ight be desirable to
handle all these problems prior to
producing the CD and record the
Figure 1 2 . 1 9
album (or more probably the audio
book) in the transform domain. We could then reconstruct the audio at
playback time, with the playback speed under control of the listener:

12.7 MUSIC SYNTHESIS

Music synthesis is theflip-side of changing playback rate in that


here we must change the frequency of a given sound. We start with a
1 56 Chapter 12

model of the instrument to be synthesized and select the frequency to give


the proper note. Let's look at the problems involved in synthesis.
We know that a piano, or trumpet, or etc., has harmonics in the
sounds they make that give them their individual identities. Furthermore,
we know these harmonics must be integer multiples of the fundamental
tone (approximately) if the sound is to be musical. We already know that
these harmonics are not perfect integer multiples, which contributes to the
different sounds of different instruments; however, if we examine these
"harmonics" closely, we find that they are not simple sinusoids-they are
sound elements similar to those we discovered in the human voice They
have a microstructure which also strongly influences sound identity.
This, then, exposes the fundamental problem faced in music
synthesis-we must preserve the quasi-integer multiple relationship of the
harmonic elements without changing the microstructure of the harmonic
element itself. So, when we synthesize notes, the center frequencies of the
harmonic elements will be multiplied by the desired frequency step [i.e.,
CV2t], but the sideband components of the harmonic's microstructure are
obviously not multiplied by this factor If they were, we would be back to
the speeding record syndrome! The sound element must be placed intact
into the position determined by multiplication [by eV2t].5
In Appendix 1 2.2 we provide a program to experiment with this
sort of synthesis. A note (from an instrument) can be digitized and
analyzed to obtain its harmonic structure. The harmonic elements
(including 30-40 sidebands) may be captured and saved, and then used to
generate simple songs. The program provided isn't very elaborate-it
generates sounds over only one octave and doesn't really synthesize
musical sounds from an algorithm; however, it does allow the analysis of
musical sounds, and it does allow generation of simple songs to illustrate
the basic technique. It also allows summing files together so that more
complicated pieces could be assembled, but creating synthesizers is not our
objective here. We are only illustrating the potential of the FFT to provide
high quality sound in the synthesis of virtually any instrument (or even an
orchestra). This is the technology we referred to at the end of the last

5
Strictly speaking even this is true only for tones that are near each other, for,
as we move up and down the scale on any instrument, the tone changes. As noted earlier
this implies a new harmonic model (for any instrument) must be created for every octave
(at least). Altemauvely, we could map the harmonic structure of an instrument over its
tonal range and create a dynamic model which changes with every note
Playback Rate 1 57

chaptet It's the next technological step in synthetic sound (i.e., to improve
on the fidelity of recorded/reconstructed sounds-and to recover high
fidelity replicas of the very early attempts to record sound).
There is much to do here. We need to understand the structure of
the harmonic element side bands. Surely the modulation envelope
determines a significant part of the s idebands, but the asymmetry of these
side bands tells us there's considerably more here than just the modulation
of a harmonic carrier sinusoid. We need to know how distinctly different
sounds are carried in these side bands (e.g., in the case of vocal sounds
how the vowel sounds are carried via these sidebands). We also need to
know how the individual harmonic elements combine to produce the
distinctive sounds of various instruments, voices, etc.
In this project it's clear the Fourier transform will be both an
instrument of analysis and synthesis. We have included a routine to
perform afine line analysis of the sounds which employs a DFT fractional
frequency algorithm. It's slow in execution, of course, but once we have
determined the location of the major harmonic elements we need not
analyze a broad band of frequencies. This is one of the major themes of
this book-if you want to use the tool of Fourier analysis in practical
research and development you will need to improvise, design, and write
variations of the FFT (and DFT) which can only be done if you understand
these tools.
If we can build a synthesizer that generates a truly high fidelity
replica of musical instruments, we can eliminate the insurmountable
problems of trying to recom live performances. Such a synthesizer would
create the music note by note, which allows control of the piece at the time
of creation (just as with a live performance). This feature, as we said
before, would eventually allow the real time synthesis of a high fidelity
orchestra, but understanding the nature of sound itself will open whole new
fields in the 2 1 st Century.
CHAPTER XIII

THE TWO-DIMENSIONAL FFT

13.0 INTRODUCTION

The two-dimensional transform opens up a whole new world of


exploration. It will be easy enough to explain the algorithm and software.
but it will take a little longer to explain the "meaning and purpose of
existence" stuff; so. we will postpone all that for a while. We will begin
with the technicality of writing two-dimensional FFT programs.

13.1 WHAT ARE WE DOING HERE?

When we perform the one­


dimensional OFTIFFT we are finding
the sinusoids which. when summed
togethe� recreate the data points of
.
the original signal. Fig. 1 3 . 1 shows a :

typical example of the conventional L--_"':::=


: ==__-==::::_ ::' -,
one dimensional transform.
Fig. 13.1 - 1-0 Transfonn
In a two-dimensional data array (e.g., a digitized picture) we have
a matrix of data points. If, for example, we take a picture of a star through
a good, properly aligned (but slightly out of focus) telescope, we will get
something similar to Fig. 13.2A. If we use a CCO camera to take the
picture we will actually have an array of numbers which might be
displayed as in Fig. 13.2B. Now, we may view this array as horizontal
lines of data and, using our familiar 1-0 transform, take the transform of
each of these lines separately (as shown in Fig. 13. 1 ). There is nothing
earth-shattering here-we would simply have a lot of transforms of

Image Digitized Data

Fig. 1 3.2A Fig. 13.2B


Two Dimensional FFf 1 59

individual data lines. If, howeve� we replaced each data line of the
original picture with its transfonn (as we nonnally do), we would then
have a new array of data such as is shown in Figure 13.3.
Let's pause here and talk
about what we've done so far. We
now have transfonns ofevery line of
the original picture (which is, inci­
dentall� the picture of Fig. 13.2).
It's apparent we had no good reason
for taking the transfonns of the Fig. 13.3 - Row Transfonns

horizontal lines-we might just as well have taken transfonns in the


vertical direction-the relationship of digitized data points (frequently
called pixels) is just as important in the vertical as the horizontal. I
Unfortunately, our transfonnation of the horizontal rows ignores the
significance of the vertical relationship (and, of course, if we do it in the
vertical direction we lose the relationship in the horizontal direction). This
is, ofcourse, a serious problem-to get a complete transfonn of the picture
we must include both vertical and horizontal relationships.
Okay, then, this is the question we are trying to focus on: how can
we get a proper transfonn of the 2-D picture? After taking horizontal
transfonns, how can we go back and include the vertical transfonns? How
do we combine vertical and horizontal into a single transfonn in such a
way that the final result makes sense?
Well, in Fig. 13.3 we still have a matrix of data points-we have
the phasors (which represent the amplitude/phase of the sinusoids that
make up the horizontal rows). Let's look closely at these rows of data.
Along the left-most column we have all of the zerofrequency components
of the horizontal transfonns. The next column over contains all the
fundamental frequencies ofthe horizontal transfonns, the next contains the
2nd hannonics, etc. Now, there's no reason why we can't consider these
columns ofsamefrequency components to befunctions in their own right,
but before we willy-nilly start taking transfonns in the vertical direction we
need to look at what, exactl� these verticalfunctions represent. Consider
the left-most column of Fig. 13.3 for example (i.e., the zero frequency
components ofthe horizontal lines). These particularcomponents represent
the average value of the intensity of each line.
I
This is, in fact, a single funclion-a two-dimensional funclion-so we need a true
two-dimensional transfonn.
160 Chapter 13

13.2 THE TWO-DIMENSIONAL TRANSFORM

The zero frequency component is obtained by adding all the data


points of the horizontal line and dividing by Q (Q = number of data points
in a line). Now, this average value is a quantity that applies to the whole
line. If we reconstruct the data points of any horizontal line by summing
in the harmonics of its Fourier series, this average value is added to each
and every data point ofthe reconstruction. This average value is a quantity
representing the whole horizontal line; but then, when we think about the
other harmonics, their phasors represent sinusoids whose amplitudes are
also "constant" across the whole line. Each and every one of the sine and
cosine coefficients tell us the multiplied amplitude of that sinusoid across
the whole line. So, then, if we go down any of these columns (of specific
frequency), we obtain a function representing average values of the
horizontal lines. The left-most column, for example, is afunction which
tells us how the average horizontal picture line magnitude varies in the
vertical direction.
Now, each element of any
horizontal transform is a single
phasor, and when we consider a
vertical column at any frequency,
there's no reason we can't take the
Fourier transform of that column.
The transform of any vertical
I
column will apparently be another
Fig. 13.4 - 2-D Transform
frequency domain function-a
spectrum of constant amplitUde harmonics which may be combined to
reconstruct the vertical column again. That is, the components of each
vertical transform are sort of average values of the vertical lines of data,
which, in turn, are sort of average values of the horizontal lines of data.
We therefore successfully combine the horizontal and vertical information
of the original picture into each point of the 2-D transform. Theres more
(obviously), but thats enough for now. . . we 'll come back to this shortly.
Our immediate objective is to write a 2-D FFT program, and we have
already uncovered how to do that. This will not be difficult. We will use
our standard algorithm to take the row and column transforms of a two­
dimensional image (i.e., we will revert back to the version that includes
negative frequencies) for reasons that will become obvious.
Two Dimensional FFT 161

13.3 THE 2-D ALGORITHM

First, we must now dimension the arrays for two-dimensional data


(but notc that the twiddle factors are still only one-dimensional-we only
take the transform in one direction at a time):

20 D I M C ( Q , Q ) , s e Q , Q ) , KC(Q ) , KS(Q ) , DA1 ( Q , Q )

The old standby FFT routine is located at line 200, but to perform the
transform in 2-D we must take the FFT of both rows and columns. That
is, after performing all the horizontal transforms, we then transform each
column [note: when we do the inverse transform we must transform the
columns first-then the rows-but, we'll talk about that later). We need
two separate routines to handle these forward/reverse and row/column
requirements. The high-level forward routine (line 100) looks like this:
**********************************************
REM
* *
REM XFORM FUNCT I ON
**********************************************
REM
1 00 CLS : K6= - 1 : SK1 = 2 : XD I R= 1 : T9= T I MER ' XD I R : 1 = FWD , O = I NVERSE
1 02 GOSUB 200 ' DO FORWARD ROW X F ORMS
1 04 GOSUB 300 ' DO FORWARD COLUMN X F ORMS
1 06 T9 = T I MER - T9 ' CHECK T I ME
1 08 RETURN

We clear the screen, then set the sign constant K6 - 1 (for a =

forward transform}--the scale factor constant SKI 2 (again, forward =

transform}--the xform directionftag XDIR 1 and T9 gets the starting


=

time. At line 1 02 we jump to the row FFT routine:


************************************************
REM
* *
REM TRANSFORMS
************************************************
REM
200 CLS : KRTST = 1 9
202 FOR KR = 0 TO Q 1 ' XFORM 20 ARRAY BY ROWS
204 ' I F XD I R = 1 THEN GOSUB 400
206 P R I NT US I N G "###_ " ; KR; , P R I NT ROW # BE I N G XFORMED
208 I F KR = KRTST THEN P R I NT : KRTST = KRTST + 20' END PR I NT L I NE
I ***********************************

, * *
THE ROUT I NE BELOW I S FOR A ROW
I ***********************************

210 FOR M = 0 TO N 1 : QT = 2 A e N - M ) ' DO N STAGES


212 QT2 = QT / 2 : QT3 = QT2 - 1 : KT = 0
214 FOR J = 0 TO Q 1 STEP QT : KT2 = KT + l ' DO ALL FREQUENCY SETS
216 FOR I = 0 TO QT3 : J 1 = I + J : K = J 1 + QT2' DO ALL FREQUENC I ES I N SET
, ROW BUTTER F LY
2 1 8 CTEMP = ( C ( KR , J 1 ) + C ( K R , K ) *KC ( K T ) - K6*S ( KR , K ) *KS ( K T » /SK1
1 62 Chapter 13

220 STEMP = ( S ( KR , J 1 ) + K6*C ( KR , K )*KS ( K T ) + S ( K R , K )*KC ( K T » /SK1


222 CTEMP2 = ( C ( KR , J 1 ) + C ( K R , K )*KC(KT2) - K6*S ( KR , K )*KS(KT2» /SK1
224 S ( KR , K ) = ( S ( KR , J 1 ) + K6*C ( KR , K )*KS(KT2) + S ( KR , K )*KC( KT2 » /SK1
226 C ( KR , K ) = CTEMP 2 : C ( K R , J 1 ) = CTEMP : S ( KR , J 1 ) = STEMP
228 NEXT I ' ROTATE AND SUM NEXT PA I R OF COMPONENTS
230 KT = KT + 2
232 NEXT J ' DO NEXT SET O F FREQUENC I ES
234 NEXT M ' DO NEXT STAGE
, B I T REVERSAL FOR ROW TRANSFORMS
236 FOR I = 1 TO Q 1 : I NDX = 0
238 FOR J = 0 TO N 1
240 I F I AND 2 � J THEN I NDX = I NDX + 2 � ( N 1 - J )
242 NEXT J
244 I F I NDX> I THEN SWAP C ( KR , I ) , C ( KR , I NDX ) : SWAP S ( KR , I ) , S ( KR , I NDX )
246 NEXT I
248 ' I F XD I R = 0 THEN GOSUB 400
250 NEXT KR
252 T9 = T I MER - T 9 : GOSUB 1 76' SHOW RESULTS OF ROW XFORMS
254 AS = I NKEYS: I F AS = 1 1 1 1 THEN 254
256 CLS : T9 = T I MER - T9: RETURN ' ROW TRANSFORMS DONE

At line 200 we define a constant KRTST 19. This has nothing


=

to do with the transfonn but on larger arrays it may take a while to perfonn
a transfonn, and we need something to indicate the computer is still
running; therefore, the number of each row is printed as it is transfonned
(line 206). KRTST is used to control the printed line length (line 208).
We will explain why line 204 is presented as a comment shortly.
At line 2 1 4 we come to the familiar FFT routine. We process the
row of data as we would in any FFT, emerging from this row transform
routine at line 248, and looping back for the next row at line 250. When
all rows are transfonned we display the data (line 252) and then return to
the high level routine (line 1 04) [where we will immediately jump down
to transfonn the data by columns]. The difference between row and
column is the reversal of row and column addressing in the butterflys (lines
2 1 8 thru 226). The column routine is shown in the appendix (starts line
300).
There are differences, of course, in the routines to generate 2-D
data, plot the data, etc., but we discuss all of that in Appendix 1 3 . 1 (where
a complete listing is provided).

13.4 FUNCTIONAL AND OPERATIONAL CONSIDERATIONS

First of all, you will only be able to implement an array of 64 by


64 before you run out of memory. If you compile this program (setting the
/AH "switch" when starting QuickBasic™) you can extend this to 128 by
Two Dimensional FFT 1 63

128, but that's as far as you will be able to go in this Basic language
(without writing software to shuffle data back and forth to the hard drive).
The reason is that DOS has always been hamstrung by the original (in my
opinion poorly conceived) addressing scheme of the 8080 p.processot;
which basically provided for one mega-byte of memory. Today DOS
requires more than half of its one meg. When you load the application you
want to run (QuickBasic™ for example), that takes up a big chunk of
what's left, and the program you write in QuickBasic™ takes up another
chunk, and you wind up with only a few hundred kilo-bytes left over to
hold data. On my computet; when the program FFT l 3 . 1 is loaded and
running [you can add the line of code PRINT FRE(- 1 ) both before and
after dimensioning the arrays], there is 329,960 bytes available for data
arrays (this number is affected by such remote things as the number of
BUFFERS in the CONFIG.SYS) file. Now, floating point (i.e., real)
numbers take 4 bytes of memory each, and we have two 2-D arrays of data
(one for the cosine component and another for the sine). There are also
two smaller arrays (Q quad-bytes for each twiddle factor array) and a
"spare data array" of QxQ quad-bytes, which adds up to:

Total memory = (2oQ2 + 20Q + Q2) 4 bytes.


°

= Q2 (3 +2/Q) 4 bytes == 1 2 Q2 bytes


°

IfQ 64 this will require 49,664 bytes; but, when Q 128 this
= =

demands 197,632 bytes. Q 256 requires 788,480 bytes so, if you want
=

to work with arrays larger than 128 by 1 28 pixels, you will have to resort
to more desperate techniques-sorry about that.
Execution times have become a moot point. Modem computers
are so fast that lousy system software doesn't matter for the above array
sizes. On a 500 MHz machine, you can do a 1 28 x 128 transform in about
1 0 sec; still, if we could see things clearly, we would see that, rightly, the
value of software (assuming it works) is inversely proportional to: 1 ) the
execution time, 2) number of keystrokes (or mouse operations) required to
perform its tasks and, 3) quantity of code. When we pay hundreds of
dollars for a piece of software, howevet; we want it to contain a lot of code
that takes a lot of time to load and run ... and the software companies oblige
us with stuff that's optimized primarily to make a profit.
The last thing we need to talk about is the frequency domain
arrangement that results from the conventional 2-D transform. In Figure
1 64 Chapter 13

1 3.4 we see the transform comes out in four heaps in the corners of the
plot.. .and some see this to be a gross distortion of reality. As everyone
knows, the negative part of the X axis should be to the left of zero while
the positive should be to the right (just as North should be up on a map),
and the positive Y axis should be above the X axis (East should be to the
right). As we all know, when we take the conventional transform, we get
the negative frequencies above the positive ones (Le., they are plotted to
the right of the positive spectrum) and, if you review the mechanism
described in Section 1 3.2 of this chapteJ; you will see how the negative
frequencies come out "right and below" the positive components-but
running in the wrong directions from each end. Now, if you can mentally
shift the quadrants around where they should be (the preceding comments
will be an immense help here), you will see the four heaps are really part
of the same thing-a single heap in the center (Fig. 1 3.5)'
Okay, we could go all the way back to the original DFT program,
write it such that the negative frequencies come out at the bottom, and then
develop our FFT algorithms to give the same results; but, that would be an
awful lot of (painful) work. There's anotheJ; relatively simple correction
that we can introduce here---one that will straighten things out.. ..
In Chapter 10 we noted that if the sampling pulse train was
composed of alternately positive and negative pulses, the required
sampling rate would then be equal to the Nyquist frequency in the signal
(Section 1 0.8). We also saw this eliminates the zero-order harmonics, puts
the negative frequency components in that space, and the positive
frequencies will therefore be above the negative frequencies. Now, if we
go through the data and negate every-other data point, we will have
accomplished this sort of 1 : 1 sampling-and transforming this data will
then yield a spectrum with the positive and negative frequencies in correct
relative position. Ifwe take the sampling frequency as the zero frequency
in this 1 : 1 modulation scheme, everything will work-out in our graphics.
, ****************************************

, * *
MOD I FY ROW SAMPL I NG
, ****************************************

400 FOR I = 1 TO Q - 1 STEP 2


402 C(KR, I ) = -C(KR, I ) : S(KR, I ) = -S(KR, I )
404 NEXT I
406 RETURN
I ****************************************

, * *
MOD I FY COLUMN SAMP L I N G
I ****************************************
Two Dimensional FFT 165

410 FOR I = 0 TO Q - 1 STEP 2


412 C ( I , KR) = - C( I , KR ) : S ( I , K R ) = -S( I , KR)
414 NEXT I
416 RETURN

We will need to add code in the transfonn routine to jump to these routines
before perfonning the transfonn-we need to modify the sampling prior
to perfonning the FFT:

204 I F XO I R = 1 THEN GOSUB 400

We also need to add this prior to each column FFT:

304 I F XO I R = 1 THEN GOSUB 4 1 0

Ifwe are doing aforward transform we jump down to the modify sampling
routines but we must perfonn the reverse modification on reconstruction.
Furthennore, when we reconstruct the signal, we must perfonn the inverse
transfonn before we modify the sampling-that will properly undo what
we did during the forward transfonn. The lines of code required are:

348 I F XD I R = 0 THEN GOSUB 4 1 0

On reconstruction we undo the columns first. Also note that, i n either case,
we use the same routine-negating every other data point twice yields the
original data. We then add the final undoing of the data:

248 I F XD I R = 0 THEN GOSUB 400

which should get us back to the


original fonnat of the input data.
You can add these lines of code to
the program of Appendix 13. 1 by
simply removing the apostrophe
before the lines noted, and the
Fig. 1 3 . 5 - Modified Sampling
transfonn will appear as in Fig.
1 3 . 5-as opposed to Fig. 13.4.
CHAPTER XIV

TRANSFORM FAMILIARIZATION

14.0 INTRODUCTION

In this chapter we delve into the nature of the 2-D transform. We


pick this up where we left off in the middle of the previous chapter; and
will find that, for the most part, the nature of the 2-D transform is just as
intuitively obvious as the I -D transform. Nonetheless (as you probably
suspect), there's enough novelty to make this interesting-even fun.

14.1 THE 2-D HARMONICS

Now, as we said (Section 13.2), when we take the transform of the


horizontal rows, the zerofrequency components are obtained by summing
all the pixels in the row and dividing by Q, which represents the average
value of the function. So, when we take the transform (going vertically)
of all the zero frequency components (i.e., the left-most column of the
horizontal transforms), we obtain another spectrum of frequency
components. The zero frequency component of this vertical transform will
be the summation of the zero frequency data points of all the horizontal
transforms (i.e., a summation of the average values of the honzontal rows)
divided by Q (again). This zero frequency component is the average value
of all the pixel\'-the average intensity of the whole picture-it is the "zero,
zero" component of the 2-D transform.
Okay, the zero, zero frequency represents the average intensity of
the picture, but what about the other harmonics of these vertical transforms?
Well, take a look at Fig. 14. 1-this is the digitized data of a picture of
horizontal sinusoidal "bars" (with
the sinusoids running vertically).
Now, each horizontal FFT will only
see a constant value, so there will be
no real sinusoid components-only
the zero frequency-the "average
value." The horizontal transforms Fig. 14. 1 - Vertical Sinusoids
will yield the data shown in Figure
Transform Familiarization 1 67

1 4.2. This is very interesting! It


shows that the average values of the
�WW'I''
IN:"' '�---''''t\\\\!�" horizontal rows vary in a sinusoidal
pattern! Who would have guessed?
And what will the vertical transforms
yield?
Fig. 14.2 - Row Transforms
In Fig. 14.3 we see the final
"2-D" results of the transform for Fig. 14. 1 . There were three cycles of the
sinusoidal horizontal bars and, sure enough, there is a single component at
the 3rd harmonic (and, of course, its negative frequency counterpart at
the other end ) . Now, we have
discussed how the vertical FFfs take
the transform of the horizontal
average values, and here we see
what that means. If you have a
vertical sinusoidal pattern in your
picture it will show up as a pro- Fig. 1 4.3 - 2-D Transform
nounced frequency component in the vertical zero frequency column of the
final transform. But we usually expect more than just vertically running
sinusoids in our art work, so let's continue our investigation.
In Figure 14.4 we have turned the pattern of Fig. 14. 1 by 90°. By
now the results of the row transfonns
of this data matrix should come as no
surprise. In Fig. 14.5 we see each
horizontal transform yields a zero
component and a third harmonic
component. Big deal, we could have
Fig. 14.4 - Horizontal Sinusoids predicted that by inspection. Simi-
larly, there's no variation along any of these columns, we will only get zero
frequency components in the vertical
transforms. Indeed, Figure 14.6 shows
that is precisely the case. Horizontal
sinusoids have 2-D transforms com­
posed o f a zero, zero frequency
U
component (i.e., the average value of tr.�;........
.. ..
the picture), and a zero, nth harmonic Fig. 14.5 - Row Transforms
component at the frequency of the
sinusoid.
168 Chapter 14

Apparently, the zerofrequency rows


and columns of a 2 - D transform
indicate perfectly horizontal and
vertical sinusoidal patterns in the
picture. . . . But what about all the
other components-the ones that
are not in a zero frequency row or Fig. 1 4.6 2-D Transform
-

column (i.e., the vast maj ority of


the harmonics)? Well, we just saw that the zero frequency column implies
there is no variation of the signal across the row, while the zero frequency
row implies there's no variation of the signal along the column; so, right
away we would suspect the components to the right of the zero column,
and below the zero row, would vary in both directions. Components in the
1 st column (to the right of zero) imply a single cycle of signal across the
row (indeed. thats what Fig. 14. 6 shows us). Components in the 1 st row
imply one cycle of signal down the column (e.g. . Fig. 1 4. 3) .
S o , suppose we generate
the same three cycle pattern used in
Fig. 1 4. 1 , simultaneously making it
vary by three cycles across the row.
In other words, we sort of combine
the patterns of Fig. 14. 1 and 14.4 as
Fig. 14.7 - 3 x 3 Sinusoids
shown in Fig. 1 4 . 7 . [Note: this
two-dimensional sinusoid is the sum oftwo variables:

f(S) = Sin2(1r(3x + 3y))

which results in a diagonal pattern ofFig 14 7. Note that there are 3 sine
waves clearly visible on both the x and y end patterns]. The horizontal
transforms (Fig. 14.8) come out pretty much as we expect. [Note: we have
fudged this resultfor the row trans­
forms by showing only th e sine
component (to illustrate ourpoint).
The actual magnitude of any row
transform is the RSS of both sine
and cosine components which yields
Fig. 14.8 - Row Transforms a constant magnitude for the col­
umn of3rd harmonic components.]
Transform Familiarization 169

So, all of the components


in a 2-D transform (other than the
components in the zero column or
row) imply sinusoids oriented at an
ang l e to the x and y axes . The
frequencies of the components
along the x and y axes detennine the
number of cycles along those axes. Fig. 14.9 - 2-D Transform
It should be apparent that this is the same interpretation of the 2-D
transform given in Chapter 1 3 . The implication here, as in the I -D
transform, is that we can reproduce any real picture via a summation of
these 2-D sinusoids. [The textbooksprove this. ofcourse. but lets not be
too dense here. If the horizontal transforms can reproduce the row data
and the vertical transforms can reproduce the horizontal transforms. we
can surely reproduce the picture: however, we have just seen that any one
of the 2-D components reconstructs to a 2-D sinusoid. . . .} We will give
another illustration of this mechanism a little later; but, at this point, you
should be confidently aware that you know precisely how to generate any
one of the 2-D harmonics and, conversely, exactly what any one of the
harmonics will produce in the reconstructed picture.

14.2 THE VERY DREADED SINC2 FUNCTION

[We used the conventional display for frequency domain in the


previous section (i.e . negative frequencies to the right of the positive ones)
so we could draw on our familiarity with the I-D transform. We now
change back to our modified 2-D algorithm and display the frequency
domain as shown in Figures 14. 10 and 14 II (i. e., with the 0. 0 frequency
at the middle ofthe chart) We no longer use the 1 · 1 sampling technique,
however-we use quadrant switching as explained in AppendiX 14. I}
So, the 2-D transform is not really different from the transform
we have been studying-we have only extended its application to a second
dimension. We would expect most of the considerations we have discussed
so far to carry through to this extended application; however, we also
anticipate significant differences in the 2-D phenomena-and we need to
be aware of these differences. One prominent example is the ubiquitous
sincfunction we have discussed so extensively. We have included the 2-D
version in the Function Generator sub-routine, and if you select that
170 Chapter 14

function, you will obtain the image we exhibited in Fig. 13.2B.


The transform of the sin� function is shown in Fig. 14. 10 (which
is the same transform shown in Figures 1 3.4 and 13.5). So, what's the
significance of this vaguely familiar function? You recall, in Chapter 1 0,
we found the sinc function was generated (as sidebands) on every
transform that begins and ends abruptly (i.e., almost every OFT! FFT).
That is, the sinc function is the transform of a rectangle function, and since
a rectangle necessarily multiplies all time domain data we analyze, its
transform is convolved with the frequency domain data. [As you also
recall. we don t see the sinc function in the conventional transforms
because it happens to go to zero at every data point; nonetheless. we know
if we look between the data points of a conventional transform we willfind
it there In short. if we abruptly truncate the time domain data (as in a
fractional frequency transform) we see the sinc function in the frequency
domain. and when we truncate the data in the frequency domain (a la
Gibbs phenomenon) we get a sinc function in the time domain.}
Very well then, in our present case we are dealing with two­
dimensional functions, and we might imagine that a sinc function would
still be generated in the transform domain for all functions that start and
stop abruptly. The problem here is that, in the 1 -0 FFT the ever-present
sinc function results because we implicitly multiply the time domain
function by unity over that part of the signal we analyze (and zero
everywhere else). That is, we don't
change the amplitude of the signal
inside the aperture-we multiply
every data point by unity. [In the
..",,4.:
illustration above, however, we
generated the 2-0 sinc2 in the space
Fig. 14. 1 0 - 2-0 Xform
domain because, as we shall see, it's
the frequency domain that's bounded.]
Now, as any fool can plainly see, the problem here is that the sine
transform (Fig. 14. 1 0) is not flat in the frequency domain! It peaks at the
zero, zero frequency and then rolls off until it comes to the limiting
aperture where it dives into oblivion; but multiplication by a rectangle is
only implicit! It only comes about because real data always has a
beginning and end. The sinc2 function transforms to something that looks
like a "kiss" from Hersey, PA. .. and that's obviously not what we're talking
about.
Transform Familiarization 171

14.3 THE VERY VERY DREADED BESSELl FUNCTION

We want a function that doesn't distort the signal within the


aperture, we need a function that multiplies all frequencies equally until we
come to the boundary of the aperture-some function that multiplies all
harmonics within the aperture by
unity (and by zero outside)-it
being more or less obvious there ........
must be a function that does this. ,"'\�.. .
If you are familiar with
optics you know that the function Fig. 1 4. 1 1 - Bessel Function
we seek does indeed look like the sine shown in Figure 13.2; but, there are
a lot of functions that have this
general appearance. One prominent
candidate is the Bessel function (of
the first kind of zero order). From
a casual glance it looks a great deal
Fig. 14. 1 2 - Bessel Xform like the sinc2 function and its trans-
form is much closer to what we desire (Fig. 14. 1 2); but, it's still not
perfectly flat across the aperture-it's still not precisely what we want.

BESSEL II

Nothing less than a perfectly flat-topped function will do; but how
shall we find it? Well, we know how to generate individual harmonic
components-we learned how just two sections back using sinusoidal bars.
We can use a technique similar to
the one we used back when we first
discussed Fourier series, and write a
routine to sum sinusoidal bars at the
frequency components where we
want them-and leave zeros where
we don't. That's how we do it in Fig. 1 4. 1 3 - Bessel II Xform
the Bessel II routine in FFT 1 4.0 1 .

I Fnedrich Wilhelm Bessel ( 1 784-1 846), a contemporary and fnend of Gauss.


Bessel was the first to measure the distance to a star (61 Cygni) using parallax due to the
Earth's orbit about the Sun He made many other significant conlnbutions to astronomy,
however, he is probably best known for these radial functions.
172 Chapter 14

You will note that Fig. 14. 1 3 is indeed what we are looking for (it could
hardly be otherwise), but is Fig. 14. 1 4 what we see in our telescopes?2
[Note: This is not the best way to generate this particularfunction-it just
illustrates that we can create a modestly complex picture by piecing
together sinusoidal bars (see discussion p. 169 and Bessel II in Appendix
14. 1). This is obviously a legitimate interpretation ofthe 2-D transform.]
There's a much easier way
to find this aperture function. We
can simply generate a constant
amplitude function over the desired
aperture in the frequency domain,
take the inverse transform, and­
Fig. 14.14 - Bessel II
voila! We have also included this
in our function generator sub-routine (Bessel III). It's easy to generate,
illustrates the same thing as all those 2-D sinusoids, and represents what we
really want. [At this point you should probably load program FFTl4.01
into your computer and experiment with these functions a little.]

14.4 ANOTHER IMPORTANT 2-D FUNCTION

There's one last function we reflective


surface
need to consider in this development
o f the aperture function-the star
(i.e., impulse function). Stars are so
distant they make excellent optical
p o i n t s o u r c e s . From s u c h great
distance all of the rays of light arrive
angle of reflection =

virtually parallel, and they serve very angle of incidence


well to t est such things as a tele­
scope's primary lens (i.e., objective). Fig. 14. 1 5
Geometrically, i f the surface of a Gregorian obj ective has a perfect
parabolic form, and all the rays falling on the objective are parallel, they
will converge to a single point. This would be an equal intensity
illumination (via parallel rays) across the whole surface of the objec­
tive-and the lens transforms this equal intensity illumination at its

0ne way to see this is to cut a small hole in the lens cap of your refracting
2

telescope (using, for example. a leather punch) and project a laser beam (expanded to a I "
to 2 " diameter) onto this "stopped-down" aperture. The bright spot at the center o f this
pattern is know as the Airy disk (for Sir George Biddell Airy, 1 80 1 - 1892). It's amazing
how few people have actually seen this pattern. but you can purchase a "key-chain" laser for
about $ 10.00 (target the discount stores---8utomotive accessories-{)r Edmund Scientific).
Transform Familiarization 1 73

aperture to a point at the focal plane . . . and from all our foregoing
discussions we recognize this point to be a 2-D impulse function. Now,
from our earlier discussions of impulse functions, we know their
transforms are constant amplitude cosine harmonics, and you might
anticipate that the 2-D transform of this star function (i.e., impulse
function) will generate perfectly equal amplitude harmonics across the
whole 2-D frequency domain. That is, the Fourier transform of this star
is very much like the relationship between the image created by a lens and
the equal intensity parallel rays that fall on the lens aperture . . . we'll
certainly have to discuss this further!

14.5 2-D SIMILARITY

It's an interesting exercise to generate a series of increasing


diameter apertures and observe the 2-D similarity theorem on reconstruc­
tion (using the Bessel III functions). The image expands and contracts
inversely proportion to the expansion and contraction of the frequency
domain aperture (as we all surely expected); however, in this 2-D version,
we need to point out explicitly what this means for an image. If a star
function is nothing more than an impulse function-a single data point­
and the transform of this point is a completely flat spectrum, then if we
limit the aperture (in the frequency domain by zeroing-out all of the
components beyond some arbitrary radius) we will have the very same
frequency domain function that we used (see Fig 1 4 . 1 3 on p. 1 7 1 ) to
generate our Bessel III function.
So, then, if we start with a point source, transform to the
frequency domain, limit the aperture, and transform back to the space
domain, we will have turned our point into a Bessel function! Further­
more, the smaller we make the aperture, the more spread-out the Bessel
function becomes!
Here we must point out that, when we limit the aperture in the
frequency domain, we are doing the same thing we did when we illustrated
the Gibbs Phenomenon-----{)r the problems associated with oversampling
-we are looking between the pickets of the picket fence again! In this
case, where we are dealing with a 2-D transform, we find the summation
of sinusoids (i.e., the mechanism of the FFT) yields a variation on a Bessel
function (as opposed to the familiar sine function of the I-D transform).
In real optical systems, the image we get from finite aperture
objectives is indeed limited by this Bessel function-we are doing the same
thing in both cases (see footnote opposite page). We will discuss this in
greater detail in the next chapter
CHAPTER 1 5

INTRODUCTION TO FOURIER OPTICS

Geometric Optics is based on the fact that light travels in straight


lines (see Fig 1 4. 1 5 ) with the notable exceptions that it is bent by
transparent media (e.g., it's refracted by wateI; glass, the atmosphere, etc.)
and also reflected by smooth surfaces. Now, as we examine phenomena
such as refraction and reflection (and especially image formation) it
becomes apparent we don't really understand optics until we understand the
wave nature of light-and as we study the mechanics of these phenomena
via waves, we discover an astonishing relationship to the Fourier transfonn.

15.1 WAVES

When a wave rolls in to the shore it propagates only in the


forward direction. We might guess that the forward motion of the wave
is due to the weight of the water piled up at the crest trying to fall back
down to the level of the surrounding sea, +- motion ofwal'e

but this falling-down process never quite tJ -' ytl

ends-apparently something in the


crest .-/"J
propagation mechanism continues to pull
water upward into the oncoming wave ::---::.._
and, even though the wave propagates motion of
water molecules
forward, the piled up water falls down
the b ack side of the wave. We will not go into this particular
phenomenon here but, ratheI; consider a peripheral characteristic.
Now, surely, the water that's raised up to
the crest of the wave experiences a gravitational
force downward, and the only thing that keeps
this water from falling down in the side-wise
direction is the countering force generated by an
equal height of water to each side of any point
along the wave's crest. In fact, if a wave passes
through an opening in a sea-wall, for example, we
find that water does indeed start falling down in
a sidewise dIrection at each end of the wave (after
passing through the opening), and this is the
mechanism we will consider
Wave Optics Mechanism 175

As the opening in our sea-wall is made


smaller we come to a limiting case-the wave
propagates beyond the hole with a circular wave
front. The great Christian Huygens (hoi'-gens or
hi'genz(?)- 1 629- 1 69 5 ) recognized that, if the
principle of superposition holds, then every point on
a wave front may be considered as a source of these circular propagating
waves. For waves of reasonable breadth, the symmetry
of these side-by-side point sources will cancel out the ic-------ir.t-/-;;\­
side-wise propagation, leaving only a forward propagat- k-"'"---t'rt:f
ing wave; howeveI; at abruptly ending boundaries the I<-"",,<-�--:,-I�H
asymmetry exposes the sidewise, circulaI; propagation.
This viewpoint helps explain the phenomenon of
difJraction-a form of interference.

15.2 INTERFERENCE

If two waves propagate through the same region, there will be


places where the crest of one wave coincides with the trough of the other.
At these places the crest will cancel the trough (i.e., the resultant water
level will neither be high nor low) and the
effect of gravity will be nullified. We might
imagine that once the two waves cancel,
propagation would terminate; howeveI; that's
not the case. The two waves do indeed
cancel where trough and crest coincide, but
farther along we find both waves propagating
just as they did before. · Clearly this phenomenon wouldn't take place if
superposition didn't hold for propagating waves. Furthermore, any time
we observe an interference pattern we might well imagine it's a
phenomenon arising fro m an underlying wave motion ( i . e . , the
interference pattern of two superimposed light waves strongly suggests
that light propagates as waves.2)
·
Waves are not simply static variations in the height of the water, but dynamic
interchanges ofpotential and kinetic energy. The phenomena of superposition/interference
clearly expose this dynamic charactenstic.
2
The cycling ofpotential energy (e g , the height of the water in a gravitational
field), and the cyclical reversing of kinetic energy (e g., the back and forth motion of water
in the wave) are, as abstract phenomena, the fundamental charactenstic of all wave forms.
176 Chapter 15

1 5.3 REFRACTION AND WAVEFRONTS

Refraction is the phenomenon of light­


bending at boundaries of transparent substances.
This is due to the change of velocity as light
moves from one material to another (and the
wave nature of l ight). To understand this
phenomenon we must clearly understand the
concept of a wave-front.
If you consider the cross-section of a
key-chain laser beam as it propagates across
the room, you will have the basic idea of a
wave-front. That is, light propagates like the
waves you make on a garden hose when you
shake one end up and down, but since the
beam has a finite cross-section we must think
of many ropes (in parallel) all carrying waves.
All of these sinusoid elements combine to
r. form a single wavefront.
wave-front
Fig. 1 5.6 Wavefront
-
Now, in a laser beam, all of the wave
elements are in phase, and the beam propa­
gates directly forward. If the beam strikes a plate of glass at an angle,
however, the bottom of the beam
strikes first, and progressively higher
parts of the wavefront strike the glass
.---����---.
at progressively l ater times ( and
points). Since light moves slower
through glass (than air) the bottom of
the beam (in glass) will slip behind '-------���'_r"'�+--R
the parts of the beam that are still
propagating in the air, and the phase
of the wave front is successively advanced as it passes into the glass.
We note that the direction of propagation remains normal (i.e.,
at right angles) to the wavefront (as we might anticipate from Huygen's
point source/superposition principle). This concept of a wavefront, while
reasonably obvious, is important-it will play a prominent role in our
following discussions.
Wave Optics Mechanism 1 77

1 5.4 DIFFRACTION

Now, there's a particularly revealing fonn of interference that


arises when a single beam of light passes through an aperture (not unlike
the illustration of water waves passing through a gap in a sea wall). If
you project your key-chain laser beam through a slit you will find an
intensity pattern (projected beyond the slit)
of a sinc functions (see Fig 1 5 . 1 7, p. 1 83).
This single beam interference is known as laser beam\
diffraction and it comes about as follows: _"'l=t"""'l:::'"

By Huygens' model we know each


point on a wavefront radiates forward ornni­
directionally. We know in the near-field the sidewise components of
radiation will cancel; but, recognizing
a'
that superposition must hold, it's

�b :�c, eventually become separated from the


a b'
---,,-t- t apparent wave motion at an angle must
__ _ _

----L-:rt""� forward moving beam. Now, light


Sin(9) = AID
radiated directly forward will surely
move forward as we intuitively imag-
Fig. 1 5.9
ine it would; but, when we consider
radiation at an angle (i.e., other than perpendicular to the plane of the slit)
things are not exactly simple. We must look closely at Huygens model
to appreciate this effect: at some angle 0 to the aperture nonnal, we have
a geometry as shown in Fig. 1 5.9. If we examine the
rays moving at the angle 0 we see that the phase along
c-c' is delayed by one wavelength (}.) relative to the --r-...Jt-
--'---<lr--
--­
phase along a-a'. Obviously, the phase along b-b' is --�r­
3
delayed by >V2. In fact, if we consider small incre­
---I-r
ments across the wavefront moving at the angle 0 (Fig.
1 5 . 1 0) we see that the phase along b4 must be half a --'---.r-r
wavelength out of phase with a4, as is the phase
between b3 and a3, etc., etc. That is, every increment
across the wavefront will have an increment that is Fig. 1 5 . 1 0
exactly out-of-phase half a slit width (i.e., D/2) away. I f all these out-of-
3
With a laser the light is in-phase across the wavefront as it exits the slit. For
the ray at c-c', then, light from a Huygen's point source radiator must travel farther to the
wave front that is normal to 8 (than the ray at a-a')
1 78 Chapter 15

phase wave front increments are summed together at a point in space, the
result will be an interference null (it's an interesting exercise to complete
this laser/slit/diffraction illustration) .... 4

1 5.5 LENSES AND IMAGE FORMATION

In the previous chapteJ; we noted the function of a lens is to


cause all parallel rays (entering the aperture of a lens) to converge to a
point. From our discussion of refraction it's more or less obvious that,
if we grind and polish a piece of glass -:::::;:;=-,
; 1...[\
to the correct shape, we can make apeplrt... ..e

parallel rays striking the glass bend in �-�--l



. - / 100( 9 )
such a way that they will converge to a 49�::::::

point. If we do this for rays that are

the same thing will happen (pretty .pert· I+


I. 1
.. ....

/
__
_
�___

nearly) for rays that are only slightly


misaligned with the optical axis.5 In Fig. 1 5. 1 1
fact, parallel rays entering the aperture will converge (approximately) at
a position equal to the tangent of the angle of those rays times the focal
length of the lens (see Fig. 1 5 . 1 1). As we also noted, parallel rays are the
sort of thing we receive from a distant "point" source (e.g., a star). Now,
we can extend this illustration by considering a cluster of stars (e.g., the
Pleiades-the star cluster named for the fabled "seven sisters" of
mythology depicted in Fig. 1 5. 1 2). 6 If we focus our telescope on this
cluster the parallel rays of light from each star
will enter the aperture at a different angle and
converge at the points shown. We point out
again that superposition holds here-the light
coming from each star may pass through the
lens simultaneously and still be focused into its
Fig. 1 5. 1 2 Pleiades
proper position in the image (we emphasize this
-

4
That is, as we have left this explanation, the 8 directed wave front increments
are not supenmposed. Light, however, is leaving the slit at all angles, of course.
5Known as paraxial rays.
6
The Pleiades were the seven daughters of Atlas, the nymphs of Diana (Jupiter
turned them into a constellation to aid their escape from Onon); but, we only see six stars
The Pleiad Electra left her sisters, unable to gaze upon the fall of Troy, which had been
founded by her son Dardanus (this stuff is important so let's get it nght)
Wave Optics Mechanism 179

superposition holds for light rays at different angles! All rays at the same
angle, regardless of where they enter the aperture, will focus into the
same image point)! Note that each bundle of rays at any angle will have
a wavefront (Fig. 1 5 . I l )! The light from each star in the Pleiades will
enter the aperture as a wavefront slightly tilted from the others.7 Let's
also point out that, as two points come closer togetheI; their wavefronts
approach the same angle, and tend to be focused into the same image
point-we will discuss this in more detail shortly.

15.6 THE 2-D FFT AND IMAGE FORMATION

I n FFT 1 5 . 0 0 w e h ave a
function generator that generates a
single star (impulse) which may be
p l aced at any p o i n t in the image
domain. We will consider a point on
the optical axis for our first example (i.e., at position 0,0 in the image
domain). Now, from our discussion
. of impulse functions (back in Ch. 1 0,
pp. 1 20- 1 2 1 ) the row transfonn of a
single star, being an impulse, will
g ive us a flat spectrum of cosine
phasors. Now, when we do the vertical transfonns, all of these equal
amplitude cosine components will
themselves transfonn as if they were
impulses, and w e w i l l get a 2 - D
matrix of equal amplitude cosine
hannonics. Furthennore, we know
the magnitude of the impulse must be
equal to the square of the magnitude of each hannonic.
Let's now consider stars that are not on the optical axis. As we
know, if we shift the position of our star along the row, the phases of the
harmonics will shift proportionally. That is, we will still get the same
equal amplitude components in the frequency domain, but now they will

7
This illustration is just a limited example of all image fonnatio�very point
on the surface of illuminated objects is a point source of light. Note carefully that the
infonnation here is not simply the light, but the location and intensity of the light-the
infonnation is the spatial modulation of the light!
180 Chapter 1 5

be phase shifted (proportional to the amount of the position shift and


harmonic number). It will be easier to demonstrate the impact of this
effect in the 2-D transform than to try to explain it.
We have provided a routine (in FFT l S.00) to print out just the
phases of the 2-D transform. We know the magnitude of harmonics
remain constant as the position of the impulse is moved about in the
image, so phase is all we need to observe. In the table below we show
the phases of the harmonics when the impulse is on the optical axis:
Co l . a
0 . 00 0 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
Row a 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000

As we expected the phases of all the harmonics are zero-these are all
cosine components. If we now shift the star one position along the row
the phases of the harmonics will be as shown in the table below (their
amplitudes remaining constant). We only show the first three rows and
columns about the 0, 0 axis but this is sufficient to show what we need
to know. Note that all the phase shifts are the same across the rows.

- 1 6 . 875 -11 . 250 - 5 . 625 0 . 000 5 . 625 11 . 250 1 6 . 875


- 1 6 . 875 -11 . 250 - 5 . 625 0 . 000 5 . 625 11 . 250 1 6 . 875
- 1 6 . 875 -11 . 250 - 5 . 625 0 . 000 5 . 625 11 . 250 1 6 . 875
- 1 6 . 875 -11 . 250 - 5 . 625 0 . 000 5 . 625 11 . 250 1 6 . 875
- • • • • •

- 1 6 . 875 - 1 1 . 250 - 5 . 625 0 . 000 5 . 625 1 1 . 250 1 6 . 875


- 1 6 . 875 - 1 1 . 250 - 5 . 625 0 . 000 5 . 625 1 1 . 250 1 6 . 875

In the next table we show the phase shifts of the harmonic components
for a shift of one position along the column.

- 1 6 . 875 - 1 6 . 875 - 1 6 . 875 - 1 6 . 875 - 1 6 . 875 - 1 6 . 875 - 1 6 . 875


- 1 1 . 250 - 1 1 . 250 - 1 1 . 250 - 1 1 . 250 - 1 1 . 250 - 1 1 . 250 - 1 1 . 250
- 5 . 625 - 5 . 625 - 5 . 625 - 5 . 625 - 5 . 625 - 5 . 625 - 5 . 625
0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000 0 . 000
5 . 625 . 625 5 . 625 5 . 625 5 . 625 5 . 625 5 . 625
1 1 . 250 1 1 . 250 1 1 . 250 1 1 . 250 1 1 . 250 1 1 . 250 1 1 . 250
1 6 . 875 1 6 . 875 1 6 . 875 1 6 . 875 1 6 . 875 1 6 . 875 1 6 . 875

We get the same results except the wave front now tilts in the vertical
direction. Perhaps you're beginning to see where this is heading; so, let's
stop skirting the issue and come directly to the point!
Wave Optics Mechanism 181

15.7 THE FOURIER WAVEFRONT

In the one dimensional transform we do not, in general, suppose


the harmonic components exist in some obscure frequency space, but
recognize that the harmonics are simply superimposed on each other in
the time domain to generate the time domain signal itself. Indeed, that's
the interpretation we have placed on the 2-D harmonic components in the
previous chapter-they are simply 2-D sinusoids that are superimposed
in the image. Be that as it may, we are now about to propose that, in the
2-D transform, there is another interpretation of the frequency domain­
one in which the transform harmonics do indeed exist in another place.
This transform space, however, is no recondite, ambiguous or obscure
place-no 5th dimension or hyperspace. This transform domain is still
the 3-D space we normally live in, but a different region of that 3-D
space than where the image exists. Let's investigate this new viewpoint.
Back on Page 1 76 we discussed a particular view of an optical
wavefront . We then saw how we could change the direction of
propagation by progressively slowing the sinusoidal elements of this
wavefront (i.e., refraction), and how diffraction came about when these
elements interfered with each other. Now, we have just seen how any
pixel in an image (i.e., an impulse function) transforms to a function of
equal amplitude sinusoids, and how the phases of these sinusoids depend
on (and determine) the position of the pixel in the image (see previous
page tables). Note that the picture presented by these tables are exactly
what we described as the tilted wavefronts entering a len s ! The
uniformly changing phase shift across the transform plane is precisely
what we described as a tilted wavefront entering a lens, or the self
interfering wavefront generated when light passes through a slit. The
transform of any pixel is a matrix of phasors (i.e., sinusoidal elements)
which describe the wavefronts shown in Figs. 1 5.6, 1 5 . 1 0 and 1 5. 1 1 .
But, even though the transform of any pixel corresponds to an optical
wavefront, the routes by which we arrive at optical wavefronts and
transform planes are quite different! Are these really the same?
First of all, in the FFT we do not deal with light, but with the
spatial modulation of light...let's look at this carefully. A lens bends the
parallel rays of light entering the aperture in such a way that they
converge to a single point in the image; but, in the FFT we derive the
transform (i.e., the spatial frequency version of the aperture plane) by
182 Chapter IS

extracting different frequency components from the image. It's not clear
at this point why these two processes arrive at the same end result, or
even that the results are really the same. We must keep in mind that the
FFT is not modeling the physical mechanics of an optical system-it's
describing another process, another mechanism; nonetheless, these
mechanisms are so intimately connected they corresponds to the same
thing. That is, under the supposition of a sinusoidal basis function (i.e.,
waves) for both light and the Fourier transform, things like diffraction
and refraction through a lens are equally captured by both processes. A
specific example might be of help here:
The components near the outer periphery of a transform are the
high-frequency components which provide sharp definition in the image,
but it's not clear that rays through Tnuronl plan. H,.. tnq ..cy .

• CO.poMIIb
the outer periphery of an aperture
contribute more to sharpness and .,;8i--=1H-l=:=-­
definition than rays on the axis.
Are these really the same?
As the Airy disk grows
oport .. _
.
smaller, definition and sharpness
increase. A careful review of Figs.
1 5.9 and 1 5 . 1 0 will reveal that as the aperture increases, the angle of the
null point decreases, and the diameter of the Airy disk decreases. Now,
we can surely write an equation for the diameter of the Airy disk vs. the
diameter of the aperture (see Fig. 15.9}--and just as surely we can find
an equation for the highest frequency component resolvable for a given
size Airy disk, and by combining these we can show that the high
frequency components in an image are indeed equivalent to (i.e.,
dependent on) rays passing through the outer periphery of the aperture
(i.e., the size of the aperture).
Still, we are only showing an equivalence between the two--we
are interpreting the Fourier transform in two different ways. The rays at
the outer periphery of the aperture are equivalent to high frequency
components of a 2-D Fourier transform. One is dependent on the other.
The Fourier transform models the light modulation at the aperture.8

8
you may not find it easy integrating all of the pieces we have discussed into this
magnificent insight. but trust me, the mathematical exposition is no cake-walk either As you
know by now, these books are notfor dummies books, but if you have made it this far you
can surely handle this .. and it's okay to go back and review the individual parts
Wave Optics Mechanism 183

FOURIER DIFFRACTION

As a second example we have included a function in FFT 1 5.00


to illustrate diffraction. This routine allows the user to specify a slit
width (i.e., illumination pattern) which will transform nicely into the
diffraction pattern observed with our laser and razor blades. Note that as
the height of the slit illumination increases the height of the diffraction
pattern decreases.9 There 's one special slit geometry you must try-a
square. Select an 8 by 8 square slit and you will find that diffraction
takes place in both the x and y axes (as you might have guessed). There
are a couple of special examples included in this routine-if you use slit
dimensions of 0, 1 a hex-shaped aperture will be generated, and when you
transform this function you will find a diffraction pattern displayed in
three axes. If you select a slit of 1 , 0 an octagon shaped aperture will be
generated, the transform of which not only shows four axes of diffraction
but also makes it apparent that, as the number of sides are increased, the
diffraction pattern begins to approach a circle!

RESOLVING POWER

If a lens is placed behind the aperture it's reasonably apparent


rays of a wavefront propagating in any direction will be focused into a
single point, and the superposition of the rays must yield a diffraction
pattern. Specificall)l for rays parallel to the optical axis (i.e., at 0 0°) =

all of the increments along the wavefront will be in-phase, and the light
moving in this direction will be unattenuated. As 0 moves to either side
of this forward direction, howevet; some of wavefront increments (as
illustrated in Fig. 1 5 . 10) will not be in-phase, and therefore the total light
intensity will be diminished. As the angle increases this attenuation will
become greater and greater until we
reach a null (as described on p. 1 77) r
when 0 equals sin· 1 (AID) where A and t
D are as shown in Fig. 1 5. 10. Note � �=:::;�-/::::::
:= :::"
:::::;7"""=:::""
this phenomenon arises because of the 8 •
Huygens point source model o f Fig. 1 5 . 1 7 - Diffraction Pattern
radiation from a wavefront and the
9
Those familiar with OptiCS will note that we are also working with the amplitude
function-not intensity
1 84 Chapter 15

summation of sinusoidal waves. Also note the similarity to the generation


of a sine function as shown in Table 1 1 .2 (p. 1 3 1 ).
The bright spot fonned by this diffraction phenomenon is called
an A iry disk,1O and determines the limiting resolution of any optical
system. Note that the size of the diffraction pattern and the image are
both proportional to the focal length of the lens; so, since both are
proportional the focal length, we don 't really gain anything (so far as
resolving power is concerned) by increasing the focal length of the lens
(i.e., the magnification is detennined by the focal length, but once we
reach a magnification that makes the Airy disk clearly visible, further
magnification yields no new infonnation). On the other hand, increasing
the diameter of the lens (i.e., the aperture) reduces the size of the Airy
disk, and is indeed the variable that controls resolution!

CONCLUDING REMARKS

We can't prove the equivalence of the wavefront at aperture


plane and the 2-D transfonn via examples, but proving such things is not
a major concern for us here. Proof is given in the advanced texts on
Fourier analysis (and none of us will ever forget those). We have seen
enough here to whet out appetite however. Understanding that the
transfonn domain takes us back to the unfocused signal at the aperture
causes the mind to race with the possibilities that might hinge on this
mechanism. Can we take an out-of-focus picture, transfonn it back to the
aperture, and then bnng it back to the image domain in perfect focus?
Can we, using the fractional frequency techniques we tinkered with in the
audio applications, do equally amazing things with images? The answer
is yes, of course, and in the next chapter we will explore the tip of the ice
berg concerning how some of this is done ... but just enough to help you
decide . . . .

IO
For Sir George Biddell Airy ( 1 80 1 - 1 892)
CHAPTER XVI

IMAGE ENHANCEMENT
CONVOLUTIONIDECONVOLUTION

16.0 INTRODUCTION

Convolution may be loosely described asjiltering. Now, filters


have been around a long time (finding the average or mean is essentially
a form offilter); still, most of us must advance to a certain level before we
realize we don't quite understand this phenomenon. I Phenomena such as
jiltering, in both mechanical and electrical engineering, are ubiquitous
today, leaving no doubt that, if we hope to understand this world we live
in, it's imperative we understand this relationship known as convolution.
So, once again, let's ask, "What is convolution-what does it do?"
We understand the meaning of multiplication, for example, as a simple
attenuation or ampl i fication of a s i gnal. I t 's easy to understand
multiplication of individual harmonics in the frequency domain; howevet;
it's not immediately obvious what the effect will be in the time domain
(especially when we multiply all the harmonics by some function). The
effect that occurs in one domain when multiplication is performed in the
other is convolution. The unique results imply the ultimate sinusoidal
nature ofthe signals multiplied, and the unique phenomenon ofside-band
generation when sinusoids are multiplied.
In the time domain, attempts to understand " overshoot and
ringing" (i.e., Gibbs phenomenon) in mechanical and electrical devices are
nothing less than dismaying. Surely the simplicity of multiplication in the
frequency domain is a much better explanation. The reality of frequency
domain functions is something our ears have been telling us about since the
invention of music-the reality of the frequency domain in optics is, today,
just as obvious. Convolution just might be the most profound thing Fourier
analysis has taught us in the last two centuries; so, let's see what we can
do with this newfound knowledge.
l
It's remarkable that many such phenomena were "invisible" only two centuries
ago. Poisson was skeptical of Fresnel's wave theory of light and, by showing it predicted
a bright spot at the center of a shadow, felt he had shown it to be incorrect (Arago saw this
conclusion was a bit premature, and took the trouble to investigate).
1 86 Chapter 16

16.1 OPTICAL TRANSFORM DOMAIN

Historically, imaging systems have provided an unending series


of world class puzzles. Just as soon as one puzzle is explained, someone
else points out even more puzzling phenomena, and the game is on again.
An aperture placed at a lens (Fig. 1 6. 1 )
1+-, Founer ...
will display its Fourier transform at the Lens Transforms

l o ca t i o n o f t h e image ( i f there i s no \
aperture proper, the diameter of the lens
will always provide one). So, if the lens is \
t
focusing an image at the location indicated Source Aperture
in Fig. 1 6 . 1 , we might (assuming the Fig. 1 6. 1 - Imaging System
imaging process is bilateral) suppose the
transform of that image will be found at the aperture. This being so, it's
apparent the transfonn of the image is multiplied by the aperture in the
frequency domain... and this frequency domain boundary implies an image
domain phenomenon very similar to the Gibbs phenomenon we know so
well! In fact, it's the source of the diffraction pattern we call the Airy
disk.

16.2 THE TRANSFER FUNCTION

Developing the notion of a transfer function will be helpful. As


is frequently the case, this advanced concept is really the simplest
imaginable relationship. It is the frequency domain output of a system
divided by its frequency domain input. If we dri ve a linear system with a
signal defined as:
A lf) = A Cos(27Tji) [for all .f]

then, as we know, the output will be a sinusoid of the same frequency


(modified only in amplitude and phase):
Blf) = B Cos(27Tji + cP)

The transfer function, then, is defined as:

Tlf) = !!JJl
Alf) ( 1 6. 1)
[The (f) in these equations, as usual, implies all frequencies in the signal.
An impulse function serves nicely for this evaluation, of course.]
Image Enhancement 1 87

Conceptually, this notion includes


anything and everything that linear A(f) 0-100'00' I 0 B(f)
systems might do to signals that pass
through. 2 This is just a very general � �
way of saying we want to talk about
whatever a system might do to a B(f) """
T(f) =
A(f) '-_\_ -
signal (e.g., low pass filter, amplify,
differentiate, etc.). Fig. 16.2 Xfer Function
-

So, if we know the input


function, and the transfer function, the output is then given by:

B(f) = A(f)T(f) ( 1 6.2)

This multiplication in the frequency domain is convolution in the space/


time domain-it's filtering-and to see the time domain signal we must
inverse transfonn this result.
The other beneficial use of transfer functions is this: when we
know the output junction, and either know the transfer function, or can
reasonably approximate its characteristics, we can find the original input:

B (f) = A(j) (16.3)


T(f)
This simple relationship describes de-convolution-our efforts to recover
high fidelity sound from old recordings for example. Something this
simple must work.. .let's look at a two dimensional example.

16.3 CONVOLUTION AND IMAGE RESOLUTION

The transfer function includes those things that modify the input
signal. If we have a perfect lens, for example, the transfer function will
include only the aperture function we just described. If, howevet; you're
using a cheap camera with a mass-produced, untested plastic lens-or you
get mud on the lens of the expensive camera you borrowed from a rich
friend-the transfer function will include a great deal more. In any case
the transfer function will multiply the image transfonn (Fig. 1 6. 1), and the
image will be the convolution of this transfer function with the object. So,
2
We understand, of course, that when we limit our discussion to linear systems
we disallow things like backlash, pump valves, diodes, logarithmic converters, etc.
188 Chapter 16

just as the aperture creates the Airy disk (yielding a less than perfect
image), lens aberrations degrade the result. When we deal with this sort
of problem it's a great simplification to think in terms of multiplication of
transforms in the frequency domain. Clearly, if the distortion is caused by
some action in the aperture plane (e.g., mud on the lens), the distorting
function will be convolved with the image and becomes part of the transfer
function. To remove this sort of distortion we must divide the frequency
domain function by the transfer function! In fact, if we knew the exact
equation for the transfer function we could exactly reproduce the input!
That's what Eqn. 1 6. 3 says! {Unfortunately. you can t divide by zero! The
aperture function multiplies everything outside the aperture by zero so
theres no way to get that portion of the input back... (sighJ.)

16.4 BRINGING CONVOLUTION INTO FOCUS

Okay, let's look at how, exactly, the


above procedure works. If the picture of your
girlfriend "came out" you will get something
like Fig. 1 6.3; but, suppose things didn't come
out this way! Suppose you really did get mud
on the plastic lens. {Note: the program for
this chapter, FFT16. 00, will actually peiform
the steps we describe in the following.}
We need to make an adjustment-
Fig. 16. 3 - Girlfriend
Figure 1 6.3 was cropped from a much larger
photograph (we needed a 64 x 64 pixel array for this illustration) and, as
you can see, we have a case of the "jaggies." We can make significant
improvements by oversampling and filtering (see Fig. 1 6.4). [Routines to
do this are provided in program FFT l 6.00].
Okay, we will simulate deterioration
of the image by first generating a Gaussian
function (using a function diameter of 2.0).
Transform this Gaussian function and save the
transform (under the Modify Transform sub­
routine). Next, load the picture of your choice
(our software is limited so it will have to be a
gray scale, * .BMP format). Transform the
Fig. 1 6.4 - Improved
picture and then multiply the transform with
Image Enhancement 189

the stored function (again, under the Modify


Transform option). Next we reconstruct the
image and save it to the disk under some
convenient filename (you may look at this
fuzzy picture later; but you can see it now in
Fig. 16.5). Okay, without changing anything,
transform this degraded graphic back to the
frequency domain. Under the Modify Trans­
form menu there 's an option to Divide
Fig. 1 6.5 Fuzzy
-
Transform with Stored Function. The stored
function, of course, is the same one we just used to multiply this transform.
If we divide by this function, we should get the same thing we had
originally... what could go wrong?
If, in fact, you divide by this same
Gaussian function, you will (pretty much) get
the original picture back...but check the de­
convolved spectrum carefully-it's "growing
hair" at the highest frequencies. You can play
barber and cut this stuff by using the Truncate
Spectrum option under the Modify Transform
menu ...but we should be very concerned about
things growing hair.. .let's look closer:
Fig. 1 6.6 - Recovered
Start all over again, but this time
make the Gaussian function diameter = 4.0. Go through the same process
(this time there's no need to save the picture-we' ve already done
that-it's just another fuzzy picture). The thing we're interested in here
is the final deconvolved frequency domain function and... WOW! This is
pretty bad! This stuff doesn't need a barber-it needs a hay-mower!
We better talk about this. What we have j ust done is simply
multiply a bunch of numbers by a bunch of numbers ... and then divide the
same bunch of numbers (by the same numbers) and, mathematicall� we
should be back where we started. Nonetheless, we do not have the same
thing we started with! It would appear our computer is not very good at
arithmetic. = . It's okay, all it takes to correct this is one line of code:

10 D E FDBL A - Z ' T H I S I S ALL I T TAKES

That's all it takes ...(well, you will also have to change the Dimension
190 Chapter 16

statement, etc., etc., etc... ). Run the identical illustration as above under
double precision and it will work.
The reason it takes double precision to get good arithmetic in the
above illustration is that a Gaussian function greatly attenuates the higher
frequencies (Fig 1 6.7). We are multiplying the high frequencies of our
transform by very small numbers and
t h e n p e rfo r m i n g a m u l t i t u d e o f
0" - 1
multiplications and additions on these
-ZD
numbers (i.e., the FFT operations).
When we later divide the transform
-40
by these same small numbers we find
the original data has been lost in -60 .'"'1...., ....

noise.3 The point is this: unless we're


careful, our attempts to enhance the .
. F' 1 6 . 7 - Xiiorm 0 Gausslan
Ig. f
Image may well screw-up the data so
badly things become unrecoverable (if they weren't hopeless to begin
with). If you drive the numbers into the noise with single precision
arithmetic, you yourself may make it impossible to recover the data.
Okay, except for the noise thing, what we have just done is pretty
simple. We have multiplied two functions (the image transform x a
hypothetical transfer function) and then divided them. It would have been
surprising only if it hadn t worked ; but, some of you may suspect
enhancing real fuzzy pictures will be more difficult. For example, if we
get mud on our friend's camera, we won't really know the transfer
function! Real fuzzy images just might be a little tougher!

16.5 FINDING TRANSFER FUNCTIONS

Okay, l e t 's s e e what w e can do with this de-convol ution


technique. It should be apparent that transfer functions exist which can
convert any picture into any other picture (e.g., that we can convert an
out-of-focus picture into an in-focus picture). Furthermore, we could
always find this transfer function by dividing the transform of the desired
picture (i.e., the in-focus picture) by the transform of the picture to be
converted (i.e., the out-of-focus one).
3
We can multiply by small numbers and things work well enough. but when we
add very small numbers to very large ones the least significant bits of the small ones (or
even the MSBs) may be truncated. You may recall our discussion back on p. 137
Image Enhancement 191

It's obvious, of course, that if we have an in-focus version of the


picture, we probably don't need to go through this exercise; still, there is
a reason to conduct this experiment. If we deliberately set up a camera,
take a picture of a "fixed" object, then de-focus the camera and take a
second picture, we will have the raw material to determine the necessary
de-convolving function when we do get an out of focus pictureL .. Aha!4
This, in fact, is precisely what we set-out to do. We allowed that,
if we find the transfer function resulting in a less than perfect result, we
could then obtain the original input by dividing by this transfer function!
We should obtain the required deconvolution function if we divide the
transform of the out-of-focus picture by the in-focus one. Now, as we
know, we will pick up truncation and rounding noise in this process;
nonetheless, we should get a useful replica of the function required to
bring pictures into focus.(?) If you have access to a CCD camera, VCR
camera with digital converter, or a conventional 3 5mm camera and
scanner, you can try this project, but you may find it more "enlightening"
than you wanted- working with real data is always more frustrating than
working with idealized experiments. You will find it desirable to start
with a simple target (e.g., small black circle on a white background or
vice-versa-see comment at the bottom of p. 1 86). You might find that
your key-chain laser (made into a point source by projecting it through a
lens) is quite useful here.
We should point out that this technique of deconvolution is
almost too general. If, for example, you divided the transform of Mickey
Mouse by the transform of someone else, you could make, say. . . your
favorite politician .. .look like Mickey Mouse (that would be a trivial case,
of course). 5 In other words, not only can we make an out-of-focus picture
in-focus, we can pretty well turn anything into anything (such is the power
of this sort ofji/tering). What we really need are well-defined functions
for the distortion we are trying to correct . . . ones we can apply in an
iterative process, measuring whether each step makes things better or
worse . . . and reacting accordingly. S urely Mother Nature is doing
something simple when she creates out-of-focus pictures.(?)
There are other mechanisms that degrade the image, and here
deconvolution may be very helpful-let's look at this.

4And if it doesn't work we will at least be thereby enlightened!


5
No offense intended Mickey
192 Chapter 16

16.6 ENHANCING RESOLUTION

The picture of Fig. 16.8 was scanned from a small segment of an


8" by 10" photograph into the .BMP fonnat. (NOTE · All the pictures in
this chapter are handled in the *.BMP graphics format. Its one of the
easiestformats to understand (which is why we chose it) and it s the only
format providedfor in program FFTJ6.00. ) [Note: while the half-tones
presented here may leave something to be desired, the relative (before and
after) quality of the photos is a fair representation of what was achieved.]
In enhancing this photograph we
have done little more than improve the
contour of the frequency domain spec­
trum, using the same technique we have
been describing. We used a Gaussian
function (as the deconvolving function),
for the same reasons we used it in the
preceding illustration-it's a good approx­
imation to what actually happens in less
than perfect optical systems. We might
Figure 1 6.8 - Moon Shot have done better had we taken a picture of
a star (under the identical conditions as this picture was taken) and used
its transfonn as the deconvolving function. If you choose to experiment
with that technique, remember the deconvolving function m ust be
provided to considerably better resolution and precision than the picture
you hope to improve-that's one of the major advantages to using a
Gaussian or other purely mathematical function.
In Fig. 1 6.9 we begin to see the
good news and the bad news. We can
bring up detail, but with this 8-bit data
fonnat, we quickly begin to bring up the
digital noise. We have probably harped
on this enough, but things can be greatly
improved by using more bits of data, and
by integrating (i.e., summing together) a
large number of images to drag the detail
out ofthe noise. Note: this was originally
Fig. 1 6.9 - Enhanced Moon
in color (we converted to a gray-scale
Image Enhancement 193

before enhancing)-we could have probably done a little better by


enhancing the three colors separately and combining them afterwards.
If you have access to a CCD camera mounted on a telescope, and
a modem multi-media computer, you can go pretty far using an empirical
approach. It's a rewarding experience when you see real improvements
appear after you have worked on an image for a period of time. This
really is good stuff; however, you should always keep in mind that there's
an ultimate limit to the resolution attainable with any given telescope
objective. The image is indeed convolved with the system aperture, and
any harmonic components that lie beyond the aperture function are zeroed­
out.. .and lost forever.6

16.7 DATA LENGTH PROBLEMS

Okay, now that we understand the basic idea of deconvolution


let's look at some of the things that affect image enhancement in practice.
A close relative to the double-precision bomb is the data precision bomb.
Most of the popular graphic file formats (·.JPG, ·.BMP, etc.) only employ
eight bits of resolution/dynamic range; so, if 7 decimal digits blow up,
how do 8 binary digits fare? If we repeat the girl-friend illustration but,
after reconstructing the fuzzy image, truncate the gray-scale to 8 bits, we
will have the thing we usually get when we scan an imperfect picture.7
Now, as we know, the spectrum of a Gaussian function rolls-off with
frequency (Fig. 16.7), and if we multiply the harmonics of a picture by
this function, we eventually attenuate those harmonics below the least
significant bit of our AID (about -50 db for 8 bits). In our convolution/
deconvolution illustration we multiplied the 8 bit resolution pictures with
real numbers (7 decimal digits); so, when we enhanced this fuzzy image
we pretty much got our original 8 bit data back. When working with real
fuzzy images, however, the Gaussian function we're concerned with isn't
the mathematical function we used in the preceding example, but the
quasi-Gaussian function caused by mud on the lens of your camera, or etc.
In this case the high frequency components have long since been lost by
6
There is. as we noted in our study of audio, the technique of guessing what the
image should look like and then minimizing the error between the guess and actual image.
I f we really do know what the image will look like this can work pretty well
7
There , s an option from the Main Menu of FFr16.00 which is called Change
Gray-Scale It allows setting the data in the array back to an integer number of data bits.
194 Chapter 16

our 8-bit AID, and dividing the transform of this 8 bit data by our
mathematical Gaussian transform can't bring back the lost information­
it will only create random numbers in the high frequencies-noise.
The message is, in the case of data bits, more is better, but 16 bits
only give 96 db of dynamic range ... and from Fig. 1 6.7 it's apparent that
seriously degraded images will need more than that. [Note: the maximum
resolution frequency is. of course. the Nyquist (indicated as QI2 in Fig
16 7). Our efforts here only concern hannonics below the Nyquist.] You
will get a better feel for this as you work with it.
You can experiment with the effect of data length by converting
the degraded image to various data length words (e.g., 8 - 1 6 bit
resolution) and then try to deconvolve it in the usual way. You will, of
course, get the overgrown "hay" at the high frequencies (you can try this
in double precision if you like, but it's pretty obvious that the problem is
data word length). In Fig. 1 6 . 1 0 we compare attempts to recover images

Fig. 1 6. 1 0 - Effect of Data Resolution

with increasing numbers of data bits. Now, this isn � supposed to


represent the best you can do---the best you can do is as much art as
science, and appearance is greatly influenced by things like brightness and
contrast, which have little to do with our struggles within the FFf. Some
people can get much better results than others-the pictures of Fig. 1 6. 8
Image Enhancement 195

were obtained with a relatively fixed routine, keeping things the same for
each picture (a not completely successful effort, obviously). The last
picture (bottom right) was obtained after an unjustifiably long effort (as
I said, some are better at this than others). Compare these to Fig. 1 6.4
which is the best we can do with a perfect recovery.

16.8 ABOUT THE NOISE "PROBLEM"

So, if 16 bits only provides 96 db of dynamic range (software is


moving toward 48 bit graphics with three 16 bit colors-maybe whining
works after all) can we really do anything significant to enhance images
that are seriously degraded? We really need more data bits, and in that
regard we need to consider another problem.
The "grass" we encountered in the fuzzy image illustrations is
digital noise-we run into truncation and rounding errors which affect the
data in a more or less random manner. Increasing the number of bits in
our AID converter will alleviate this problem; however, as we continue to
increase the number of bits, we will eventually run into the system or
electro-optic noise. Electronic noise is also random stuff which can't be
corrected, leaving us impaled on the horns of a dilemma: limiting the
number of data bits creates digital noise, but increasing the number of bits
brings in electro-optic noise! This sounds like Catch-22.
Actually, we should not be upset if the least significant bits of our
AID converter are displaying noise! In fact, seeing noise in these least
significant bits should warm the cockles of our hearts, for this is the
solution to our dilemma-this allows us to go beyond the 8-bit resolution
of the AID converter! All we have to do is sum these noisy pictures into
an accumulator, and as we continue to add-in noisy frames of data the
signal will increase linearly. . . but not the noise . . . noise is a random
phenomenon. If we sum a series of random numbers, the summation will
stagger off in a random walk. We can show that the RMS value of this
random walk function will only increase as the square root of the number
of added frames. So, as we add noisy picture on top of noisy picture, the
signal increases linearly, the noise increases as YN (N = number frames),
and the signal to noise ratio will improve as YN . If we do this correctly
the resolution will also improve (i.e., the number of bits in the data word
will increase). [There 's an illustration of this in Appendix 1 6.2.]
1 96 Chapter 16

1 6.9 A FINAL WORD

There are many other applications of the 2-D FFT, many of


which are more interesting than our chosen example; however, given the
limitations of this book it seemed best to consider the phenomenon of
convolution/deconvolution. Now, as we noted in the last chapter of
Understanding the FFT, there's a way to perform convolution without
involving the Fourier transform-the convolution integral. As we know,
this involves multiplying and integrating the functions, then shifting and
multiplying and integrating again, etc., etc., etc.-a convoluted process
that could be appealing only to a mathematician. It's difficult to imagine
that Mother Nature would abuse us with physically real implementations
of such a process; still, since multiplication in the frequency domain is
convolution in the time domain, it's not a matter of one viewpoint being
the "right" point of view-both describe the same thing. . . .
So far a s physical reality is concerned, the understanding of
convolution as multiplication in the frequency domain seems much more
likely. . .ifyou accept the frequency domain harmonics as physically real.
Now, when we deal with light waves this is no great stretch since we are
obviously dealing with sinusoidal waves . . . and when we deal with sound
we're likewise dealing with sinusoids. In such instances there can be little
doubt that multiplication in the frequency domain is the real point of view.
On the other hand, there are a multitude of instances when it's not obvious
that sinusoids are involved at all (e.g., linear motions of objects, described
by Sir Isaac's famous F = Ma)? We might argue, as we noted in Chapter
2, that the real world includes both phenomena of differentiation and
integration. That is, inertial accelerations co-exist with spring displace­
ments-objects thrown into the air are pulled back by the "spring" force
of gravity. 8 Sturm and Liouville have patiently explained that systems
described by second-order differential equations tend to oscillate­
imply i ng underlying sinusoidal mechanisms-and even when the
osc i l l ations are damped-out completely the underlying sinusoidal
mechanisms are still valid. Nonetheless, as we noted earlier, phenomena
following the eX natural growth law do not qual ify for Sturm and
Liouville's blessings.

8
The physics of e1ectncity and magnetism make this point strongly as the
ubiquitous nature of stray capacitance and inductance is grasped
Image Enhancement 197

As our understanding of the world about us progresses our


viewpoints change. Newton saw the phenomenon of light cleanly and
clearly as a rain of particles; nonetheless, people like Huygens, Young,
Fresnel and Fraunhofer recognized that phenomena such as interference
and diffraction dictated that light be viewed as waves. Eventually it
became impossible to deny the wave-like nature of light, and the wave
theory won out over the particle theory (unfortunately, and all too soon,
it later became impossible to deny the particle nature of light, thereby
confounding everyone on all sides). Even worse, it shortly became
apparent that basic particles of matter (which, by this time, everyone
agreed had a particle nature) also exhibited a wave-like nature . . . it's
enough to try your patience!
What Fourier analysis is really telling us is that both these
observations-both of these points of view-are the same thing (at least
when we're dealing with second order systems). If the summation of
sinusoids can yield a replica of any waveshape we can measure, then
surely we can decompose any measurable wave shape into sinusoids.
Depending on how we manipulate a signal in its two domains, we can
make either the wave nature or the particle nature apparent, as we have
tried to illustrate in this book. In any case, there's nothing supernatural
nor magical going on here, and as we understand this, we begin to
understand Fourier analysis. 9

9
Founer analysis can be extended to the third dimension. The way to do this is
more-or-Iess apparent from our discussion ofthe 2-D transform The implication is that 3-D
objects are a superposition of sinusoidal waves . talk about interesting puzzles. It has
occurred to me that a third book on the 3-D transform might be interesting... but so far I
have been successful in putting it out of my mind
APPENDIX 1 . 1

AVERAGE VALUE

The Pythagoreans, some 500 years before the birth of Christ,


defined three different means which they termed "anthmetic, geometric,
and harmonic." (Actually they defined ten different proportions they called
"means" but we won't go into that.) It's the notion they called arithmetic
mean that interests us here-that's what we refer to as the average value.
The arithmetic mean is the point midway between any two
arbitrary numbers. The number 5 is the average value of 3 and 7-it's an
equal distance from 5 to either 3 or 7-that's what we mean by the term
arithmetic mean (or average). Let's look at this notion arithmetically:

---------- (A 1 . 1 )

where n1 is the smaller number and n2 is the larger [e.g., (5-3) = (7-5»). If
we solve (A 1. 1) for Av we find:

- - - - - - - - - - - (A l .2)

The notion of a mean extends to more than two numbers, of course. The
number 5 is also the average of 3, 4, 6 and 7. It's the middle point of this
set of numbers. If you expand this exercise, you will eventually conclude
that the average of any set of N numbers is:

Av = lIN E nj (for i = 1 to N) (A l .3)

That is, we add up the numbers and divide by the number of data points.
Now, we may use this notion to find the
4 average value of a function over some range. For

3 •
example , we would solve the very simple function
y = INT(x) for its average value from zero to 4 as
2 -- - ....
- - -

follows:

(0 + 1 + 2 + 3 + 4)/5 = 10/5 = 2
1 2 3 4

Fig. A1.1
The average value of this linear function between 0
and 4 is 2-we included zero--the average value from 1 to 4 is 2.5!
Well and good, but suppose, for example, we want to know the
2
average value of the function y = INT(x )? The above technique yields:

(0 + 1 + 4 + 9 + 1 6)/5 = 30/5 = 6
200 Appendix 1 . 1

but from the calculus the mean value (designated as y) is:

y = x(n + I )/(n+ l )x = x3/3x = 43/(3.4) = 64112 = 5.333 . . . .

We have a little discrepancy here-which answer do w e really want?


Our question is: "Why is the mean value, as determined by the
calculus, not the same thing as the arithmetic mean, as determined by
summing the data points and dividing by N? The following program may
help shed a little light on this matter:

I **********************************************************
, * PROGRAM TO COMPARE AVERAGE VALUES OF CURVES OF THE FORM *
, * (Y = XAN ) AS OBTA I NED BY : 1 ) THE MEAN VALUE THEOREM *
, * 2) SUMMAT I ON D I V I DED BY N 3) THE TRAPEZOIDAL RULE *
I **********************************************************
CLS : DE FDBL A - Z
I NPUT " POWER T O RAI SE I NDEPENDENT VAR I ABLE T O I S " ; N
I NPUT " CALCULATE OVER DOMA I N (X MAX . - I NTEGER ) " ; XMAX
1 0 I NPUT " USE A STEP S I ZE OF : ( E . G . , 0 . 5 ) " ; SZ
PR I N T : PR I N T
PR I NT "MEAN VALUE DETERM I NED B Y CALCULUS I S " ; ( XMAXA(N+1 ) / ( N+1 »1 XMAX
PR I NT
I ******************************************************
YT = 0 ' I N I T I AL I ZE ACCUMULATOR
FOR I = 0 TO XMAX STEP SZ ' SOLVE AR I THMET I C MEAN
YT = YT + I A N
NEXT I
YAV = YT I ( XMAX I SZ + 1 ) ' ADD 1 TO COUNT THE "ZERO" DATA POI NT
PR I NT "THE AR I THMET I C MEAN IS " ; YAV: PR I NT
YT = YT - ( XMAX A N I 2 ) : YAV = SZ * YT I XMAX
I ******************************************************
PR I NT "THE AVERAGE DETERM I NED BY THE TRAPEZO I DAL RULE I S "; YAV
PR I NT "MORE ( YIN ) " ;
9 0 A S = I NKEYS : I F A S = " " THEN 90
I F AS = "Y" OR AS = " y" T HE N 1 0
END

If you experiment with this program you will find that as the number of
data points is increased, the arithmetic average approaches the mean as
determined by calculus. Calculus finds the mean of an infinite number of
data points, and as we take more points, the arithmetic mean approaches
the same value. The calculus finds the mean value of a continuous
function-the arithmetic mean gives the average of a finite number of data
points. If you're working with a continuous function you must use the
calculus-the average of a finite set of numbers is given by Eqn. (A 1 .3).
APPENDIX 4.1
DIFFERENTIATION AND INTEGRATION
VIA TRANSFORMS

A4.1 DIFFERENTIATION

Let's make two fundamental points:


1 ) In Chapter 2 we noted the harmonic components could be
modified but, in a linear system, the resulting function always remained a
summation of these same frequency sinusoids.
2) In general, this function is expressed as:

(A4. 1 )

Now, we may differentiate (or integrate) a polynomial by differentiating


(or integrating) the polynomial tenn by tenn; so, we may differentiate the
Fourier series of Eqn. (A4. 1 ) by differentiating the hannonics tenn by
tenn. In the DFT this turns out to be an incredibly simple operation that
requires nothing we would really call calculus. Let's look at this.
As noted in Chapter 2, the derivative of a sine wave is a cosine
wave (p. 1 0- 1 2), and if a cosine wave is just a sine wave displaced by 90°,
it's apparent the derivative of a cosine wave will be a negative sine wave,
etc. That is, the derivative of Sin(x) = Cos(x) and the derivative of Cos(x)
= -Sin(x) [i.e., dCos(x)/dx = -Sin(x)] ; howevet; when we deal with time­
based sinusoids (i.e., Sin(wt), the derivatives are multiplied by w (i.e.,
dCos(wt)ldt = -wSin(wt), where w = 21r1). (Those unfamiliar with the
calculus will have to take my word for this.)
The hannonics are designated as complex phasors, composed of
a cosine and sine tenn. So, to find the derivative of a time-based sinusoid,
then, we need only multiply all its phasors by 21rf (i.e., w), and shift the
phase by 90°. Mathematicall� we convert the frequency domain function
to its derivative by simply multiplying each harmonic by the complex
variable 0 +i27rf (where i = v- l andfwould be the hannonic number).
Okay, but for some of us there 's a deep, dark chasm between the
explanation (such as given above) and actually finding derivatives and
integrals using an FFT computer program. It will be a worthwhile exercise
to modify the basic FFT program we developed in Understanding the FFT
to differentiate and integrate functions (see Ch. 6, this book, pp. 5 1 -56.
A basic differentiation routine might look something like this:

1 0S0 CLS: P R I N T SPC(30 ) ; "CALCULUS MENU" : PR I N T : P R I N T


1 060 PR I N T SPC C S ) ; " 1 = D I FFERE N T I ATE FUNCT I ON " : PR I N T
1 062 P R I N T SPC C S ) ; "2 = I N TEGRATE FUNCT I ON " : PR I N T
1 066 PR I N T SPC C S ) ; "9 = EX I T " : PR I N T
1 070 PR I N T SPC ( 1 0 ) ; "MAKE SELECT I ON : " ;
202 Appendix 4.1

1 080 AS = I NKEYS : I F AS = " " THEN 1 080


1 090 A = VAL(AS ) : ON A GOSUB 1 1 00 , 1 200
1 099 RETURN
1 1 00 REM *** D I F FEREN T I ATE FUNCT I ON ***
1 1 10 FOR I = 0 TO Q3 : KD F = I * P2 I I = HARMON I C , PI = 3 . 1 4 1 6 • • •

1 1 20 CTemp = - KD F * S ( I ) : S ( I ) = KD F * C ( I ) : C( I ) = CTemp
1 1 30 CTemp = KD F * S ( Q - I ) : S ( Q - I ) = - KD F * C(Q- I ) : C ( Q - I ) = CTemp
1 1 40 NEXT I
1 1 42 C(Q2) = 0 : S(Q2) = 0
1 1 50 NMS = "DE R I VAT I V E " : RETURN

We didn't really employ


the formality of complex multipli­
cation here. Since sine compo­
nents obviously become cosine
components and cosines become
negative sines, we simply multiply
Fig. A4.1 - Square Wave Function and r e p l a c e term s . T h i s i s a
powerful tool-we can find derivatives even when we know virtually
nothing about the function (nor the calculus = . ).
If you type in the generic
FFT program of Chapter 6, p.5 1 , 5"
along with the differentiation
routine, you can experiment with
this technique to your heart 's
content; howevet; there are idio-
syncrasies and pitfalls-so we Fig A4 2 - Derivative of Square Wave
should talk about these.

A4.2 THE TIME SCALE FACTOR

So far, in our work with the FFf, we have assum ed a time domain
of unity (i.e., one second). That, of course, will seldom be the case; but,
as far as the FFT is concerned it makes no difference. We will always fit
exactly one sinusoid into the domain for the fundamental, and the
harmonics will always be integer multiples of this fundamental. If, for
example, we study the offset voltage drift of an operational amplifiet; and
take one sample per day for 1 024 days, the harmonics will be in units of
N cycles/ l 024 days. The derivative of this data will be expressed in volts
per 1 024 days. [If we should need the drift rate per day we simply divide
the data by 1 024].
Having noted this, it's apparent the reference period for our
sinusoids (i.e., To) is always equal to the time of the total sample interval,
and that the time between samples (At) must be Tr/Q (where Q is the total
Differentiation and Integration 203

number of samples). Formally, the argument for our sinusoids will be


21frultffo. If we sample a 1 Hz triangle wave (amplitude of -1 to +1 volts)
at 5 1 2 samples/second for one second, it's more or less obvious the
derivative will be a square wave of ± 4 volts/sec. (that is, the signal ramps
up from - 1 to + 1 in 112 second which is a rate of 4 volts/second). How
does this work out in our FFT differentiation program? Do we get
quantitatively correct results? To check this we need to modify the
generate function routine of our program to the following:

600 ' *** T R I ANGLE FUNCT I ON ***

61 0 FOR I = 0 TO Q - 1 : C ( O , I ) = 0: S ( O , I ) = 0
61 2 FOR J = 1 TO Q2 - 1 STEP 2 ' SUM 000 HARMON I CS
620 C( I ) = C ( I ) + ( S I N ( K1 * I * J ) / ( J * J »
630 NEXT J ' SUM I N NEXT HARMON I C ' S CONTR I BU T I ON
640 C ( I ) = C ( I ) * 8 / P I A2 ' CORRECT FOR UN I T AMP L I TUDE
650 NEXT I ' CALCULATE NEXT DATA POINT

If you try this you will find it works fine, but suppose our actual
digitized function was a 1 00 Hz triangle wave of amplitude ± 1 volt? In
that case (assuming we still digitize one cycle in 5 1 2 samples) the total
data interval will be om second, but the data will be identical to the 1 Hz
waveform. The derivative will still yield ± 4 but we must divide by the
0.01 seconds and the correct derivative will then be 400 volts/sec. While
we do not carry the time scale factor into the DFT, we should keep it safe
somewhere so that we can calculate and display the correct ampli­
tudeltimelfrequency data for the end user.

A4.3 INTEGRATION

It's reasonably apparent that, if we can differentiate a frequency


domain by mUltiplication, integration may be accomplished by division.
We may find the integral of a Fourier series by simply dividing by the
same complex variable we used to differentiate (i.e., 0 +i27rf-surely this
will get us back to the originalfunction.. no?). A preliminary integration
routine might look something like this:

1 200 REM *** I N TEGRATE FUNCTION ***


1210 FOR I = 1 TO Q3 : KD F = I * P2 ' I = HARMON I C , P2 = 2* P I
1 220 CTemp = S ( I ) / KD F : S ( I ) = - C ( I )/KD F : C ( I ) = CTemp
1 230 CTemp = - S ( Q - I )/KD F : S (Q- I ) =C(Q- I )/KD F : C ( Q - I )=CTemp
1 240 NEXT I
1 242 C(Q2) = O : C ( O ) = 0
204 Appendix 4.1

Let's use this preliminary routine as given here to explore the


potential of this technique, and then we will talk about its shortcomings.
Suppose we begin by integrating
the square wave. F or this w e
must first create a square wave,
then modify the spectrum (i e . ,
e x e c ute the in tegra tion s ub­
routine) and finally perform an
inverse transform to see the results
Fig A4 3 Integral of Square Wave
-

of our handiwork (see Fig A4.3).


You may do repeated integrations (or differentiations) of
functions; so, having found that the integral of a square wave is a triangle
wave, we may either proceed to the integral of a triangle; or, we may
differentiate this function just to verify that we get our square wave back.
There's a particularly interesting exercise you can do here­
integrate the square wave more than once, then differentiate it repeatedly
to see if you get your square wave back. You will need to extend this
exercise to about four integrations/differentiations at least. If you are
experienced with this sort of operation the results may not surprise you­
but maybe they will. Also try this using double precision arithmetic.
Now, as we hinted above, there's a glitch with the routine given
for integration here. If we attempt to divide the constant term (i.e., the
zero frequency component) by zero, we will be doing something stupid.
The computer will stop, of course, and tell us we have tried to perform an
illegal operation-that division by zero is not allowed. So, in the above
routine, we have simply zeroed-out the constant term . . . = .
Note ' There s a way around this little problem. The trick is
recognize that a constant offset would be identical to the first alternation
of a square wave if the array were doubled in size (we 'll talk more about
this in Ch 9). We will not go into this further but leave it as an extra
credit exercise for the really intelligent readers.. the rest ofyou probably
couldn l handle it anyway !I\)
APPENDIX 6.1

TRANSIENT ANALYSIS PROGRAM

The two programs for Chapter 5 and 6 have been written so that
they can be merged together with a minimum of headaches. First you will
need to load the Mesh Analysis program ACNET05.BAS (p. 37), delete
everything up to line 1 0000, and then save what's left under some
temporary name (e.g., MESHTMP.BAS). Note that, for QuickBasic, you
will have to save this as an ASCII file so that it can be merged late!: Next
load the Gibb's Phenomenon (FFT06-0 1 ) program from Chapter 6 (p. 5 1 )
and immediately save it as TRANALYS.BAS (or some name you prefer).
Then merge MESHTMP.BAS to the end of this new program.
Okay, now we will have to make some modifications:

20 D I M C ( Q ) , se Q ) , KC( Q ) , KS(Q ) , COMP ( 3 , KB , KB ) , Z ( 2 , KB, KB+ 1 )

1 066 PR I NT SPC ( S ) ; "4 = C I RCU I T CONVOLUT I ON " : PR I NT


1 067 PR I NT SPC ( S ) ; "5 = I NPUT C I RCU I T " : PR I NT

1 082 A = VAL (A$ ) : ON A GOSUB 1 1 00, 1 200, 1 300 , 1400 , 20000, 1 990

1400 REM * CONVOLVE Y I T H C I RCU I T XFER FUNCT I ON *


1402 CLS : PR I NT : PR I NT
1404 PR I NT SPC( 1 0 ) ; "CONVOLV I NG XFER FUNCT I ON Y I T H STEP FUNC T I ON "
1410 FOR 1 3 = 0 T O Q3
1412 GOSUB 1 0000' COMPUTE XFER FUNCT I ON
1 424 CAT = (ATTNR * C ( 1 3 » - ( AT TN I * S ( 1 3 » ' COMPLEX CONVOLUT I ON
1425 SAT = (ATT N I * C ( 1 3 » +(ATTNR * S ( 1 3 » ' I MAG I NARY TERM
1 426 C ( 1 3 ) = CAT : S ( 1 3 ) = SAT' REAL FREQUENC I E S
1427 C(Q- 1 3 ) = CAT : S(Q- 1 3 ) = - SAT ' NEGAT I VE FREQUENC I E S
1428 NEXT 1 3
1430 1 3 = Q2 : GOSUB 1 0000
1434 C(Q2) = (ATTNR * C ( Q2 » : S (Q2) = 0
1494 RTFLG = 1 : RETURN

1 0000 F = 1 3 : FREQ = 1 3
10010 GOSUB 1 1 000' CALC I MPEDANCE MAT R I X
1 0020 GOSUB 1 2000 ' SOLVE FOR CURRENTS
1 0030 ATTNR = Z ( 1 , KB , KB+1 )*RTERM :ATTN I = Z ( 2 , KB , KB+1 )*RTERM
1 0090 RETURN

20002 PR I N T : I NPUT "ENTER NUMBER OF MESHE S " ; KB


20004 RED I M COMP ( 3 , KB, KB ) , Z ( 2 , KB, KB+ 1 )

You should also substitute the generate square wave function


shown on page 65, but that's all there is to it! You can now get the
transient response of passive linear networks. Try it.
APPENDIX 7.1

POSITIVE FREQUENCY ONLY STRETCHING

This program is described in Appendix 5 . 1 of the companion


volume Understanding the FFT. The only difference is this DFT only
extracts the positivefrequencies. This is easily and simply accomplished
in line 206 by making the loop step from 0 to Q/2 (we must include the
Nyquist). You should look at the TransformlReconstruct routine-if for
no other reason, just to remind yourself of the simplicity and beauty of
that routine we call the DFT.

2 REM ******************************************
3 REM ** ( D FT07. 01 ) GENERATE/ANALYZE YAVE FORM **
8 REM ******************************************
1 0 Q = 3 2 : PI = 3 . 1 4 1 592653589793#: P2 = 2*P I : K1 =P2/Q : K2= 1 / P I
1 4 D I M C ( 2 , Q ) , S ( 2 , Q ) , KC ( 2 , Q ) , K S ( 2 , Q )
1 6 C L S : FOR J =O T O Q : FOR 1 = 1 T O 2 : C ( I , J ) =O : S ( I , J )=O: NEXT : NEXT
20 CLS : REM * MA I N MENU *
22 PR I NT : P R I NT : P R I NT " MA I N MENU" : PR I NT
24 P R I NT " 1 = STRETC H I NG THEOREM" : PR I NT
31 P R I NT " 2 = EX I T" : PR I NT : PR I NT
32 PR I NT SPC ( 1 0 ) ; "MAKE SELECT I ON " ;
3 4 A S = I NKEYS : I F A S = " " T H E N 34
36 A = VAL ( AS ) : ON A GOSUB 300, 1 000
38 GOTO 20
40 CLS : N = 1 : M = 2: K5 = Q2: K6 = - 1 : GOSUB 1 08
42 FOR J = 0 TO Q : C ( 2 , J ) = 0: S ( 2 , J ) = 0 : NEXT
44 GOSUB 200 : REM - PER FORM O F T
4 6 GOSUB 1 4 0 : R E M - PR I NT OUT F I NAL VALUES
48 PR I NT : I NPUT "C/R TO CONT I NUE"; AS
50 RETURN
1 00 REM ******************************************
1 02 REM * P ROGRAM SUBROUT I NES *
1 04 REM ******************************************
1 06 REM * P R I NT COLUMN HEAD I NGS *
1 08 P R I N T : PR I NT : I F CORS = "P" THEN 1 1 6
1 1 0 P R I NT " F REQ F ( COS) F(SIN) FREQ F ( COS ) F ( S I N )"
1 1 2 PR I NT
1 1 4 RETURN
1 1 6 PR I NT " F REQ F ( MAG ) F C THETA) FREQ F ( MAG) F C THETA ) "
1 1 8 GOTO 1 1 2
1 37 REM ******************************
1 38 REM * PR I NT OUTPUT *
1 39 REM ******************************
1 40 I F CORS = "P" AND M = 2 THEN GOSUB 1 70
1 4 1 FOR Z = 0 TO Q / 2 - 1
1 42 PR I NT US I NG "## II. z ·
1 44 PR I NT US I NG ,,+### . #11###
'
"; C ( M , Z ) ; S C M , Z ) ;
1 45 PR I NT U S I NG "## II . (2 + Q / 2 ) ·
146 PR I NT USI N G ,,+### . _- "; C ( M, Z + Q / 2 ) ; S C M , Z + Q / 2 )
1 4 7 NEXT Z
148 RETURN
Positive Frequency Stretching 207

200 REM *******************************


*
202 REM * TRANSFORM/RECONSTRUCT
204 REM *******************************
206 FOR J = 0 TO Q2: REM SOLVE EQNS FOR POS I T I VE FREQUENC I ES
208 FOR I = 0 TO Q - 1 : REM MUL T I PLY AND SUM EACH PO I NT
210 C ( M , J ) = C ( M , J ) + C ( N , I )*COS ( J * I *K 1 ) + K6*S ( N , I )*S I N ( J* I *K1 )
211 S ( M , J ) = S( M , J ) - K6*C ( N , I )*S I N ( J * I *K1 ) + S ( N , I )*COS ( J * I * K 1 )
212 NEXT I
214 C ( M , J ) = C ( M , J ) / K5 : S C M , J ) = S C M , J ) / K5 : REM SCALE RESULTS
216 NEXT J
218 RETURN
220 REM *******************************
222 REM * PLOT FUNCT I ONS *

224 REM *******************************


225 S F F = 4: SFT = 64
226 SCREEN 9, 1 , 1 , 1 : COLOR 9, 1 : CLS : YF = - 1 : YT = - 1
228 L I NE ( 0 , 5 ) - ( 0 , 1 55 ) : L I NE ( 0 , 160 ) - ( 0 , 3 1 0 )
230 L I NE ( 0 , 1 5 5 ) - ( 600, 1 55 ) : L I NE ( 0 , 235 ) - (600, 235 )
232 GOSUB 266
234 COLOR 1 5 , 1
236 FOR N = 0 TO Q - 1
238 GOSUB 260
240 L I NE ( X , Y ) - ( X , V ) : L I NE ( X , Z ) - ( X , Z )
242 NEXT N
244 LOCATE 2, 1 0 : PR I NT " FREQUENCY DOMA I N ( MAG ) "
246 LOCATE 2 0 , 1 5 : PR I NT " T I ME DOMA I N "
248 LOCATE 24 , 1
250 I NPUT "C/R TO CONT I NUE"; AS
252 SCREEN 0, 0, 0
254 RETURN
256 REM *******************************
260 Y = C ( 2 , N ) : Y = 155 - ( Y F * Y )
262 X = N * 600 / Q : Z = 235 - ( YT * C ( 1 , N »
264 RETURN
265 REM *******************************
266 YF = 1 5 0/S F F : YT=1 50/SFT : L I NE ( 0 , 5 ) - ( 5 , 5 ) : L I NE ( 0 , 80 ) - ( 5 , 80 )
268 L I NE ( 0 , 1 60 ) - ( 5 , 1 60 ) : L I NE ( 0 , 235 ) - ( 5 , 235 )
270 LOCATE 1 , 2 : PR I NT S F F : LOCATE 6, 2 : PR I NT S F F / 2
272 LOCATE 1 2 , 2 : PR I NT "+"; SFT / 2 : LOCATE 23, 2 : PR I NT II _ II ; SFT / 2
274 RETURN
299 REM *******************************
*
300 CLS : REM * STRETCH I NG THEOREM
301 REM *******************************
302 FOR I = 0 TO Q - 1 : C( 1 , I ) = 0: S ( 1 , I ) = 0
304 FOR J = 1 TO 2: KC( J , I ) = 0: KS( J , I ) = 0 : NEXT : NEXT
305 CORS = "P" : Q = 16: K1 = P2 / Q: Q2 = Q / 2
306 GOSUB 900
308 REM *** GENERATE " Z 1 " FUNCT I ON ***
310 PR I NT : PR I NT SPC ( 1 8 ) ; " - Z1 - FUNCT I ON " : P R I NT
312 C ( 1 , 0) = 8: C ( 1 , 1 ) = - 8 : C ( 1 , 2) = 8: C ( 1 , 3 ) = - 8
314 GOSUB 1 58 : R E M P R I NT HEAD I NG
316 M = 1 : GOSUB 140 : REM PR I NT I NPUT FUNCT I ON
318 P R I N T : I NPUT "C/R TO CONT I NUE"; AS
320 GOSUB 40 : REM TAKE XFORM
322 GOSUB 220 : REM PLOT DATA
208 Appendix 7.1

324 FOR I = 0 TO Q - 1 : C ( 1 , I ) = 0 : S ( 1 , I ) = 0 : NEXT


326 Q = 32: K1 = P2 I Q: Q2 = Q I 2
328 C ( 1 , 0 ) = 8: C ( 1 , 2) = - 8 : C ( 1 , 4) = 8: C ( 1 , 6) = - 8
3 3 0 GOSUB 1 58 : R E M P R I NT H EAD I NG
332 M = 1 : GOSUB 1 4 0 : REM P R I NT I NPUT FUNCT I ON
334 P R I NT : I NPUT "C/R TO CONT I NUE"; AS
336 GOSUB 40: REM TAKE X FORM
338 GOSUB 220 : REM PLOT DATA
396 RETURN
900 CLS : SCREEN 9 , 1 , 1 : COLOR 1 5 , 1 : REM TEST DESCR I PT I ON
902 FOR DACNT = 1 TO 1 1
904 READ AS : P R I NT AS
906 NEXT
908 I NPUT "C/R TO CON T I NUE"; AS
9 1 0 SCREEN 0, 0, 0: RETURN
920 DATA " STRETCH I NG THEOREM TEST"
922 DATA " "
924 DATA " I n t h i s i l l ustrat i on we generate a very s i n., l e func t i on "
926 DATA "wh i ch has two pri mary character i st i cs : i t i s easy to"
928 DATA "generate and i t has a d i st i nc t i ve spec t rllll - i t is easy to"
930 DATA "man i pu l ate and easy to recogn i ze . F i rst we generate the "
932 DATA " funct i on and ana lyze i t ( 1 6 data po i nt s and 9 f requency "
934 DATA "con.,onents ) . Then we i ntersperse zeros and ana l yze the "
936 DATA " f unct i on a second t i me ( now we have 32 data po i nt s and 1 7 "
938 DATA " f requenc i es ) . Th i s i l l ustrates the stretch i ng Theorem . "
940 DATA " "
1 000 END
APPENDIX 7.2

SMALL ARRAY FFTS

In Chapter 7 (Fig. 7.4, p. 73) we illustrated just how simple small


array FFTs were. There are occasions when we only need a small array
FFT (e.g., image compression), and the simplicity of small arrays allow for
very simple and fast algorithms.
Starting from the PFFFT algorithms on page 75 we have very
simple equations for the 2-point DFTs (lines 1 1 0- 1 24). We do not solve
these equations, howevel; but substitute them directly into the routines for
4 point DFTs (lines 126- 136), yielding:

10 c ( o ) = ( Y ( O ) + Y ( 2 ) + Y ( 4 ) + Y ( 6 » /4
1 2 C ( 1 ) = ( Y ( O ) - Y ( 4 » /4 : S ( 1 ) = Y ( 2 ) - Y ( 6 » /4
14 C ( 2 ) = ( Y ( O ) - Y ( 2 ) + Y ( 4 ) - Y ( 6» /4

That's a l l there is to a 4 point DFT. I f you compare t h i s


algorithm to Fig. 7.4, you will see that i t i s a direct "lift off' from the 4
point DFT graphic on the left of that figure. You would need to take care
that no errors are picked up from the zero frequency sine component (nor
from the Nyquist sine component), but then, you hardly need a defined
array for these three harmonics-you could just call them FCO, FC 1 , FS I
and FC2. As a practical mattel; you will find it hard to transform 4 point
data arrays more efficiently (or quickly) than this.
We can, of course, extend this approach to an 8 point DFI There
would be two sets of the above equation, of course-one for the even data
points and one for the odd:

10 T(O) = Y ( 0 )+Y(4 ) : T ( 1 ) = Y ( 2 ) +Y ( 6 )
11 T(2) = Y ( 0 ) - Y ( 4 ) : T ( 3 ) =Y ( 2 ) - Y( 6 )
12 C(2) = ( T ( 0 ) - T ( 1 » /8
13 T(S) = T(O) + T ( 1 )
and:
14 T ( 6 ) = Y ( 1 ) + Y e S ) : T ( 7 ) = Y ( 3 ) + Y ( 7)
15 T ( 8 ) = Y ( 1 ) - Y e s ) : T ( 9 ) = Y ( 3 ) - Y ( 7)
16 T ( 1 0 ) = T(6) + T(7)
17 T ( 1 1 ) = T(8) + T(9) : T ( 1 2 ) = T(8) - T(9)

Note that the divide by 4 operation at the end of each line is removed,
exceptfor C(2) and S(2) which are divided by B.
In the conventional FFT we would combine these odd and even
transforms by the familiar rotate and sum loop; but, to obtain maximum
efficiency, we will combine these via five individual equations:

18 K1 = SQR ( . S ) /8
20 C ( O ) = ( T ( S ) + T ( 1 0 » /8
21 0 Appendix 7.2

22 C( 1 ) = T ( 2 ) + K1 * T ( 1 2 )
24 S(1 ) = T ( 3 ) + K 1 *T ( 1 1 )
26 C(2) = ( T ( O ) - T ( 1 » /8 : S ( 2 ) = ( T ( 6 ) - T ( 7» /8
28 C(3) = T ( 2 ) + K1*T ( 1 1 )
30 S(3) = K1 * T ( 1 2 ) - T ( 3 )
32 C(4) = ( T ( 5 ) - T ( 1 0 » /8

We pick up the division by 4 (eliminated from the previous


routines) by dividing by 8 in this routine. The only non-trivial twiddle
factor is Cos(r/4) Sin(r/4) V 5 Once again, you will find it difficult
= = . .

to beat the efficiency and speed of this routine. You should recognize
we're not abandoning the fundamental rotate and sum mechanism of the
FFT-we're only weeding-out superfluous machine cycles.
This approach can be extended to 16 point arrays but it's apparent
that, as the twiddle factors become more complicated, it becomes harder
to obtain significant gains. It might be a worthwhile exercise to see how
far this approach can profitably be extended. In any case, you will find it
difficult to beat the efficiency and speed of the routines given here . . . .
APPENDIX 9.2

THE BASIC SCHEME OF A FRACTIONAL FREQUENCY


POSITIVE FREQUENCY FAST FOURIER TRANSFORM
(FF-PFFFT)

We start with an 8 point data array:

- - - - - - - - - - - - (A9 2 0)

The positive frequency 1 12 Hz transform of which will be:

Xform I DATAO I = I Fo,FII2,FI,F312,F2,Fsl2,F3,F7I2,F4 1 - - - - - (A9.2. 1 )


Once again we subtract out the odd data elements creating two stretched
arrays:

DATA l ' I = I Do, 0, D2, 0, D4, 0, D6, 0 I - - - - - - - - - (A9.2.2)


DATA2' I = 1 0, D1, 0, D3, 0, Ds, 0, D7 1 - - - - - - - - (A9.2 2A)
This time it works like this: from our discussion of the stretching theorem
for positive frequencies we know the transform of (A9.2.2):

(Where FI*,Fo*, etc. , are complex conjugates of FI ,Fo, etc.)


So we remove the zeros in the array I DATA l ' I and obtain the array:

The half frequency transform of this unstretched array is:

Again, Fo, FI12, F I , etc., in Equation (A9.2.5) are identical to Fo,


F1/2 , etc . , in Equation (A9 . 2 . 3 ) . Very well then, we w i l l obtain the
transform of the stretched data (consisting of 9 frequency components) by
finding the transform of a 4 point array (5 frequencies), create the complex
conjugate of F312, F I , etc., and add them in again as Fs12 , F3, etc. By the
Addition Theorem we will add the two spectrums (i.e., for odd and even
data points) obtained in this manner just as before, rotating the phase of the
212 Appendix 9.2

odd data transfonn to account for the shifting phenomenon That is to say,
the frequency components from the "odd data" transform are properly
phase shifted and summed into the frequency components of the "even
data" transform. As before, the virtual components are created by
summing the mirror image of the direct components (i.e., the complex
conjugates are summed in reverse order).
Writing a fractional frequency transfonn would be a good exercise
to undertake-it would make much of what we have discussed about the
FFT come sharply into focus. Here is a little help:
The FFT starts from the one point xforms that each data point
represents, shifting and adding through N stages to accomp lish the
transfonn of Q data points (Q = 2N) . Now, in the conventional FFT, we
sum each data point from the lower half of the array with the data point
that is halfan array away (i.e., Do is summed with DQ/2 ' etc.). In the FFT
and PFFFT we start with single point xfonns and generate, in the first
stage, two point xfonns; however, in a half-frequency PFFFT, we must
produce three frequency components in the first stage . . . . In a shifting and
adding algorithm, how is the 112 Hz component generated?
It will help to return to the basic model for the FFT algorithm
discussed in Understanding the FFT, and realize that we are shifting the
"odd" data points so that they will interleave with the stretched "even" data
points. The shifting theorem has shown that the shift of each component
must be proportional to the frequency, and a half Hz frequency wiII only
receive half the shift as a full Hz. It may help to review Fig. 7.4 and think
of the 4-point xfonn as a 2-point, half frequency xfonn, with the last two
data points packed with zeros. It may also help to review Fig 7.6, packing
half of the array with zeros.
You recognize, of course, that this is deliberately presented as a
puzzle. It's a worthwhile puzzle, even if you do not plan to use the 1 12 Hz
configuration. It's apparent that many readers wiII have neither the time
nor inclination to tackle this puzzle . . . but, quite frankly, it is hard to
imagine that, if you have read this far, you wiII not have the ability. At
any rate, if you ever need it, it wiII be here.
APPENDIX 9.3

ONE DECI-BEL

Just as the Ohm is named in honor of Georg Simon Ohm, the Bel
is named in honor of Alexander Graham Bell. I It has a definition:

Attenuation (in Bels) = 10g I Q (P/P2) (A9.3 . 1 )

P I and P2 are power readings. This i s the only definition of the Bel.
By taking the logarithm of the power ratio we can compress a
wide dynamic range into a small scale (the range of one megawatt to one
microwatt is only 1 2 Bels). Fortunately, our senses measure magnitude
logarithmically, allowing us, for example, to see the Sun (almost) and
(later) see very faint stars; consequently, measuring things in Bels
frequently fits much better than a linear scale.
The average person, when she wants an evaluation of some man,
asks her girlfriend; "How would you rate him on a scale of 0 to 1 0?" (The
pat answet; of course, is - 1 .) Engineers, howevet; don't want to be like
"normal" people (fat chance); so, they evaluate everything on a scale of 0
to 1 00. This requires splitting Bels into deci-bels (abbreviated db) which
are obviously defined:

Attenuation (in db) = 10 loglQ(P/P2) (A9.3 .2)

This is still the same definition-we 're just working with 1 / 1 0th units.
Now, power is a good way to measure things-power makes
resistors get hot, etc. Electrical engineers, howevet; don't like to think
about resistors getting hot, so they work mostly with volts. Be that as it
may, it would still be nice to use this logarithmic scale in our work with
voltage. This is no problem-if we know the voltage and the resistance,
we can always calculate the power:

2
Power (in Watts) = y /R (A9.3.3)

If we substitute this into Equation (9.3.2) we will get:

I
There is, no doubt, a connection here with the notonous "language skills" of
engineers
214 Appendix 9.3

Attenuation (in db) = 10 10g\ O [(VtlRl)/(V��)] (A9.3.4)

Frequently, the two resistors will be the same value (when we measure two
voltages at the output of an amplifieJ; for example) and then:

Attenuation (in db) = 1 0 10g\ O(VtND (A9.3.5)

From our vast knowledge of logarithms we know this equals:

(A9.3.6)

This is still the same thing as defined in (A 9.3. 1)!!!

Similarly, the ratio of two currents (P = eR) is:

Attenuation (in db) = 20 log\ O(I/I2) (A9.3 .7)

Unfortunately, engineers abuse this formula, and frequently state


voltage and current ratios in dbs even when the two resistances are
different. Technicall� they are wrong; but, in certain situations (when
driving high impedance loads with a low impedance source, for example)
we can sort- of make sense of this. 2 However. . . it makes no sense
whatsoever when people do dumb things like stating impedance ratios in
terms of decibels. Now, surely you can plot impedance ratios on a
logarithmic scale, or even convert to the logarithms of impedance ratios,
but these are not decibels!... (and multiplying by 20 turns a misdemeanor
into alelony). We simply must draw the line somewhere . . . otherwise, the
definition becomes meaningless.

2
Under these conditions we can imagine some hypothetical load impedance
(significantly greater than the internal impedance of the source), across which these
voltage readings do indeed indicate legitimate power ratios, and satisfy Alex.
APPENDIX 9.4

SPECTRUM ANALYZER II

We have incorporated a lot of things to simulate a spectrum


analyze!; so let's get nght to work:

I ***************************************************************

, ***
F F T09-02 *** POS I T I VE FREQUENCY F F T ***
' T H I S PROGRAM ANALYZES T I ME DOMA I N DATA W I T H FRACT I ONAL F REQUENCY
' ANALYS I S . I T S I MULATES T H E PER FORMANCE REQU I RED FOR A FR EQUENCY
' ANALYZER AND I NCLUDES THE LATEST P F F F T ( F FT08 - 0 1 ) .
t ***************************************************************

10 SCREEN 9 , 1 : COLOR 1 5 , 1 : CLS ' SETUP D I SPLAY SCRE E N


12 Q X = 2 A 1 3 : Q I = 2 A 6 : WSF = l ' MAX & N OM S I ZE & S . F . CORR
14 N = 1 2 : XO = 50 : YO = 1 0 : ASF = 1 20 : SCALE = 1
16 Q = 2AN : N1 = N - 1 : Q1 = Q - 1 : Q2 = Q/2 : Q3 = Q2 - 1 : Q4 = Q/4
18 Q5 = Q4 - 1 : Q8 = Q / 8 : Q9 = Q8 - 1 : Q34 = Q2 + Q4 : Q 1 6 = Q / 16
20 D I M Y ( QX ) , C(QX ) , S ( QX ) , KC(Q2 ) , KS(Q2)
22 P I = 3 . 1 4 1 59265358979#: P2 = P I * 2: K1 = P2 / Q
24 I OFLG = 2: WT FLG = 1 ' SET TO GRAP H I C D I SPLAY AND NO WE I G HT I NG
26 KLOG = LOG ( 1 0 ) : YSF = LOG ( AS F )/KLOG : SK1 = 1
28 WEXP = 6: FRACF = 1
32 FOR I = 0 TO Q3 : KC( I ) = COS ( I * K1 ) : KS( I ) = S I N ( I * K1 ) : NEXT I
34 GOSUB 900 ' SETUP SYSTEM

************************************************

******** ********
MA I N MENU (ANALYZER SETUP)
************************************************

40 CLS : LOCATE 2, 30 : PR I NT "ANALYZER SETUP MENU"


42 LOCATE 6, l ' D I SPLAY MENU
60 PR I NT SPC ( 5 ) ; " 1 = ANALYZE 64 PO I NT ARRAY " : PR I NT
62 PR I NT SPC ( 5 ) ; "2 = ANALYZE 1 28 PO I NT ARRAY " : PR I NT
64 PR I NT SPC ( 5 ) ; "3 = ANALYZE 256 PO I NT ARRAY " : PR I NT
66 PR I NT SPC ( 5 ) ; "4 = ANALYZE 5 1 2 PO I NT ARRAY " : PR I NT
68 PR I NT SPC ( 5 ) ; "5 = ANALYZE 1 024 PO I NT ARRAY " : PR I NT
70 PR I NT SPC ( 5 ) ; "6 = ANALYZE 2048 PO I NT ARRAY " : PR I NT
72 PR I NT SPC ( 5 ) ; "7 = ANALYZE 4096 PO I NT ARRAY " : PR I NT
73 PR I NT SPC ( 5 ) ; "8 = CHANGE SYSTEM SETUP" : PR I NT
74 PR I NT SPC( 5 ) ; "9 = E ND " : PR I NT
78 PR I NT SPC( 1 0 ) ; "MAKE SELECT I O N : " ;
80 AS = I NKEYS: I F A S = " " T H E N 80
82 I F ASC(AS) <49 OR ASC(AS» 57 T H E N PR I NT AS; ,,= BAD KE Y " : GOTO 42
90 A = VAL (AS ) : ON A GOSUB 850 , 860 , 865 , 870 , 875 , 880 , 885 , 900 , 999
92 GOTO 40
94 RETURN

*****************************

*** ***
1 00 ' FORWARD TRANSFORM
*****************************
21 6 Appendix 9.4

110 C ( O ) = ( 5 ( 0 ) + S(Q2» / 2: C ( 1 ) = ( 5 ( 0 ) - S(Q2» / 2


112 FOR I = 1 TO Q3 : 1 2 = 2* 1 : I NDX = 0 ' B I T REVERSE DATA ADDRESSES
1 14 FOR J = 0 TO N 1 : I F I AND 2�J THEN I NDX = I NDX + 2 � ( N - 2 - J )
1 16 NEXT J
1 18 C ( 1 2 ) = ( S ( I NDX)+S ( I NDX+Q2» / 2 : C( 1 2+ 1 ) = ( S ( I NDX ) - S ( I NDX+Q2» /2
1 20 NEXT I
1 22 FOR I = 0 TO Q1 : 5 ( 1 ) = 0 : NEXT

********* REMA I N I NG STAGES **********


1 24 FOR M = 1 TO N 1 : QP = 2 � M : QPI = 2 � ( N 1 - M )
1 26 FOR K = 0 T O Q P I - 1
1 28 FOR J = 0 TO QP/ 2 : JO = J + ( 2*K*QP ) : J 1 = JO+QP : K2 = QP I *J
1 30 J I = J 1 - (2 * J )
1 32 CTEMP1 = C ( J O ) + C ( J 1 ) * KC(K2) - S ( J 1 ) * KS(K2)
1 34 STEMP1 = S ( J O ) + C ( J 1 ) * KS(K2) + S ( J 1 ) * KC(K2)
136 CTEMP2 = C ( J O ) - C ( J 1 ) * KC(K2) + S( J 1 ) * KS(K2)
1 38 S ( J I ) = ( C ( J 1 ) * KS(K2) + S ( J 1 ) * KC (K2) - S ( J O » / 2
1 40 C ( J O ) = CTEMP1 / 2 : S ( J O ) = STEMP1 / 2 : C ( J I ) = CTEMP2 / 2
1 42 NEXT J
1 44 NEXT K
1 46 NEXT M
1 48 FOR J = Q2 + 1 TO Q 1 : C ( J ) = 0 : S ( J ) = 0 : NEXT J
1 50 T9 = T I MER - T9
1 52 ON I O F L G GOSUB 300 , 350 ' D I SPLAY SPECTRUM
1 54 RETURN

300 ' ******* PR I NT OUTPUT *******


160 FOR Z = 0 TO Q 5 ' PR I NT OUTPUT
162 PR I NT US I NG "####" i Zi : P R I NT " "i
1 64 PR I NT US I NG "+##. #####" i SK1 * C ( Z ) i : PR I NT " "i
1 66 PR I NT US I NG "+##. #####" ; SK1 * S ( Z ) ; : PR I NT " ";
168 PR I NT U S I NG "####" ; Z + Q4; : PR I NT " "i
II .
1 70 PR I NT US I NG "+##. #####" ; SK1 * C ( Z + Q4 ) ; : PR I NT " ,
1 72 PR I NT US I NG "+##. #####" ; SK1 * S ( Z + Q4 )
1 74 NEXT Z
1 76 PR I NT "T = " ; T9: I NPUT "ENTER TO CONT I NU E " ; AS
1 78 R E TURN

I **********************************
, * PLOT SPECTRUM *
I **********************************
350 CLS : L I NE (XO - 1 , 1 1 ) - ( XO - 1 , YO + 320 ) ' DRAW Y AX I S
352 L I NE ( X O , Y O + 1 ) - ( XO + 500, Y O + 1 ) ' DRAW X AX I S
, **** DRAW 20 D B L I NE S ****
354 FOR I = 2 TO 1 4 STEP 2 : YSKT = I NT ( YSF*1 0*LOG ( 1 / ( 1 0� 1 » /KLOG)
355 L I N E ( X O , YO - YSKT ) - ( XO + 500, YO - YSKT)
356 YDB = C I NT ( . 3 + ( YO - YSKT ) / 1 3 . 9 ) : IF YDB > 25 T H E N 360
358 LOCATE YDB, 2 : PR I NT U S I NG "###" i 1 0 * I ;
360 NEXT I
362 YP = SCALE * SQR ( C ( I ) � 2 + 5 ( 1 ) � 2 ) F I ND RSS OF DATA PO I NT
Spectrum Analyzer II 217

364 I F YP = 0 THEN YP = - 1 60 : GOTO 370' OUT OF RANGE , SK I P


366 Y P = 2 0 * LOG ( YP ) / KLOG' F I ND D B VALUE
370 L I NE ( X O , Y O - ( YSF*YP » - ( X O , Y O - ( YSF*YP» ' S E T P E N T O OR I G I N
*******
372 FOR I = 0 T O Q3 ' ******* PLOT DATA PO I NTS
374 YP = SCALE * SQR ( C ( I ) A 2 + 5 ( 1 ) A 2) F I ND RSS OF DATA PO I NT
380 I F YP = 0 THEN YP = - 1 60 : GOTO 384 ' OUT OF RANGE , SK I P
382 Y P = 2 0 * LOG(YP) / KLOG' F I ND D B VALUE
384 L I NE - ( XO + XSF * I , YO - YSF * YP ) ' DRAW L I NE
386 NEXT I
388 LOCATE 1 , 70 : PR I NT "F = "; : PR I NT U S I N G "### . #" ; F8
390 RETURN

I **********************************

, * GENE RATE S I NE WAVE *

I **********************************

400 FOR I = 0 TO QDT : C ( I ) = 0: 5( 1 ) = S I N ( F9 * K1 * I ) : NEXT


402 FOR I = QDT+1 TO Q: C ( I ) = 0: 5( 1 ) = 0: NEXT
404 IF FLG80 = 1 THEN GOSUB 4 1 0
406 I F WT FLG = 2 T H E N 450
408 RETURN
410 FOR I = 0 TO QDT : 5 ( 1 ) = 5( 1 ) + . 0001*S I N ( 2*F9*K1 * 1 ) : NEXT
412 RETURN
450 ' **** WE I GHT I NG FUNCT I ON ***
452 FOR I = 0 TO QDT
454 5( 1 ) = 5( 1 ) * ( S I N ( I * PI / QD T ) A WEXP )
456 NEXT I
458 RETURN

, **********************************

*** ***
600 ' SPECTRUM ANALYZER
, **********************************

602 CLS : PR I NT : PR I NT
604 PR I NT SPC ( 20 ) ; "PREPAR I NG DATA - PLEASE WA I T "
61 0 GOSUB 400 ' GENERATE S I NUSO I D
620 GOSUB 1 00 ' ANALYZE SPECTRUM
624 REPT = 0 ' RESET REPEAT FLAG
626 LOCATE 24 , 65 : PR I NT "RETURN TO E X I T " ;
628 A S = I NKEYS : I F AS = " " T H E N 628' WA I T USER I NPUT
630 I F ASC(AS) = 0 THEN GOSUB 650 ' CURSOR HAS LEAD I NG ZERO
632 I F REPT = 1 THEN 620 ' ANALYZE SPECTRUM AGA I N
634 RETURN ' BACK T O MA I N MENU
650 ' *** HANDLE CURSOR KEYS ***
652 A = ASC( R I GHTS(AS, 1 » , WH I CH CURSOR
654 I F A < 75 OR A > 77 OR A = 76 THEN 669 ' NOT A CURSOR KEY
656 I F A = 75 THEN F8 = F8 - . 1 ' I NC FREQUENCY
658 I F A = 77 THEN F8 = F8 + . 1 ' D E C . FREQUENCY
660 F9 = F8 * Q / Q I ' SCALE FOR CURRENT ARRAY S I ZE
662 GOSUB 400 ' GENERATE NEW S I NUSO I D
664 REPT = 1 ' S E T REPEAT FLAG
669 RETURN ' DO IT AGA I N SAM
218 Appendix 9.4

I *********************************************

* *
800 I SETUP FRACT I ONAL FREQUENCY ANALYZER
I *********************************************

850 N = 6: N1 = 5 : Q = 2 A N I SET ARRAY S I ZE


852 Q I = Q I FRACF : Q2 = Q I 2 : Q3 = Q2 - 1 : Q4 = Q I 4 : Q5 = Q4 - 1
853 Q8 = Q I 8 : Q9 = Q8 - 1 : Q16 = Q I 1 6 : Q34 = Q2 + Q4
854 F8 = 1 6 : F9 = F8 * Q I Q I : K1 = P2 I Q
855 QDT = Q I FRACF - 1 I NEW TWIDDLES NEXT L I NE
856 FOR I = 0 TO Q3 : KC( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I ) : NEXT
857 XSF = 500/Q2 : SCALE = WSF * FRACF * 2
858 GOSUB 600 I ANALYZE SPECTRUM
859 RETURN I BACK TO MA I N MENU
860 N = 7: N1 = 6: Q = 2 A N
862 GOTO 852
865 N = 8: N1 = 7 : Q = 2 A N
867 GOTO 852
870 N = 9: N1 = 8: Q = 2 A N
872 GOTO 852
875 N = 10: N1 = 9: Q = 2 A N
877 GOTO 852
880 N = 1 1 : N1 = 10: Q = 2 A N
882 GOTO 852
885 N = 1 2 : N1 = 1 1 : Q = 2 A N
887 GOTO 852

, ***********************

I * *
SYSTEM SETUP
, ***********************

900 CLS : R T F L G = 1 : PR I NT SPC ( 20 ) ; " SYSTEM SETUP MENU"


902 PR I NT LOCATE ( 5 ) : PR I NT "1 = D I SPLAY "
904 PR I N T P R I NT " 2 = WE I GHT I NG FUNCT I ON"
906 PRI NT P R I N T "3 = FRACT I ONAL FREQUENCY"
907 PR I N T PR I NT " 4 = - 8 0 DB COMPONENT"
908 PR I N T PR I NT "5 = E X I T "
910 AS = I NKEYS : I F A S = " " T H E N 9 1 0
91 2 A = ASC ( AS ) : I F A < 4 9 O R A > 5 3 THEN 900
914 A = A - 48 : ON A GOSUB 920 , 930, 970, 988, 990
916 ON R T F L G GOTO 900, 928
, **********************

920 CLS
922 PR I NT "USE GRAPH I C D I SPLAY ( YIN ) " ;
924 AS = I NKEYS: I F AS = " " T H E N 924
926 I F AS = "N" OR AS = " n " THEN I OFLG = 1 E LSE I OFLG = 2
928 RETURN
I **********************
930 CLS : PR I NT "WE I GH T I NG FUNCT I ON ON (YIN ) " ;
932 AS = I N KEYS : I F AS = " " THEN 932
934 I F AS = "N" OR AS = " n " THEN WT FLG = 1 : WSF = 1 : GOTO 956
936 WTFLG = 2 : PR I NT
938 PR I NT "CHANGE WE I GHT I NG FUNCT I ON EXPONENT?"
Spectrum Analyzer II 219

940 AS = I NKEYS : I F AS = " " THEN 940


942 I F AS = "N" OR AS = " n " THEN 952
944 PR I NT "1 = S I N"2" : PR I NT "2 = S I N"4" : PR I NT "3 = S I N"6"
946 AS = I NKEYS : I F AS = " " T H E N 946
948 A = ASC(AS ) : I F A < 49 OR A > 51 THEN 946
950 A = A - 48 : WEXP = 2 * A
952 WSF = 2 : I F A = 2 THEN WSF = 8 / 3
954 I F A = 3 THEN WSF = 16 / 5
956 RETURN

I ***********************

970 CLS : PR I NT : PR I NT "SELECT FRACT I ONAL FREQUENCY FOR ANALYS I S "


972 PR I NT : PR I N T "1 = 1 / 1 " ; SPC ( 20 ) ; "4 = 1 /8"
974 PR I NT "2 = 1/2"; SPC ( 20 ) ; "5 = 1 / 16"
976 PR I NT "3 = 1 /4 " ; SPC ( 20 ) ; "6 = 1 /32"
978 AS = I NKEYS : I F AS = " " THEN 978
980 A = ASC(AS ) : I F A < 49 OR A > 54 THEN 978
982 A = A - 49 : FRACF = 2 " A
984 RETURN

I ***********************

988 FLG80 = 1 - FLG80 : RETURN


990 RTFLG = 2: RETURN

, ***********************

999 STOP ' THAT ' S ALL FOLKS

Except for a few constants necessary to make this program run ,


the first part of the program is the same as FFT9. 0 1 The Main Menu
(array size selection) is now located at line 40, and now the fraction to be
packed with zeros is variable (we will need this to experiment). Selection
8 gets us to the System Set-up, where we find another menu.
1 . Weighting Function - Selection 2 jumps to line 930. Line 934
checks if we are turning weighting OFF. If so, both WTFLG and WSF are
set to 1 and we exit. Note ' You will find the WTFLG in the generate
sinusoid routine (line 406) where it causes a jump to the weighting sub­
routine (line 450) only if it equals 2 WSF is used in the Plot Data routine
(line 372) where it corrects the scalefactorfor the attenuation introduced
by the weightingfunction. If we want weighting ON we set the WTFLG
= 2 (line 936) and then ask if the weighting exponent is to be changed (see
p. 1 03 in text). Three options are offered at line 944, and we calculate
WEXP at line 950 and set WSF before exiting this routine. Note: WEXP
is used in the Weighting sub-routine at line 454.
2. Selection of the fractional frequency configuration is performed
220 Appendix 9.4

in the sub-routine at line 970. At line 980 the value entered is checked for
a valid selection, then the fraction denominator FRACF is calculated (line
982). Note: FRA CF is used in the Array Selection (line 852) to set QI.
It s also used in line 855 to set QDT (i e., the length 0/ the actual data),
and also in the Plot Data routine (to set the scale/actor-line 85 7).
3. We need to talk about the Generate Sinewave Function routine
(line 400). At line 4 1 2 we generate two sine waves-the second is 80 db
down and separated by 50% of the primary functions frequency (you may
want to change this). Also, if the weighting function is selected, we jump
to the Weighting sub-routine at line 406. Weighting is handled (lines 452
through 456) by multiplying the data by a half cycle sine wave raised to
the power WEXP (see p. 1 03).
4. We must also talk about the Plot Data routine (line 350-390),
but we we calculate the X and Y scale factors at line 857 (where they are
determined). At line 350-352 we draw Y and X axes. The data is now
displayed in a logarithmic format and, when we draw 20 db attenuation
marks (354-360), we must calculate their logarithms (line 354). Likewise,
when we plot the data (lines 372-386) we must caluclate the logarithm of
that (line 382).
5. Finally, this program is intended for experimentation-to get
a feel for the various configurations and what they can do. It's limited in
speed and size but it can still be helpful in gaining an understandmg of how
spectrum analysis is performed with the FFT and the problems to be
expected. It's also intended for experimentation with the code . . . and
possible routines.... For example, you might want to experiment with
various weighting functions so don't hesitate to make variations.
APPENDIX 10.0

NEGATIVE FREQUENCIES

AI0.1 NEGATIVE FREQUENCIES

Why (you have probably


asked yourself) would sinusoids
with frequencies equally above and
below Nyquist give identical re­
sults? Let 's look at a m o d i fi e d
version o f Figure 1 0.4 which plots
s i n u s o i d s b o th 1 0 % above the
Nyquist and 1 0% below. As you
might already have guessed, both these sinusoids have the same value at
the sampling points-but why? Well, a cosine wave is symmetrical about
any argument o f N r (where N is any
integer including zero). That is, starting
at the peak value (positive or negative) of
a cosine, and moving either backward or
forward (by equal amounts), yields the
-t-
im-e-.--I----I----lo
same value (Fig. A I O.2). If the sample
times occur precisely at ts 2N/fN (i.e., at
=

twice the Nyquist frequency ), then a


cosine wave 1 0% above this frequency Figure A I O.2
will advance by precisel y the amount that
a cosine 1 0% below will be retarded. That is, the argument of a sinusoid
1 0% above Nyquist will be:

(AIO. I )

and the argument of a sinusoid 10% below the Nyquist will be:

(A I O.2)

Cosines at these arguments must give identical values-sinusoids really are


simple things.
On the other hand, sine waves (as opposed to cosine waves) whose
frequencies are equally above and below the Nyquist do not yield identical
values when sampled at ts = 2N/frr- they yield values that are the negative
of each other (Fig. A I 0.3). So, for the general case of complex sinusoids,
222 Appendix 10.1

if those below the Nyquist are legiti­


mate, their illegitimate equivalents (i.e.,
those above the Nyquist), if they are to
yield the same digitized value, must t-----Tt--\----++-+---'I--f­
have negated sine components (but the
cosine components remain positive) . . . .
Now, any t i m e we deal with 1 . 1 Nyquist
complex sinusoids of this form ( i . e . , Figure A I O.3
identical cosine components but sine components that are the negatives of
each other) we 're dealing with complex conjugates (you remember these
from p. 1 0). These come about when the arguments of the sinusoids are
identical but one is negative, and that can happen only when either time or
frequency is negative. So, what's negative frequency. .. or negative time for
that matter?
When they launch a rocket over at the Cape they always count
down: "T minus 5 minutes and counting" . . . and later, "T minus 1 0, 9 8, . .
, .

3, 2, 1 . ..Lifto.fJ!" Actually, they're not counting down-they 're counting


up in negative time. Negative time results when we pick some arbitrary
point in time (regardless of whether it's in the future, past, or the present)
and call it "T-O." Let's look at what happens:

_ Negative _ _ Positive ____ __+


T-O
Time Time

Figure AI O.4 - Sinusoids in Positive and Negative Time

If we plot Cos(c.rt) and Sin(wt) about t = 0, they will necessarily


look like the sinusoids of Fig. AIO.4-time to the left of T-O is negative
and time to the right is positive. Now, when we "count down" to launch
our rocket, we have no choice but to count. . . "T-3, -2, - I , . . . "; however,
when we trace sinusoids back in negative time, we invariably think of
increasing numerical values in the negative direction. In any case, this
negative argument yields a cosine wave that has the same value at any
point in negative time that it has in positive time-and a sine wave that has
negative values for corresponding points in negative time. This is written:
Negative Frequencies 223

Cos(2rt) = Cos(2rf{-t)) (A l O.3)


and: I
Sin(2rft) = -Sin(2rf{-t)) ( A l O.4)

Now, from Fig. A l O.5 below, we see that when we deal with a
complex sinusoid, the relationship we have just described still holds for the

_-- Negative __
T-0 __ Positive --_
Time Time

Figure A l O.5 - Complex Conjugation

sine and cosine components of that wave; so, clearly a negative time
argument yields the complex conjugate ofthe positive time argument (that
is, in terms phasors, the negative time domain waveform will be generated
by the complex conjugate of the positive time phasor).
Now, when we deal with the harmonics above the Nyquist in the
FFT, it's obvious we're not dealing with negative time; howevet; it's not
obvious we're dealing with negative frequency-we certainly haven't
deliberately introduced negative frequencies. In Equations (A 1 0. 1 ) and
( A l O.2) above, however, we see that, for each sampling pulse, the
argument steps forward by half a cycle of the Nyquist signal frequency ±
the difference between Nyquist and the sinusoid being digitized:

( A l O.5)
l
in both of these cases there is a symmetry, although it's obviously not the
same kind of symmetry. The symmetry exhibited by the cosine wave is called even while
the symmetry displayed by the sine wave is called odd If the hannonic components of
a function are composed of only sine waves, the whole function will display this odd
symmetry (i.e., for negative arguments the function itself will be equal to the negative of
its positive counterpart). Functions composed of only cosine components will exhibit
even symmetry. A square wave constructed of sine waves, for example, exhibits odd
symmetry 1 Functions containing both sine and cosine components (i.e., complex
sinusoids) will exhibit neither form of symmetry discussed above; nonetheless, the odd
and even condition stili holds for the sine and cosine components of these functions.
224 Appendix 10.1

Relative to the Nyquist frequency then, one of these sinusoids is moving


positively and the other is moving negatively (see Figs. A I O. I and A I O.3).
It's as if, from sample to sample, the argument of one is negative (relative
to the Nyquist frequency)-the result is identical to that obtained if we
were using a negative argument; but, no matter whether we look at this
mathematically or otherwise, we're moving forward in positive time! The
digitized data is indistinguishable from data generated via a negative
frequency s inusoid. What we have done here (via the samp l i ng
mechanism) is establish the Nyquist sampling rate as the zero reference
frequency-just as we establish an arbitrary point in time as T-O. In
sampled data, frequencies below the sample rate must be negative while
frequencies above must be positive.
APPENDIX 11.1

OVERSAMPLE DEMONSTRATION

We must make the following changes to the basic PFFFT of


Chapter 8 . Replace everything up to line 100 with:

, *** F FT 1 1 . 0 1 - Q ( =2AN ) PO I N T F F T ( POS I T I VE FREQUENC I E S ONLY) ***


, I L LUSTRATES OVERSAMPL I NG - ALSO SEE F F T 1 1 . 02
10 SCREEN 9, 1 : COLOR 1 5 , 1 : CLS ' SETUP D I SPLAY SCREEN
1 2 CLS : PR I NT " I NPUT NUMBER OF DATA PO I NTS AS 2AN . "
14 I NPUT "N = "; N
16 Q = 2AN : N1 = N - 1 : Q1 = Q - 1 : Q2 = Q/2 : Q3 = Q2 - 1 : Q4 = Q/4
18 Q5 = Q4 - 1 : Q8 = Q/8: Q9 = Q8 - 1 : Q34 = Q2 + Q4: Q16 = Q/1 6
20 D I M C ( Q* 1 6 ) , S(Q * 1 6 ) , KC(Q2 * 1 6 ) , KS(Q2* 1 6 ) ' D I M DATA
30 PI = 3 . 1 4 1 592653589793#: P2 = 2 * P I : K1 = P2/Q
, *** GENERATE TWIDDLE FACTORS ****
32 FOR I = 0 TO Q2 : KC( I ) = COS ( K 1 * 1 ) : KS( I ) = S I N ( K1 * 1 ) : NEXT
34 I OFLG = 2' SET OUTPUT TO GRAPH I C D I SPLAY
******** MA I N MENU ** **** * *
40 CLS ' D I SPLAY MA I N MENU
50 P R I NT SPC ( 3 D ) ; "MA I N MENU" : PR I NT : PR I NT
60 PR I NT SPC( 5 ) ; " 1 = ANALYZE COS I NE FUNCT I ON " : PR I NT
62 PR I NT SPC( 5 ) ; "2 = I NVERSE TRANSFORM" : P R I NT
64 PR I NT SPC( 5 ) ; "3 = SETUP D I SPLAY" : PR I NT
65 PR I NT SPC ( 5 ) ; "4 = OVERSAMPLE DATA" : P R I NT
66 PR I NT SPC( 5 ) ; "5 = E X I T " : PR I NT
70 PR I NT SPC( 1 0 ) ; "MAKE SelECT I ON : " ;
80 AS = I NKEYS : I F AS = " " THEN 80
90 A = VAL (AS ) : ON A GOSUB 600 , 200 , 800, 700, 990
95 GOTO 40

Change line 6 1 0 to:

61 0 FOR I = 0 to Q1 : C( I ) = 0: S( I ) = COS ( F9 * F1 * I ) : NEXT I

Then, at line 700, we add:

700 REM *** 1 6X OVERSAMPLE DATA ***


702 FOR I = Q2 TO Q ' CLEAR UPPER ARRAY
704 C( I ) = 0: S( I ) = 0
706 NEXT I
710 N = N + 4 : N1 = N - l ' I NCREASE 2AN EXPONENT
714 Q = 2 A N : Q1 = Q - l ' I NCREASE Q & GEN NEW CONSTANTS
716 Q2 = Q / 2: Q3 = Q2 - 1 : Q4 = Q / 4 : Q5 = Q4 - 1 : Q8 = Q / 8
718 K1 = P2 / Q
, *** GENERATE NEW TWIDDLE FACTORS ** **
720 FOR I = 0 TO Q2 : KC ( I ) = COS ( K 1 * I ) : KS ( I ) = S I N ( K 1 * I ) : NEXT
722 GOSUB 350 ' PLOT OVERSAMPLED DATA
226 Appendix 1 1 .1

724 I NPUT AS ' WA I T USER - DATA IS NOW OVERSAMPLED


726 RETURN

800 REM *** SETUP P R I NTOUT/GRAPH I C D I SPLAY ***


802 CLS ' CLEAR SCREEN
804 I NPUT "GRAPH I C D I SPLAY ( Y/N ) " ; AS
806 I F AS = "Y" THEN I OFLG = 2 ELSE I OFLG = 1
808 RETURN

990 END : STOP

This illustration generates a sinusoid and takes the transform


automatically. It might be a good idea to reconstruct this signal just to
verify the expected intermodulation waveform is obtained. Next, generate
the sinusoid again; but, this time, execute the oversampling routine before
reconstructing. Let's look at the specifics of the program.
Note that, at line 20, we dimension the arrays for 1 6 times their
normal size. This is necessary to handle the oversampled spectrum size.
At line 702-706 we clear the upper portion of the data arrays. At line 7 1 0
w e simply increase the value of N by 4 and at 7 1 4 w e generate the new
value ofQ (thereby increasing the array size by 1 6x). At 7 1 6 we re-define
all the constants used in the PFFFT that refer to the array size and, at line
720, we generate new twiddle factors. We display this newly oversampled
spectrum and that is all there is to it. When we perform the inverse
transform we will be reconstructing a time domain array that has 16 times
as many data points in the same original interval.
You might want to change the oversampling multiplier to 8x, 4x,
etc., to get a feel for what these multipliers do.
The problem with this technique may be illustrated by simply
running the above demonstration and selecting a frequency of F = 4.5. We
will talk about handling this difficulty in the next appendix.
APPENDIX 11.2

OVERSAMPLING II

We may attempt to solve the problem of oversampling fractional


frequencies by using a weighting function. The following routines must
be added to the program of the preceding appendix:

, *** FFT1 1 . 02 - Q ( =2AN) PO I NT F F T ( POS I T I VE FREQUE N C I E S ON L Y ) ***


, I L LUSTRATE OVERSAMP L I NG ALSO SEE F F T 1 1 . 02
1 0 SCREEN 9, 1 : COLOR 1 5 , 1 : CLS ' SETUP D I SPLAY SCREEN
12 CLS : PI = 3 . 141 592653589793#: P2 = 2 * P I
1 4 1 0FLG = 2 ' SET OUTPUT T O GRAPH I C D I SPLAY
16 PR I NT " I NPUT NUMBER OF DATA POI NTS AS 2AN . "
18 GOSUB 86
40 CLS ' D I SPLAY MA I N MENU
50 PR I NT SPC(30 ) ; "MA I N MENU " : P R I NT : P R I NT
60 PR I NT SPC ( 5 ) ; "1 = ANALYZE S I NE FUNCT I O N " : PR I NT
62 PR I NT SPC( 5 ) ; "2 = I NVERSE TRANSFORM " : PR I NT
64 PR I NT SPC( 5 ) ; "3 = SETUP D I SPLAY" : P R I NT
65 PR I NT SPC( 5 ) ; "4 = OVERSAMPLE DATA " : P R I NT
66 PR I NT SPC ( 5 ) ; "5 = E X I T" : P R I NT
70 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
80 A$ = I NKEY$: I F A$ = " " THEN 80
82 A = VAL ( A$ ) : ON A GOSUB 600 , 200 , 800 , 700 , 990
84 GOTO 40
, *************
86 I NPUT "N = "; N I
88 N = N I : Q = 2 A N : K 1 = P 2 I Q: N1 = N - 1 : Q 1 = Q - 1
90 Q2 = Q I 2 : Q3 = Q2 - 1 : Q4 = Q I 4: Q5 = Q4 - 1 : Q8 = Q I 8
92 RED I M C(8 * Q ) , S ( 8 * Q ) , KC ( 4 * Q ) , KS(4 * Q) , D I M DAT & TWIDDLE
93 ' *** GENERATE TWIDDLE FACTORS ****
94 FOR I = 0 TO Q2 : KC( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I ) : NEXT
96 RETURN

400 ' GENERATE S I NUSOID


410 FOR I = 0 TO Q1
416 C ( I ) = 0 : S( I ) = COS ( F9 * K1 * I )
418 NEXT
432 GOSUB 450 ' I NVOKE WE I GHT I NG FUNCT I ON
434 GOSUB 370 ' LOOK AT WE I GHTED FUNCT I ON
436 I NPUT A$ , AWA I T USER ' S PLEASURE
440 RETURN

450 ' WE I GHT I NG FUNCT I ON


452 FOR I = 0 TO Q1
454 5( 1 ) = S ( I ) * ( S I N ( I * P I I Q ) A 6 )
456 NEXT I
458 RETURN
228 Appendix 1 1.2

470 ' I NVERSE WE I GHT I NG FUNCT I ON


472 FOR I = 1 TO Q1
474 S ( I ) = S( I ) / ( S I N ( I * P I / Q ) A 6)
476 NEXT I
478 RETURN

600 CLS : PR I NT : PR I NT ' GENERATE COS I NE COMPONENT


601 GOSUB 88 ' RESET ARRAY S I ZE
602 I NPUT "PLEASE SPEC I FY FREQUENCY " ; F9
604 PR I NT "PREPAR I NG DATA I NPUT - PLEASE WAI T ! "
610 GOSUB 400 ' GENERATE COS I NE WAVE
620 GOSUB 1 00 ' PER FORM P F F FT
630 RETURN

700 REM *** 8X OVERSAMPLE DATA ***


702 FOR I = Q2 TO Q ' CLEAR UPPER ARRAY
704 C ( I ) = 0 : S( I ) = 0
706 NEXT I
71 0 N = N + 3 : N1 = N - l ' I NCREASE 2AN EXPONENT
712 Q = 2 A N : Q1 = Q - l ' I NCREASE Q & GEN NEW CONSTANTS
716 Q2 = Q / 2 : Q3 = Q2 - 1 : Q4 = Q / 4: Q5 = Q4 - 1 : Q8 = Q / 8
718 K1 = P2 / Q
719 , *** GENERATE NEW TWIDDLE FACTORS ****
720 FOR I = 0 TO Q2: KC ( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I ) : NEXT
722 GOSUB 350 ' D I SPLAY OVERSAMPLED DATA
724 I NPUT AS ' WA I T USER - DATA IS NOW OVERSAMPLED
726 RETURN

In addition to these changes we must add a line at the end of


the Inverse Transform routine:

243 GOSUB 470 ' PER FORM I NVERSE WE I GHT I NG

This program will now automatically invoke the weighting


function when the data is generated. . . and remove it when the data is
reconstructed. You will notice that we have placed the initialization of
the data array constants in a separate sub-routine (lines 86-96). This
eliminates the need to restart the program after each demonstration (see
line 60 1 ).
Note that, in the Inverse Weighting routine, we do not divide
the first and last data points by the weighting function. This would
obviously involve dividing by zero.
APPENDIX 11.3

DIGITAL AUDIO ANALYZER

This program is a modification of the spectrum analyzer we


developed in Appendix 9.4. Unfortunately it has been modified to the
point that the original configuration is obscured.
I ****************************************************************
*** F FT l l - 03 *** POS I T I VE FREQUENCY F FT ***
' T H I S PROGRAM S I MULATES A SPECTRUM ANALYZER USED TO ANALYZE D I G I TAL
' AUD I O FOR NON - L I NEAR D I STORT I ON . I T I S BASED ON THE ANALYZER OF
' F FT09-02 AND I NCLUDES THE LATEST P F F FT ( F FT08 - 0 1 ) .
, *****************************************************************
10 SCREEN 9, 1 : COLOR 1 5 , 1 : CLS ' SETUP D I SPLAY SCREEN
1 2 QX = 2 A 13: QI = 2 A 6 : WSF = l ' MAX & NOM S I ZE & S . F . CORR
14 N = 1 2 : XO = 5 0 : yO = 1 0 : ASF = 224
16 Q = 2 A N : Nl = N - 1 : Ql = Q - 1 : Q2 = Q/2 : Q3 = Q2 - 1 : Q4 = Q/4
18 Q5 = Q4 - 1 : Q8 = Q 1 8: Q9 = Q8 - 1 : Q34 = Q2 + Q4 : Q 1 6 = Q/ 1 6
2 0 D I M Y ( QX ) , C(QX ) , S ( QX ) , KC ( Q2 ) , KS(Q2)
22 P I = 3 . 141 59265358979# : P2 = P I * 2: Kl = P2 1 Q: NYQ = 22050
24 I OFLG = 2: WT FLG = 1 ' SET TO GRAPH I C D I SPLAY AND NO WE I GH T I N G
2 6 X S F = 500 1 Q2 : KLOG = LOG( 1 0 ) : Y S F = LOG(AS F ) 1 KlOG : S K l = 1
28 WEXP = 6: FRACF = 1 ' WE I GH T I NG EXP = 6 & FRAC FREQ = 1 / 1
3 0 AMP = 1 : MAMP = 2 A 1 5 : OVSAP = 2 : T 1 2 = 1 _ 059463 1 #
32 GOSUB 900 ' SETUP SYSTEM
34 GOSUB 885 ' SET UP I N I T I AL ARRAY S I ZE OF 2 A 1 2
36 GOTO 600 ' START ANALYZER
98 ' *****************************
1 00 ' *** FORWARD TRANSFORM ***
1 02 ' *****************************
1 06 ' *** TRANS FORM STAGE 1 ***
110 C(O) ( S ( O ) + S(Q2» 1 2 : C ( l ) = ( S ( O ) - S ( Q 2 » 1 2
112 FOR I = 1 TO Q3 : 1 2 = 2 * 1 : I NDX = 0 ' B I T REVERSE DATA ADDRESSES
1 14 FOR J = 0 TO N l : I F I AND 2AJ T HEN I NDX = I NDX + 2 A ( N - 2 - J )
1 16 NEXT J
1 18 C ( 1 2 ) = ( S ( I NDX )+S( I NDX+Q2» / 2 : C ( 1 2+1 ) = ( S ( I NDX ) - S ( I NDX+Q2» /2
1 20 NEXT I
1 22 FOR I = 0 TO Q l : S( I ) = 0 : NEXT I
********* REMA I N I NG STAGES **********
1 24 FOR M = 1 TO N l : QP = 2 A M : QPI = 2 A ( N l - M )
1 26 FOR K = 0 T O Q P I - 1
1 28 FOR J = 0 TO QP/2 : JO = J + ( 2 * K*QP ) : J l = JO + Q P : K2 = QP I * J
130 J I = J 1 - (2 * J )
132 CTEMPl = C ( J O ) + C ( J l ) * KC (K2) - S ( J l ) * KS(K2)
134 STEMPl = S ( J O ) + C ( J l ) * KS (K2) + S ( J l ) * KC (K2)
136 CTEMP2 = C ( J O ) - C ( J l ) * KC(K2) + S ( J l ) * KS( K2 )
1 38 S( J I ) = ( C ( J l ) * KS(K2) + S ( J l ) * KC(K2) - S ( J O » 1 2
140 C ( J O ) = CTEMPl / 2: S ( J O ) = STEMPl / 2: C ( J I ) = CTEMP2 1 2
142 NEXT J
144 NEXT K
1 46 NEXT M
1 48 FOR J = Q2 + 1 TO Q l : C ( J ) = 0 : S ( J ) = 0 : NEXT J
1 52 GOSUB 350 ' D I SPLAY SPECTRUM
1 54 RETURN
230 Appendix 1 1.3

I **********************************
, * *
PLOT SPECTRUM
, **********************************

350 CLS : L I NE (XO - 1 , Y O ) - ( XO - 1 , YO + 330 ) ' DRAW Y AX I S


352 L I NE ( X O , Y O + 1 ) - (XO + 500, Y O + 1 ) ' DRAW X AX I S
****
, DRAW 2 0 D B L I NES ****
354 FOR I = 2 TO 14 STEP 2: YSKT = I NT ( YS F * 1 0* LOG( 1 / ( 1 0 A I » /KLOG)
356 L I NE ( X O , YO - YSKT ) - ( XO + 500 , YO - YSKT)
358 YDB = C I NT ( . 4 + ( YO - YSKT ) / 1 5 . 666 ) : I F YDB > 25 THEN 362
360 LOCATE YDB, 2 : PR I NT US I NG "### . " ; 1 0 * I ;
362 NEXT I
364 YP = SCALE * SQR ( C ( 0 ) A2 + S ( 0 ) A 2 ) , F I ND RSS OF DATA PO I NT
366 I F YP = 0 THEN YP = -330 : GOTO 370' OUT OF RANGE , SK I P
368 Y P = 2 0 * LOG ( Y P ) / KLOG' F I ND D B VALUE
370 L I NE ( X O , YO - YSF * YP) - ( XO, YO - YSF * YP ) ' SET PEN TO OR I G I N
372 FOR I = 0 T O Q3 ' ******* PLOT DATA PO I NTS *******

374 YP = SCALE * SQR ( C ( I ) A 2 + S( I ) A 2 ) , F I ND RSS OF DATA PO I NT


380 I F YP = 0 THEN YP = -330 : GOTO 384 ' OUT OF RANGE , SK I P
382 Y P = 20 * LOG ( Y P ) / KLOG ' F I ND DB VALUE
384 L I NE - ( XO + XSF * I , YO - YSF * YP ) ' DRAW L I NE
386 NEXT I
388 LOCATE 1 , 66 : PR I NT "F = " ; : PR I NT US I NG "##### . ###" ; F8
390 RETURN
, **********************************

, * *
GENERATE S I NE WAVE
, **********************************

400 FOR I = QDT TO Q: C ( I ) = 0 : S ( I ) = 0: NEXT


404 FOR I = 0 TO QDT : C( I ) = 0
408 Y = I NT ( MAMP * AMP * S I N ( F9 * K1 * I » / MAMP
410 S( I ) = Y
412 NEXT I
414 I F WT FLG = 2 THEN 450 ' USE WE I GHT I NG FUNCT I ON
420 RETURN
450 ' **** WE I GH T I NG FUNCT I ON ***
452 FOR I = 0 TO QDT
454 S ( I ) = S ( I ) * ( S I N ( I * P I / QDT ) A WEXP )
456 NEXT I
458 RETURN
I **********************************
*** ***
600 ' SPECTRUM ANALYZER
I **********************************

602 CLS : PR I NT : P R I NT
604 I N PUT "PLEASE SPEC I FY START I NG FREQUENCY"; F8
606 F9 = F8 * FRACF * Q2 / NYQ
610 GOSUB 400 ' GENERATE S I NUSO I D
61 2 GOSUB 1 00 ' ANALYZE SPECTRUM
614 REPT = 0 ' RESET REPEAT F LAG
620 LOCATE 1 , 40 : P R I NT "ESC TO CHANGE SYSTEM : " ;
622 A$ = I N KEY$ : I F A$ = " " THEN 632 ' E X I T OR RUN?
624 I F ASC(A$ ) = 0 THEN GOSUB 650 ' CURSOR HAS LEAD I NG ZERO
626 I F ASC (A$) = 27 T HEN GOSUB 900
632 I F REPT = 1 THEN 6 1 2 ' ANALYZE SPECTRUM AGA I N
634 GOTO 606 ' BACK T O MA I N MENU
650 ' *** HANDLE CURSOR KEYS ***
652 A = ASC ( R I GHT$(A$, 1 » , WH I C H CURSOR
Digital Audio Analyzer 231

654 I F A < 72 OR A > 80 THEN 664 ' NOT A CURSOR KEY


656 I F A = 72 THEN AMP = AMP * 1 0 : I F AMP > 1 THEN AMP =
658 I F A = 75 THEN F8 = F8 - . 0625 ' I NC FREQUENCY
660 I F A = 77 THEN F8 = F8 + . 0625 ' DEC . FREQUENCY
662 I F A = 80 THEN AMP = AMP I 1 0 : I F AMP < . 00001 THEN AMP = . 00001
663 GOSUB 670
664 F9 = F8 * FRACF * Q2 I NYQ ' SCALE FOR CURRENT SYSTEM
666 GOSUB 400 ' GENERATE NEW S I NUSO I D
668 REPT = 1 : RETURN ' SET REPEAT FLAG AND REPEAT
670 I F F8 < NYQ I ( OVSAP * FRAC F ) THEN 676
672 LOCATE 1 0 , 1 0 : I NPUT " FREQ OUT OF RANGE - ENTER TO CONT I NU E " ; B$
674 I NPUT "PLEASE SELECT START I NG FREQ"; F8
676 RETURN

************************************************
******** ARRAY S I ZE MENU (ANALYZER SETUP) ********
********************* ******************* ********
800 CLS : LOCATE 2, 30 : PR I NT "ANALYZER SETUP MENU"
802 LOCATE 6 , l ' D I SPLAY MENU
810 PR I NT SPC ( 5 ) ; "1 = ANALYZE 64 PO I NT ARRAY" : PR I NT
812 PR I NT SPC( 5 ) ; "2 = ANALYZE 1 28 PO I NT ARRAY" : PR I NT
814 PR I NT SPC( 5 ) ; "3 = ANALYZE 256 PO I NT ARRAY " : PR I NT
816 PR I NT SPC ( 5 ) ; "4 = ANALYZE 5 1 2 PO I NT ARRAY" : PR I NT
818 PR I NT SPC ( 5 ) ; "5 = ANALYZE 1 024 PO I NT ARRAY " : PR I NT
820 PR I NT SPC ( 5 ) ; "6 = ANALYZE 2048 PO I NT ARRAY " : PR I NT
822 PR I NT SPC ( 5 ) ; "7 = ANALYZE 4096 PO I NT ARRAY " : PR I NT
826 PR I N T SPC ( 5 ) ; "9 = E X I T MENU" : PR I NT
828 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
830 A$ = I NKEY$: I F A$ = " " THEN 830
832 I F ASC(A$ )<49 OR ASC(A$» 57 THEN PR I NT " I NVAL I D KEY " : GOTO 830
840 A = VAL (A$ ) :
842 ON A GOSUB 850 , 860, 865 , 870, 875 , 880 , 885 , 900 , 990
844 RETURN

, * SETUP FRACT I ONAL FREQUENCY ANALYZER *


850 N = 6: N1 = 5 : Q = 2 A N ' SET ARRAY S I ZE
852 Q I = Q I FRAC F : Q2 = Q I 2: Q3 = Q2 - 1 : Q4 = Q I 4 : Q5 = Q4 - 1
853 Q8 = Q I 8: Q9 = Q8 - 1 : Q 1 6 = Q I 1 6 : Q34 = Q2 + Q4
854 F8 = 1 6 : F9 = F8 * Q I Q I : K1 = P2 I Q
585 QDT = Q I FRACF - 1 ' NEW TWIDD L ES NEXT L I NE
856 FOR I = 0 TO Q3: KC ( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I ) : NEXT
857 XSF = 500 * OVSAP I (QI * FRAC F ) : SCALE = WSF * FRACF * 2
858 RETURN ' BACK TO MA I N MENU

860 N = 7: N1 = 6: Q = 2 A N : GOTO 852


865 N = 8: N1 = 7: Q = 2 A N : GOTO 852
870 N = 9: N1 = 8: Q = 2 A N : GOTO 852
875 N = 1 0 : N1 = 9 : Q = 2 A N : GOTO 852
880 N = 1 1 : N1 = 1 0 : Q = 2 A N : GOTO 852
885 N = 1 2 : N1 = 1 1 : Q = 2 A N: GOTO 852
I ***********************
, * SYSTEM SETUP *
I ***********************
900 CLS : RTFLG = 1 : PR I NT SPC( 20 ) ; " SYSTEM SETUP MENU"
902 PR I NT : LOCATE ( 5 ) : PR I NT " 1 = SUMMARY 5 = ARRAY S I ZE "
232 Appendix 1 1 .3

904 PR I NT PR I NT "2 = WE I GHT I NG FUNCT I ON 6 = SET FREQUENCY"


906 PR I NT PR I NT "3 = FRACT I ONAL FREQUENCY"
907 PR I NT PR I NT "4 = E X I T MENU 9 = TERM I NATE PROGRAM"
908 PR I NT PR I NT
910 A$ = I N KEY$ : I F A$ = "" THEN 9 1 0
91 2 A = ASC ( A$ ) : I F A < 4 9 O R A > 57 T H E N 900
914 A = A - 48 : ON A GOSUB 920 , 930 , 970 , 990 , 800 , 960 , 928 , 928 , 999
916 XSF = 500 * OVSAP/ ( Q I * FRAC F ) : SCALE = 2 * WSF * FRACF
918 ON RTFLG GOTO 900 , 928
, *** SHOW SYSTEM CON F I GURAT I ON ***
920 CLS
922 PR I NT SPC ( 20 ) ; "SYSTEM SUMMARY" : P R I NT : PR I NT
923 PR I NT " F RAC T I ONAL FREQUENCY = 1 / " ; FRACF
924 PR I NT "WE I GHT I NG FUNCT I ON = S I N" " ; WEXP; " - WE I GHT I NG IS " ;
925 I F WTFLG = 1 THEN PR I NT "OFF" ELSE P R I NT "ON"
926 PR I NT "ARRAY S I ZE IS "; Q: PR I NT
927 I NPUT "ENTER TO CONT I NUE "; A$
928 RETURN

930 CLS : PR I NT "WE I GHT I NG FUNCT I ON ON ( YIN ) ? " ;


932 A $ = I NKEY $ : I F A $ = 1111 THEN 932
934 I F A$ = "N" OR A$ = " n" T HEN WT FLG = 1 : WSF = 1 : GOTO 956
936 WT FLG = 2 : P R I NT ' TURN WE I GH T I NG ON
938 PR I NT "CHANGE WE I GHT I NG FUNCT I ON EXPONENT?"
940 A$ = I NKEY$ : I F A$ = " " THEN 940
942 I F A$ = "N" OR A$ = " n" THEN 956 ' E X I T
944 PR I NT " 1 = S I N"2" : P R I NT "2 = S I N"4" : PR I NT " 3 = S I N"6"
946 A$ = I NKEY$ : I F A$ = " " THEN 946
948 A = ASC(A$ ) : I F A < 49 OR A > 5 1 THEN 946
950 A = A - 48 : WEXP = 2 * A
952 WSF = 2 : I F A = 2 THEN WSF = 8 I 3
954 I F A = 3 THEN WSF = 16 I 5
956 RETURN

, *** SET SAMPL I NG FREQUENCY ***


960 I NPUT "ENTER FREQUENCY OF SAMPL I NG RATE ( I N SPS ) " ; FSAP
962 NYQ = FSAP I 2' NYQU I ST = HAL F SAMPL I NG RATE
964 RETURN

970 CLS : PR I NT : PR I NT "SELECT FRACT I ONAL FREQUENCY FOR ANALYS I S"


972 PR I NT : PR I NT " 1 = 1 / 1 " ; SPC ( 2 0 ) ; "4 = 1 /8"
974 PR I NT "2 = 1 / 2 " ; SPC ( 20 ) ; "5 = 1 / 1 6"
976 PR I NT "3 = 1 /4 " ; SPC ( 20 ) ; "6 = 1 /32"
978 A$ = I NKEY$ : I F A$ = " " THEN 978
980 A = ASC ( A$ ) : I F A < 49 OR A > 54 THEN 978
982 A = A - 49: FRACF = 2 " A
984 A = N - 5 : ON A GOSUB 850 , 860 , 865 , 870 , 875 , 880 , 885
986 RETURN

990 RTFLG = 2: RETURN


I ** ********
999 END : STOP ' THAT ' S ALL FOLKS

The standard PFFFT runs from line 1 00 I 5 0-the inverse -

transform is not used. We set up a more or less arbitrary configuration


Digital Audio Analyzer 233

through line 30 and then GOSUB to line 900 to allow setup modification
as desired. At line 34 we jump to the array size setup and then jump to
600 to start the analyzer At line 604 we get the initial frequency, F9 gets
the frequency in terms of harmonic number, and we are ready to jump to
the Generate Function routine at line 400. This Generate Function routine
is discussed in the text (p. 1 4 1 ).
Lines 400 - 458 generate the simulated D/A signal. Thefunction
weighting is invoked as a user option. Returning to line 612 we then jump
down to the PFFFT, and the return-jump (to the Plot Transformed Data
routine-lines 350-390) takes place from the PFFFT. The Plot Data
routine has changed slightly-all of the scale factors etc ., are calculated
when they are determined so that they need not be calculated each time we
plot the data. Aside from these changes it's pretty much the display
routine used in Appendix 9.4.
Returning to line 614 we set the Repeat flag to zero and locate the
cursor to the upper right-hand comer of the screen. At line 620 we print
the note that the Escape key may be used to modify the system configura­
tion. Let's look at how the user controls the spectrum analyzer
Line 622 checks to see if a key has been pressed-if not the
program continues on. If a key has been pressed, we check to see if it's a
control key (line 624). If so we jump to the Handle Control Key routine
at line 650, but we will discuss this shortly. Line 626 checks to see if an
Escape key has been pressed (ASCII code 27). If so we j ump to line 900
where a System Menu is displayed. The number 1 selection will display
the current status of the system (i.e., the fractional frequency and weighting
function configuration, as well as the size of the data array being used).
This subroutine is located at lines 920-928. [Note that these sub-routines
all return to the System Menu J
Option 2 allows changing the weighting function parameters (at
lines 930-956). The weighting function may be turned "On" or "Off' and
the exponent of the 112 cycle sineN weighting function may be selected.
Option 3 allows changing the fractional frequency configuration
(lines 970-986). This routine jumps to the select the array size routine
again (this is necessary to re-establish the array constants).
Option 4 is the Exit back to the Analyzer
Option 5 allows selecting the array size which is the same routine
used in the previous spectrum analyzers.
Option 6 allows changing the sampling rate (lines 960-964).
Option 9 is the orderly way to terminate this program.
If, back at line 622, a cursor key was entered, the program flow
jumps to line 650. We note that the control keys (i.e. , the cursors) allow
234 Appendix 1 1 .3

changing the amplitude of the signal being analyzed via the Up and Down
cursors (i.e., t and � on the keyboard) which is an interesting illustration
(see lines 630-646). The left and right (i.e., -+ and -) keys increment!
decrement the frequency. You may recognize T I 2 (line 30) as the step
ratio for the chromatic scale.
The reader should be warned this program is a conglomeration of
several test routines and, while it works, it will probably contain bugs.
Handling of scale factors, etc., is sloppy. It would be a good exercise to
write a similar program concentrating on a simple, consistent set of
amplitude, time and frequency scale factors.
APPENDIX 12.1

PLAYBACK SPEEDUP

Again, we do not show the PFFFT ( l ines 1 00- 1 5 2) and the


Inverse Transfonn (lines 200-244) to save space.

I ************************************
10 ' *** ( F FT1 2 . 01 ) VO I CE SPEEDUP F F T ***
, ************************************
, DYNAM I C
1 2 C L S : SK1 = 1 : SK3 = 1 : Q = 2 � 1 1 : Q 2 = Q / 2
14 PAT H I S = "C : \ " : PATHOS = PAT H I S
1 6 D I M C ( Q ) , S ( Q ) , KC ( Q2 ) , KS(Q2 ) , HDR(44)
1 8 FOR I = 1 TO 44 : READ HDR( I ) : NEXT I
20 DATA 82 , 73 , 70 , 70 , 1 87 , 23 , 0 , 0 , 87 , 65 , 86 , 69 , 1 02 , 1 09, 1 1 6 , 32 , 1 6 , 0 , 0 , 0 , 1
22 DATA 0 , 1 , 0 , 1 7 , 43 , 0 , 0 , 1 7 ,43, 0 , 0 , 1 , 0 , 8 , 0 , 1 00 , 97, 1 1 6 , 97, 1 5 1 , 23 , 0 , 0
24 P I = 3 . 1 4 1 592653589793#: p 2 = 2 * P I : K 1 = P 2 / Q
30 Q3 = Q2 - 1
32 FOR I = 0 TO Q3 : KC( I ) = COS( I * K1 ) : KS( I ) = S I N ( I * K 1 ) : NEXT I
34 I NPUT " I NPUT DATA SAMPLE RAT E " ; DSR1
36 CLS : GOSUB 1 1 00 ' GET DATA F I LE
40 CLS
50 PR I NT SPC(30 ) ; "MA I N MENU" : PR I NT : P R I N T
52 PR I NT SPC ( 5 ) ; " 1 = F FT " : PR I NT
54 PR I NT SPC ( 5 ) ; "2 = I NV F F T " : PR I NT
56 PR I NT SPC ( 5 ) ; "3 = D I SPLAY MENU" : P R I N T
5 8 P R I NT SPC ( 5 ) ; " 4 = SPEEDUP ROUT I N E " : P R I N T
6 0 PR I NT SPC ( 5 ) ; "5 = F I LE UT I L I TY " : PR I NT
62 PR I NT SPC ( 5 ) ; "6 = F I LTER " : PR I N T
68 PR I NT SPC ( 5 ) ; " 9 = EX I T" : PR I N T
7 0 PR I NT SPC ( 1 0 ) ; "MAKE SELECT I ON : " ;
80 AS = I NKEYS : I F AS = 1111 THEN 80
82 I F ASC(AS) < 49 OR ASC(AS) > 57 THEN 40
90 A = VAL ( AS ) : ON A GDSUB 600, 700,800 , 400 , 1 000 , 3000 , 990 , 990 , 990
95 I F A = 9 THEN 999
97 GOTD 40
, ******************************
, * VO I CE SPEEDUP *
, ******************************
400 CLS : PR I NT : PR I N T
402 PR I NT SPC ( 20 ) ; "VO I CE SPEEDUP MENU" : PR I NT : PR I NT
404 PR I NT SPC ( 5 ) ; " 1 = STRETCH S I DEBANDS 2 = FRACT I ONAL STRETCH"
405 P R I NT SPC ( 5 ) ; "9 = EX I T "
406 A S = I NKEYS: I F A S = " " THEN 406
407 ON VAL (AS) GOSUB 450, 4 1 2 , 4 1 0 , 4 1 0 , 4 1 0 , 4 1 0 , 4 1 0 , 4 1 0 , 4 1 0
410 RETURN
412 ' *** FRACT I ONAL STRETCH ***
414 CLS : I NPUT "SELECT CENTER FREQUENCY " ; FC01
415 FC01 = FC01 * Q / DSR1
416 P R I NT SPC ( 20 ) ; "SELECT SPEEDUP FRACT I ON " : PR I NT PR I NT
417 PR I NT SPC ( 5 ) ; "1 = -3/4 5 = + 1 /4"
418 PR I NT SPC ( 5 ) ; "2 = - 1 /2 6 = +1 /2"
419 PR I NT SPC ( 5 ) ; "3 = - 1 /4 7 = +3/4"
420 PR I NT SPC ( 5 ) ; "4 = 0 8 = N/A"
421 PR I NT SPC ( 5 ) ; "9 = EX I T "
236 Appendix 12.1

422 AS = I NKEYS : I F AS = "" THEN 422


423 I F ASC(AS) < 49 OR ASC(AS) > 57 THEN 414
424 A = VAL ( AS ) : I F A = 9 GOTO 449
425 A = A - 4 : I F A > 3 THEN A = 3
426 FC01 = C I NT ( FC01 ) : D E L F = 4 - A
, SELECT S I DEBANDS
427 12 = - 1 : FC04 = C I NT ( FC01 / 8 ) : I X = I NT ( FC01 * D E L F / 8)
428 FOR I = 0 TO IX STEP DEL F : 12 = 12 + 1
429 C ( FC04 + 1 2 ) = C ( FC01 + I ) : S ( F C04 + 1 2 ) = S ( FC01 + I )
430 C ( FC04 - 1 2 ) = C ( FC01 - I ) : S( FC04 - 1 2 ) = S ( FC01 - I )
431 NEXT I
432 FOR I = FC04 + 1 2 TO Q - 1 : C( I ) = 0 : SC I ) = 0 : NEXT I
433 N = N - 3 : N1 = N - 1 : Q = 2 A N : K1 = P2 / Q
434 Q2 = Q / 2 : Q3 = Q2 - 1 : Q4 = Q / 4 : Q5 = Q4 - 1 : Q8 = Q / 8
436 FOR I = 0 TO Q 2 : KC( I ) = COS(K1 * I ) : KS( I ) = S I N ( K 1 * I ) : NEXT
449 RETURN
450 , ****** STRETCH S I D EBANDS *****
452 I NPUT "CAR R I E R FREQUENCY I S" ; FC01
454 FC01 = FC01 * Q / DSR1
456 FOR I = 1 00 TO 0 STEP - 1 : 12 = 2 * I : 13 = 12 - 1
460 C ( FC01 + 1 2 ) = C ( FC01 + I ) : S( FC01 + 1 2 ) = S( FC01 + I )
462 C ( FC01 + 1 3 ) = 0 : S( FC01 + 1 3 ) = 0
464 C ( FC01 - 1 2 ) = C ( FC01 - I ) : S ( FC01 - 1 2 ) = S( FC01 - I )
466 C ( FC01 - 1 3 ) = 0 : S ( FC01 - 1 3 ) = 0
468 NEXT I
470 RETURN
600 ' **************************************
, * FORWARD FFT *
, **************************************
602 CLS : SK1 = 1 : K6 = 1 : KFB = 2
604 LOCATE 1 2 , 20 : PR I NT "PLEASE WA I T - TRANSFORM I NG DATA"
620 GOSUB 1 00 ' DO P F F FT
622 CLS : GOSUB 2500 ' PLOT DATA
624 RETURN
**********************************
700 , *** I NVERSE F FT ***
**********************************
710K6 = - 1 : KFB = 1
712CLS : LOCATE 1 2 , 20 : P R I NT "PLEASE WA I T - XFORM I NG DATA . "
714GOSUB 200 ' DO I NVERSE P F F FT
716CLS : GOSUB 2000' PLOT DATA
718RETURN
*************************
800 ' *** D I SPLAY DATA MENU ***
*************************
802 CLS : PR I N T SPC ( 30 ) ; "D I SPLAY MENU ,, : PR I N T : PR I NT
804 PR I NT SPC( 5 ) ; "1 = D I SPLAY T I ME DOMA I N ( GRAPH I C ) "
806 PR I NT SPC( 5 ) ; "2 = D I SPLAY FREQ DOMA I N ( GRAPH I C ) "
808 PR I NT SPC( 5 ) ; "9 = EX I T "
810 AS = I NKEYS: I F AS = " " T HEN 81 0
812 I F ASC(AS) < 49 OR ASC(AS) > 57 THEN 802
814 ON VAL (AS ) GOSUB 2000 , 2500 , 81 6 , 816, 816, 816, 816, 816, 816
816 RETURN
990 CLOSE : RETURN
999 END
Playback Speedup 237

************************
* F I L E MENU *
************************
1 000 CLS : PR I NT SPC(30 ) ; " F I L E HANDLER MENU " : PR I NT : P R I NT
1 002 P R I NT SPC ( 5 ) ; " 1 = RELOAD F I LE 2 = SAVE F I L E "
1 004 P R I NT SPC ( 5 ) ; "3 = LOAD NEW F I L E 4 = CHANGE SAMPLE RATE"
1 006 PR I NT SPC ( 5 ) ; "5 = WE I GHT I NG FUNCT I ON "
1 0 1 0 PR I NT SPC ( 5 ) ; "9 = E X I T "
1 0 1 2 A S = I NKEYS : I F AS = " " T HEN 1 0 1 2
1 0 1 4 ON VAL(AS) GOSUB 1 1 1 0 , 1 200 , 1 1 00 , 1 040 , 1 060 , 1 0 1 8 , 1 0 1 8 , 1 0 1 8 , 1 0 1 8
1 0 1 8 RETURN
******** CHANGE I NPUT PATH ***********
1 020 NPATHS = " "
1 022 I NPUT " N E W PAT H " ; NPATHS
1 024 I F NPATHS = "" THEN 1 024
1 026 PAT H I S = NPATHS
1 028 RETURN
, ********* CHANGE OUTPUT PATH ************
1 030 NPATHS = ""
1 032 I NPUT "NEW PAT H " ; NPATHS
1 034 I F NPATHS = "" THEN 1 034
1 036 PATHOS = NPATHS
1 038 RETURN
, ************ CHANGE SAMPLE RATE ************
1 040 NRATE = 0
1 042 I NPUT "NEW SAMPLE RAT E " ; NRATE
1 044 I F NRATE = 0 OR NRATE > 44 1 00 THEN 1 042
1 046 DSRl = NRAT E : TOO = Q I DSR1
1 048 RETURN
, ******** WE I GHT I NG FUNCT I ON **********
1 050 FOR I = 0 TO Q l
1 052 S( I ) = 5 ( 1 ) * ( S I N ( I * P I I Q ) A 6 )
1 054 NEXT I
1 056 RETURN
, ********* WE I GHT I NG ON/OFF ************
1 060 PR I NT "WE I GHT I NG ON ( YIN ) ? " ;
1 062 AS = I NKEYS: I F A S = .111 THEN 1 062
1 064 I F AS = "Y" OR AS = " y" THEN WT FLG = 1
1 066 I F AS = "N" OR AS = "n" THEN WT FLG = 0
1 068 I F AS <> "Y" AND AS <> " y" AND AS <> "N" AND AS <> "n" T HEN 1 060
1 070 RETURN
*******************
*** LOAD F I LE ***
*******************
1 1 00 CLS : NUFLG = 1
1 1 02 PR I NT " F I LENAME ( ' PAT H ' TO CHANGE PATH ) " ; PAT H I S ;
1 1 04 I NPUT NM I S
1 1 06 I F NM I S = "PATH" T H EN GOSUB 1 020 : GOTO 1 1 00
1 1 08 NM I S = PATH I S + NM I S
1 1 09 I F R I GHTS(NM I S , 4 ) < > " . WAV" THEN NM I S = N M I S + " . WAV"
1 1 10 OPEN "R" , #1 , NM I S , 1
1 1 12 F I ELD #1 , 1 AS DAS
1 1 14 QDF = LOF ( 1 ) : QF = QD F - 44
1 1 16 GET #1 , 23 ' GET NUMBER OF CHAN NELS
1 1 18 CHNLS = ASC( DAS ) : I F CHNLS = 2 THEN Q F = QF/2 ' ( MONO?STEREO?
238 Appendix 12.1

1 1 20 G E T #1 , 35
1 1 22 WRO S I Z = ASC(DAS ) : I F WRDS I Z = 16 THEN QF = Q F / 2' TWO BYTES
1 1 26 PR I NT Q F ; " AFTER WORD S I ZE & # CHANNELS"
1 1 28 GET #1 , 26 ' GET SAMPLE RATE H I GH BYTE
1 1 29 SR 1 = ASC(DAS)
1 1 30 SR1 = 256 * SR1 ' F I LE SIR
1 1 32 GET #1 , 25
1 1 34 SR1 = SR1 + ASC(DAS ) : DSR1 = SR1
1 1 36 CLOSE 1
1 1 38 STZ = 1
1 1 42 I F NUFLG = 0 THEN 1 1 52
1 1 44 NUFLG = 0
1 1 45 PR I NT " FREE MEMORY a ll ; FRE( - 1 )
1 1 46 PR I NT "8 * Q F = " ; 8 * Q F ; " PROCEED? " ;
1 1 48 A S = I NKEYS: I F A S = 1111 THEN 1 1 48
1 1 50 I F AS = "N" OR AS = " n " THEN 1 1 94
1 1 52 FOR N = 1 0 TO 1 3 ' F I ND S I ZE OF REQU I RED ARRAY
1 1 54 I F QF <= 2 A N THEN 1 1 58
1 1 56 NEXT N
1 1 57 REPROF = 0 : ' Q F = 2 A ( N )
1 1 58 I F AS = "Q" OR AS = " q " THEN N = 1 4
1 1 60 Q = 2AN : N 1 = N - 1 : Q1 = Q - 1 : Q 2 = Q/2 : Q3 = Q 2 - 1 : Q 4 = Q/4
1 1 61 Q5 = Q4 - 1 : Q8 = Q/8: Q9 = Q8 - 1 : Q34 = Q2 + Q4 : Q 1 6 = Q/ 1 6
1 1 62 RED I M C( Q ) , S ( Q )
1 1 64 TOO = Q / DSR 1 : K1 = P 2 / Q
1 1 66 CLOSE 1
TYPE Dat3
Amp3 AS I N TEGER
END TYPE
1 1 76 D I M WRD AS Dat3
1 1 80 I F WRD S I Z = 1 6 THEN GOSUB 1 300 ELSE GOSUB 1350
1 1 82 CLOSE #1
1 1 84 FOR I = 0 TO Q
1 1 86 C ( I ) = 0
1 1 88 NEXT I
1 1 90 I F WT FLG = 1 THEN GOSUB 1 050
1 1 94 CLS : GOSUB 2000
1 1 96 RETURN
I *******************************************
, * SAVE T I ME DOMA I N F I LE *
, *******************************************
1 200 PR I NT " SET GA I N ( Y/N ) ? "
1 202 A S = I NKEYS : I F A S = " " T H E N 1 202
1 204 I F AS = "Y" OR AS = " y" THEN GOSUB 1 270
1 2 1 0 HDR ( 7 ) = I N T « 2 * Q + 36) / 65536)
1 2 1 2 HDR(6) = I N T « ( 2 * Q + 36) - HDR ( 7 ) * 65536) / 256)
1 2 1 4 HD R ( 5 ) = I N T « 2 * Q + 36) - ( HD R ( 7 ) * 65536) - ( HD R ( 6 ) * 256»
1 2 1 6 HDR(43) = I N T « 2 * Q) / 65536)
1 2 1 8 HDR (42) = I NT « ( 2 * Q ) - ( HD R (43) * 65536» / 256)
1 220 HDR ( 4 1 ) = I NT « 2 * Q) - ( HD R (43) * 65536) - ( HDR(42) * 256»
1 222 HDR(26) = I NT ( DSR1 / 256 )
1 224 HDR ( 25 ) = I NT ( DSR1 - ( HD R ( 26 ) * 256» : DSR2 = 2 * DSR1
1 226 HDR ( 3 1 ) = I NT ( DSR2 / 65536 ) : DSR2 = DSR2 - HDR ( 3 1 ) * 65536
1 228 HDR (30) = I NT ( DSR2 / 256 ) : DSR2 = DSR2 - HDR(30) * 256
1 230 HDR ( 29 ) = I NT ( DSR2)
Playback Speedup 239

1 232 PR I NT : P R I NT " F I LENAME ( ' PAT H ' TO CHANGE PAT H ) "; PATHOS;
1 234 I NPUT NM2S
1 236 I F NM2S = "PATH" THEN GOSUB 1 03 0 : GOTO 1 232
1 238 NMS = PATHOS + NM2S
1 240 OPEN " R " , #2 , NMS, 2
1 242 F I E LD #2 , 2 AS DA2S
1 244 FOR I = 1 TO 43 STEP 2
1 246 HDR1 = HDR( I ) + HDR ( I + 1 ) * 256
1 248 I F HDR1 <32768 THEN LSET DA2S = MK I S ( HDR1 ) : GOTO 1 252
1 250 LSET DA2S = CHRS ( HDR ( I » +CHRS ( HDR ( I +1 »
1 252 PUT #2 , ( I + 1 ) / 2
1 254 NEXT I
1 256 FOR I = 0 TO Q - 1
1 258 LSET DA2S = MK I S ( I N T ( SK3 * S ( I » )
1 260 PUT #2 , ( I + 23 )
1 262 NEXT I
1 264 CLOSE #2
1 266 RETURN
1 270 ' ************ SET GA I N *************
1 272 I T ST = 0 : NGA I N = 0
1 274 FOR I = 0 TO Q - 1
1 276 I F ABS ( S ( I » > I TST THEN I TST = ABS ( S ( I »
1 278 NEXT I
1 280 P R I NT : P R I NT "THE PEAK VALUE I N THE ARRAY I S "; nST
1 282 PR I NT "MAX I UM GA I N = " ; ( 4096 / nST )
1 284 I NPUT "NEW GA I N = "; NGA I N
1 286 I F NGA I N = 0 THEN 1 282
1 288 SK3 = NGA I N
1 290 PR I NT "GA I N = " ; SK3
1 292 I NPUT "C/R TO CONT I NUE " ; AS
1 294 RETURN
1300 , ********* LOAD 16 B I T WORDS ************
1302 OPEN NM I S FOR RANDOM AS #1 LEN = LEN(WRD )
1303 STZ = CHNLS ' : I STOP = 22' ' STEPSI ZE = 2 FOR STEREO
1304 FOR I = 0 TO Q F - 1
1305 GET #1 , ( STZ * I ) + 45 , WRD ' LOCATE STZ* I +45 - - S0 WE STEP
1306 S ( I ) = WRD . Amp3 ' OVER 2 WORDS FOR STEREO
1307 I F CHNLS = 1 THEN 1 3 1 0 ' = MONAURAL
1308 GET #1 , ( STZ * I ) + 46 , WRD ' +46 FOR STEREO
1309 I F I > Q THEN 1 3 1 2 ELSE S( I ) = S ( I ) + WRD . Amp3
1310 NEXT I
1 3 1 2 RETURN
1350 ' ********* LOAD 8 B I T BYTES
1352 OPEN " R " , #1 , NM I S , 1
1 354 F I ELD #1 , 1 AS DAS
1356 FOR I = 0 TO Q F - 1 ' STEP STZ
1 358 GET #1 , ( STZ * I ) + 45
1 360 S( I ) = ASC(DAS) - 1 2 7
1 362 NEXT I
1 364 RETURN
, ***************************************
, * PLOT DATA ( T I ME )
, ***************************************
2000 I F REPOF = 1 THEN RETURN
2001 SCREEN 9 , 1 , 1 : COLOR 7, 1 : MAGX = 1 : XO = 10
240 Appendix 12.1

2002 CLS : SKX1 = 600 * MAGX / Q : SKY1 = 0


2004 FOR I = 0 TO Q - 1
2006 I F ABS ( S ( I » > SKY1 THEN SKY1 = ABS( S( I »
2008 NEXT I
20 1 0 SKY1 = 1 45 / SKY1 : YO = 1 70
20 1 2 Y2 = YO + 5 : Y3 = YO - 5
2014 L I NE (XO, YO ) - ( XO , YO ) : COLOR 7,
2016 FOR I = 0 TO Q - 1
2018 X5 = Xo + ( I * SKX1 ) : Y5 = YO - ( S ( I ) * SKY 1 )
2020 L I NE - ( X5 , Y 5 )
2022 NEXT I
2024 COLOR 1 5 , 1
2026 L I NE ( 1 0 , YO - 1 50 ) - ( 1 0 , 1 50 + YO)
2028 L I NE ( 1 0 , Y O ) - ( 61 0 , YO)
2030 FOR I = 1 TO 1 0
2032 X 2 = 1 0 + 60 * I
2034 L I NE (X2, Y 2 ) - (X2, Y3 )
2036 NEXT I
2038 LOCATE 1 , 1 : PR I NT "X FORM T I ME = " ; I N T ( 1 00 * T9) / 1 00 ; " SEC . "
2040 LOCATE 1 , 35 : PR I NT " F I LE = " ; NM I S
2042 LOCATE 22 , 60 : PR I NT "Tmax = " ; TOO / MAGX;
2044 LOCATE 22, 1 : P R I N T "M = EXPANO : 0 = O F FSET " ;
2048 A S = I NKEYS: I F A S = " " T HEN 2048
2050 I F AS = "M" OR AS = "m" THEN 2056
2052 I F AS = "0" OR AS = "0" THEN 2070
2054 I F ASC(AS) = 27 THEN RETURN ELSE 2002
, EXPAND DATA D I SPLAY
2056 I F AS = "M" THEN MAGX = 2 * MAGX
2058 I F AS = "m" THEN MAGX = MAGX / 2 : I F MAGX < 1 THEN MAGX = 1
2060 GOTO 2002
, OF FSET DATA
2070 I F AS = "0" AND XO > (600 * ( 1 - MAGX ) + 1 0 ) THEN xo = XO - 60
2072 I F AS = "0" THEN XO = XO + 60 : I F XO > 10 THEN XO = 1 0
2074 GOTO 2002
I ***************************************
, * *
PLOT DATA ( FREQUENCY)
I ***************************************

2500 I F REPOF = 1 THEN RETURN


2502 CLS : SCREEN 9 , 1 , 1 : COLOR 7, 1
2504 MAGX = 1 : OFS = 0 : SKY1 = 0
, F I ND MAX VALUE I N D I SPLAY DATA & SET EQUAL TO SKY1
2506 FOR I = 0 TO Q2 : YTST = SQR ( C ( I ) A2 + S ( I ) A 2 )
2508 I F YTST > SKY1 THEN SKY1 = YTST
25 1 0 NEXT I
, SET D I SPLAY SCALE FACTOR = 200 P I XLS/SKY1
2 5 1 2 SKY1 = 200 / SKY1
25 1 4 YO = 300 : SKY2 = SKY1 / 2
25 1 6 SKX1 = MAGX * 600 / Q2 : Xo = 1 0 ' SET X SCALE FACTOR
2522 GOSUB 2900 ' DRAW DATA
2530 FC = I NT ( Q5/MAGX + O FS ) : Y3 = YO+1 0 : Y2 = YO-220' CURSOR STU F F
2532 FCD = F C - O F S : X 5 = X o + FCD * SKX1 ' MORE CURSOR STUF F
2534 L I N E ( X 5 , Y3 ) - ( X 5 , Y 2 ) , DRAW CURSOR
2536 GOSUB 2840 ' D I SPLAY PERT I NENT D I G I TAL DATA
2540 AS = I NKEYS : I F AS = "" THEN 2540' WA I T FOR USER I NPUT
2542 I F AS = CHRS(27) THEN 2552' ESC = EX I T
Playback Speedup 241

2544 I F ASC(AS) = 0 THEN 2590 ' HANDLE CUR SOR KEYS


2546 I F AS = "M" OR AS = "m" THEN 2700 ' EXPAND FREQUENCY SCALE?
2548 I F AS = "0" OR AS = " 0 " THEN 2750 ' O F FSET FREQUENCY BAND
2550 GOTO 2540 ' SOMEBODY H I T THE WRONG KEY
2552 MAGX = 1 : OFSI = 0 : RETURN
2590 A = I NT « ASC ( R I GHTS(AS, 1 » - 70 ) / 2 ) ' HANDLE CURSORS
2591 I F A < 1 OR A > 5 THEN 2540
2592 GOSUB 2800 ' E RASE PRESENT CURSOR
2594 ON A GOTO 2630 , 2600 , 2620 , 2620 , 2640
2596 GOTO 2540
, MOVE CURSOR DOWN ONE
2600 FC = FC - 1 : I F FC < 3 THEN FC = 3
261 0 FCD = FC - OFS
261 2 GOSUB 2840 ' PR I N T DATA
2614 L I NE (XO + SKX1 * FCD , Y3 ) - (XO + SKX1 * FCD , Y2 ) ' DRAW CURSOR
2618 GOTO 2540
, MOVE CURSOR UP ONE
2620 FC = FC + 1 : I F F C > Q2 - 3 THEN FC = Q2 - 3
2626 GOTO 261 0 ' NO SENSE DOING T H I S TWI CE
, MOVE CURSOR UP 1 0
2630 F C = F C + 1 0 : I F F C > Q 2 - 3 THEN F C = Q 2 - 3 ' I NCREASE CURSOR
FREQUENCY BY 1 0
2636 GOTO 261 0 ' NOR THREE T I MES
, MOVE CURSOR DOWN 1 0
2640 F C = F C - 1 0 : I F F C < 3 THEN F C = 3
2644 GOTO 261 0 ' D I TTO
, *** EXPAND FREQUENCY SCALE FACTOR BY 2X ***
2700 I F AS = "M" AND MAGX < 16 THEN MAGX = 2 * MAGX : O F S I = 2 * OFSI
2702 I F AS = "m" AND MAGX > 1 THEN MAGX = MAGX/2 : OFSI = I N T ( O F S I / 2 )
2704 GOTO 2756 ' N O SENSE D O I N G T H I S TWI CE E I THER
, *** O F FSET D I SPLAYED SPECTRUM
2750 I F AS = "0" AND OFSI < MAGX THEN OFSI = O F S I + 1
2754 I F AS = " 0 " AND OFSI > 0 THEN OFSI = OFSI - 1
2756 OFS = OFSI * Q2 / MAGX : CLS
2758 GOTO 2514 ' OKAY , REPLOT DATA
, ERASE CURSOR
2800 COLOR 1 , 1 ' EVERYTH I NG BLUE
2802 FOR I = - 1 TO 1 ' WHERE I S THAT T H I NG
2804 X5 = XO + SKX1 * ( FCD + I )
2806 L I NE (X5 , Y3 ) - (X5 , Y2) , ERASE OLD CURSOR
2808 NEXT I
281 0 L I NE (XO , Y O ) - (XO, YO)
281 2 COLOR 7, 1 ' CHANGE THE COLOR BACK
281 4 GOSUB 2900 ' REDRAW DATA
2816 RETURN
, D I SPLAY DATA PARAMETERS
2840 COLOR 1 5 , 1
2842 LOCATE 24 , 1 : PR I NT "USE ARROWS TO MOVE CURSOR/ESC TO EX I T " i
2844 LOCATE 2 , 1 : PR I N T " X FORM T I ME = " i I NT ( 1 00 * T9) / 1 00
2846 LOCATE 1 , 60 : PR I NT " Fe = " i FC / TOO
2848 LOCATE 2 , 60 : YD I S = ( SKY1 * SQR ( C ( FC ) A 2 + S ( FC ) A 2 »
2850 PR I NT "MAGN I TUDE = " i : PR I NT US I NG "m.m"i YD I S / 2
2852 LOCATE 1 , 1 : P R I N T " F I LE = "i NM I S
2854 COLOR 7, 1
2856 RETURN
242 Appendix 12.1

I DRAW DATA
2900 L I NE (XD, Y D ) - (XD, YO)
2901 FOR I = OFS TO (Q2 I MAGX + OFS)
2902 X5 = ( I - O F S ) * SKX 1 : Y5 = SKY1 * SQR ( C ( I ) A 2 + S( I ) A 2)
2904 L I NE - ( XO + X5 , YO - Y 5 )
2906 N E X T I

I D RAW ORD I NATE & ABSCI SSA


291 0 L I NE (XO, YO - 200 ) - (XO, YO)
291 2 L I NE (XO, YO ) - ( 600 + XO, YO)
2920 RETURN

, *************************************
I * F I L TER ROUT I NES *
, *************************************
3000 CLS
3002 PR I NT "LOWPASS, BANDPASS OR NOTCH ( L/B/N ) "
30 1 0 AS = I NKEYS: I F A S = 1111 THEN 30 1 0
30 1 2 I F AS = " N " OR AS = " n " THEN 3 1 00 I NOTCH F I LTER
30 1 4 I F AS = "B" OR AS = "b" THEN 3 1 50 I BANDPASS
3016 I F AS <> " L " AND AS <> " l " THEN 3000 I I F NOT LOWPASS TRY AGA I N
3018 PR I NT " GAUSS I AN O R TRUNCATE ( Gi n " I WHAT K I ND O F LOWPASS?
3020 AS = I NKEYS : I F AS = "" T HEN 3020 I GET USER I NPUT
3022 I F AS = "T" OR AS = " t " T HEN 3200 I TRUNCATE?
3024 P R I NT : PR I NT "GAUSS I AN LOW PASS F I LTER ROUT I NE "
3026 I NPUT " I NPUT CUTOF F FREQUENCY " ; FC03
3028 FC03 = FC03 * TOO : FC032 = FC03 * FC03
3030 FOR I = 0 TO Q I 2 I F I LTER THE DATA
3032 KAT = EXP( - . 3453878 * I * I I FC032) I E I GEN VALUE COE F F I C I ENT
3034 C ( I ) = KAT * C ( I ) : S( I ) = KAT * S ( I )
3036 C ( Q - I ) = KAT * C ( Q - I ) : s e Q - I ) = KAT * s e Q - I )
3038 NEXT I
3040 RETURN

3 1 00 PR I NT : PR I NT "NOTCH F I LTER ROUT I NE "


3 1 02 I NPUT "CENTER FREQUENCY & BANDW I D T H " ; FCEN , BW4
3 1 04 FCEN = FCEN * TOO : BW4 = BW4 * TOO
3 1 06 FOR I = FCEN - BW4 TO FCEN + BW4
3 1 08 C ( I ) = 0 : S( I ) = 0
31 10 NEXT I
3112 RETURN

3 1 50 PR I NT : PR I NT "BANDPASS F I LTER ROUT I N E"


3 1 52 I NPUT "CENTER FREQUENCY & BANDW I D T H " ; FCEN , BW4
3 1 54 FCEN = FCEN * TOO : BW4 = BW4 * TOO
3 1 56 FOR I = 0 TO FCEN - BW4
3 1 58 C( I ) = 0 : S( I ) = 0
3 1 60 C(Q - I ) = 0 : seQ - I ) = 0
3 1 62 NEXT I
3 1 64 FOR I = FCEN + BW4 TO Q2
3 1 66 C ( I ) = 0: S ( I ) = 0
3 1 68 C(Q - I ) = 0 : seQ - I ) = 0
3 1 70 NEXT I
3 1 72 RETURN
Playback Speedup 243

3200 ' *** TRUNCATE UPPER SPECTRUM ***


3202 PR I N T : PR I NT "TRUNCATE UPPER SPECTRUM ROUT I N E "
3204 I NPUT "CUTOFF FREQUENCY " ; FC04
3206 FC04 = FC04 * TOO
3208 FOR I = FC04 TO Q / 2
32 1 0 C( I ) = 0 : S C I ) = 0
321 2 C(Q - I ) = 0 : seQ - I ) = 0
32 1 4 NEXT I
3216 RETURN

We load and save audio files with the routines between l ines
1 000-2000 (which takes up 3 � pages of code). There are two maj or
fonnats for audio: the * .VOC and *.WAV (where the * represents the file
name), but we use only the * . WAY. The file header is critical if these
files are to be used in other programs, and lines 1 8-24 read . WAY header
data into array HDR(44) [required when we save files later] .
We load files at lines 1 1 00- 1 200. A file name may be specified
or the current file may be re-loaded (line 100 1). Lines 1 1 02- 1 1 04 input the
file name [an option to change the path (lines 1 500- 1540) is provided-the
default is for C:\). The file is opened at line 1 1 1 0 and the size of the data
QF detennined by subtracting 44 header bytes from the Length Of File
(line 1 1 1 6). The *. WAY fonnat allows saving the data as either 16 bit
words or 8 bit bytes, which is indicated by the 35th byte of the header (line
1 1 20). This changes everything, of course, as we will see. The sample
rate is indicated by bytes 25 and 26 of the header (lines 1 1 28- 1 1 34). If we
are re-loading the current file (i.e., NUFLG = 0) we can skip down to
1 1 52. If the size of the file is too large to fit into the maximum array size,
there is no sense proceeding, and we can exit at line 1 1 50. [If the file was
created at 44, 1 00 samples /sec. but is too large to fit in the maximum array
size, we can cut it in half by specifying a sample rate of 22,050 and then
loading only every second sample-you must make a decision about
aliasing, of course.] If the file will "fit" we go on to select the next largest
2N file size 1 1 52-56, or if "Q" is input at line 1 1 48 we simply use the
largest file size possible. Lines 1 1 70-76 establish the type of data we
expect to read from the file. At 1 1 80 we jump to either the 1 6 bit word or
8 bit byte input routine and load the data into the data array. Lines 1 1 84-
88 insure the aft end of the array is zeros and at line 1 1 90 weighting the
data is allowed. At line 1 1 94 we display the loaded data, and then our file
is loaded and ready for work.
To save a file (lines 1 200- 1 3 00) we may want to change the
"gain" ( 1 200-subroutine at 1 270). Again, we can specify the name and
244 Appendix 12.1

path (lines 1 232-38); but first, we generate the header (lines 1 2 1 0-20) file
size infonnation. At 1 222-30 we enter the sample rate and at 1 240-54 we
save the header data.
The plot data routines have a couple of features that must be
pointed out: you can expand and offset the time domain display (2044-74)
by changing the variables MAGX (lines 2056-60), XO (lines 2070-74), and
re-plotting the data (the routines are located at lines 2700-2920). We may
exit the display routine via the Esc key.
The Plot Frequency routine allows expanding the display by
pressing "M" (2546), but you can also "shrink" the dIsplay by pressing "m."
Since expanding the display will move the upper frequencies out of view,
you can offset the display ("0" offsets + and " 0" offsets - in lines 2548).
The cursor can be moved across the data using the arrow keys (2544).
Left/right arrows move the cursor ± 1 hannonic and up/down arrows move
the cursor ± 1 0 (routines at lines 2590-2644).
Voice speedup is done in lines 400-470, but before we get there,
the data must occupy no more than 118 of the total array (you must control
sample rate, aliasing, etc.). As an exercise you may digitize a word (your
own voice) and break it into its major components (using the bandpass
filter routine). You then save the individual elements (e.g., as HAR0 1 .wav,
HAR02. wav, etc.), recall them one by one, change the playback rate, save
these new components, and then recombine them. To change playback rate
you must transfonn an element and use the cursor keys to find its center
frequency. You then select Fractional Stretch (lines 402-08), and enter the
component's center frequency (line 4 1 4). Select the speedup fraction
desired (menu 4 1 6-22) and the routine then does the fractional stretching
(see Ch. 1 2, pp. 1 5 1 - 1 55). You must then Inverse Transform this data
(note that the time domain data is automatically expanded to nominal half
array-see lines 432-36) and then save this stretched sound element. In
FFf1 2.03 (next appendix) the File Manager includes a routine for combin­
ing two * . wav fi les. With a little effort you could recombine these
stretched fi les and hear yourself say the same thing faster and slower.
[Note: there's a * . wav file included on the software disk (THISF3C. WAV)
for the sound element we expanded in Chapter 1 2.]
APPENDIX 1 2.2

SYNTHESIZER

This is only a modification of the playback speedup program of


the previous appendix-we need not repeat all of that code here. The
differences are as follows:

10 ' *** F F T 1 2 - 03 ( SYNT H - 0 1 ) MUS I C SYNTHES I ZER F F T PROGRAM ***


, DYNAM I C
1 2 CLS : SK1 = 1 : SK3 = 1 : Q = 2 A 1 0 : Q 2 = Q 1 2
14 PAT H I $ = "A : \" : PATHO$ = PATH I $
1 6 D I M C ( Q ) , s e Q ) , HDR(44 ) , CD ( 1 600 ) , SD( 1 600)
1 8 FOR I = 1 TO 44 : READ HDR( I ) : NEXT I
20 DATA 82 , 73 , 70 , 70 , 1 87 , 23 , 0 , 0 , 87 , 65 , 86 , 69 , 1 02 , 1 09 , 1 1 6 , 3 2 , 1 6 , 0 , 0 , 0 , 1
2 2 DATA 0 , 1 , 0 , 34 , 86 , 0 , 0 , 1 7, 43 , 0 , 0 , 2 , 0 , 1 6 , 0 , 1 00 , 97 , 1 1 6 , 97, 0 , 0 , 1 , 0
24 P I = 3 . 1 4 1 592653589793# : P2 = 2 * P I : K 1 = P2 1 Q
30 Q2 = Q 1 2 : Q3 = Q2 - 1
36 CLS : GOSUB 1 1 00 ' GET DATA F I LE
40 CLS
50 PR I NT SPC(30 ) ; "MA I N MENU" : PR I NT
52 PR I NT SPC( 5 ) ; "1 = F F T " : PR I N T
5 4 PR I NT SPC( 5 ) ; "2 = I NV F F T " : PR I N T
5 6 PR I N T SPC( 5 ) ; " 3 = SETUP SYNTHES I ZER" : PR I NT
58 PR I N T SPC ( 5 ) ; "4 = SYNTHES I ZER" : PR I NT
60 PR I N T SPC ( 5 ) ; "5 = F I LE U T I L I TY " : PR I NT
62 PR I NT SPC ( 5 ) ; "6 = F I LTER " : PR I N T
64 PR I NT SPC ( 5 ) ; "7 = D I SPLAY " : PR I NT
66 PR I N T SPC ( 5 ) ; "8 = F I NE L I NE SPECTRUM " : PR I NT
68 PR I NT SPC ( 5 ) ; "9 = EX I T " : PR I NT
70 PR I NT SPC( 1 0 ) ; "MAKE SELECT I ON : " ;
80 A$ = I NKEY$ : I F A$ = "" T HEN 80
82 I F ASC(A$) < 49 OR ASC(A$) > 57 THEN 40
90 A = VAL (A$ ) : ON A GOSUB 600 , 700 , 4000 , 4080 , 1 000, 3000 , 800 , 7000
95 I F A = 9 THEN 999
97 GO TO 40

, *******************************************************
, * FORWARD P F F F T *
, *******************************************************
1 00 ' *** TRANSFORM STAGE 1 ***
1 08 T9 = T I MER
110 C(O) = ( S ( O ) + S ( Q2 » 1 2: C( 1 ) = ( S ( O ) - S(Q2» 1 2
112 FOR I = 1 TO Q3 : 1 2 = 2 * I : I NDX = 0
1 14 FOR J = 0 TO N 1 : I F I AND 2AJ T HEN I NDX = I NDX + 2A ( N . 2 - J )
1 16 NEXT J
1 18 C ( 1 2 ) = ( S ( I NDX)+S( I NDX+Q2» /2: C( 1 2+1 ) = ( S ( I ND X ) - S ( I NDX+ Q2» /2
1 20 NEXT I
1 22 FOR I = 0 TO Q1 : S( I ) = 0 : NEXT I
********* REMA I N I NG STAGES **********
1 24 FOR M = 1 TO N 1 : QP = 2 A M: QPI = 2 A ( N 1 - M )
1 26 FOR K = 0 T O Q P I - 1
1 28 FOR J = 0 TO QP/2 : JO = J + ( 2 *K *QP ) : J 1 = JO+QP : K2 = QP I *J*K1
130 J I = J1 - (2 * J )
132 CTEMP1 = C ( J O ) + C( J 1 ) * COS ( K2 ) - S ( J 1 ) * S I N ( K2 )
134 STEMP1 = S ( J O ) + C ( J 1 ) * S I N ( K2 ) + S ( J 1 ) * COS ( K 2 )
246 Appendix 12.2

1 36 CTEMP2 = C ( J O ) - C ( J 1 ) * COS(K2) + S ( J 1 ) * S I N ( K2 )
1 38 S ( J I ) = ( C ( J 1 ) * S I N ( K2 ) + S ( J 1 ) * COS ( K 2 ) - S ( J O » / 2
140 C ( J O ) = CTEMP 1 / 2 : S(JO) = STEMP 1 / 2 : C ( J I ) = CTEMP2/2
1 42 NEXT J
1 44 NEXT K
1 46 NEXT M
1 48 FOR J = Q2 + 1 TO Q1 : C ( J ) = 0 : S ( J ) = 0 : NEXT J
150 T9 = T I MER - T 9 : SK1 = 2
1 52 RETURN

, **** ************************************************
, * I NVERSE TRANS FORM *
, ****************************************************
200 PR I NT : T9 = T I MER : SK1 = 1 : QP = 2 A N 1
202 FOR M = N 1 T O 1 STEP - 1 ' LOOP F O R STAGES O F COMPUTAT I ON
204 QP2 = 2 A ( M ) : QP = I NT ( QP/2 ) : QP4 = 2*QP2: QPI = 2A ( N 1 - M)
206 FOR I = 0 TO Q - ( QP2) STEP QP4
208 FOR J = 0 TO QP : KI = J + I : KT = J * QPI * K 1 : KJ = QP2 + K I
212 MCT = C ( J+ I ) - C ( I +QP2 - J ) : MST = S ( J+ I ) + S ( I +QP2 - J )
214 CTEMP = MCT * COS ( KT ) + M S T * S I N ( K T )
216 STEMP = MST * COS ( K T ) - MCT * S I N ( K T )
218 CTEMP2 = ( 2 * C ( J + I » - CTEMP * COS ( K T ) + STEMP * S I N ( K T )
220 S ( K I ) = (2 * S ( J + I » - CTEMP * S I N ( K T ) - STEMP * COS ( K T )
222 C ( K J ) = CTEMP : S(KJ ) = STEMP : C ( K I ) = CTEMP2
224 NEXT J
226 NEXT I
228 NEXT M
229 ' ******** F I NAL STAGE ********
230 FOR I = 0 TO Q3 : 1 2 = 2 * I : I NDX = 0
232 FOR J = 0 TO N 1 : I F I AND 2AJ THEN I NDX = I NDX + 2A ( N - 2 - J )
234 NEXT J
236 S ( I NDX ) = C ( 1 2 ) + C ( 1 2 + 1 ) : S ( I NDX + Q2) = C ( 1 2 ) - C ( 1 2 + 1 )
238 NEXT I
240 FOR I = 0 TO Q1 : C ( I ) = 0 : NEXT I
242 T9 = T I ME R - T9
244 RETURN
I ************ **************************
600 ' *** FORWARD F F T ***
, ******** * ** ***************************
602 SK1 = 1 : K6 = 1 : KFB = 2
604 I F REPOF = 0 THEN CLS : LOCATE 1 2 , 20 : PR I NT "PLEASE WA I T "
620 GOSUB 1 00 ' DO P F F FT
621 LOCATE 1 2 , 20 : PR I NT " "
622 GOSUB 2500' PLOT DATA
624 RETURN
, ******* * **************************
700 ' ** * I NVERSE F F T ***
, * ******** *** **********************
710 K6 = - 1 : KFB = 1
71 2 I F REPOF = 0 THEN CLS : LOCATE 1 2 , 20 : PR I NT "PLEASE WA I T "
714 GOSUB 200' D O I NVERSE P F F FT
715 LOCATE 1 2 , 20 : PR I NT " "
716 GOSUB 2000 ' PLOT DATA
718 RETURN
Music Synthesis 247

*************************
800 ' *** D I SPLAY DATA MENU ***
*************************
802 CLS : PR I NT SPC ( 30 ) ; "D I SPLAY MENU " : PR I NT PR I NT
804 PR I NT SPC( S ) ; " 1 = D I SPLAY T I ME ( GRAPH I C ) "
806 PR I NT SPC( S ) ; " 2 = D I SPLAY FREQ ( GRAPH I C ) "
808 PR I NT SPC( S ) ; " 9 = E X I T "
81 0 A S = I NKEYS : I F A S = " " T H E N 8 1 0
81 2 I F ASC(AS) < 4 9 O R ASC(AS) > 57 T H E N 802
814 ON VAL (AS) GOSUB 2000, 2500 , 816, 816, 816, 816, 816, 816, 816
816 RETURN
, *** HAPPY END I NGS ***
990 CLOSE
992 RETURN
999 END

******************* *****
* F I LE MENU *
************* ***********
1 000 CLS : PR I NT SPC(30 ) ; " F I LE HANDLER MENU " : P R I N T : PR I NT
1 002 PR I NT SPC ( S ) ; "1 = RE LOAD F I LE 2 = SAVE F I L E "
1 004 P R I NT SPC( S ) ; "3 = CHANGE NAME & LOAD 4 = SUM I N 2ND F I LE "
1 006 PR I NT SPC ( S ) ; " 5 = CHANGE SAMPLE RATE
1 008 PR I NT SPC ( S ) ; "7 = WE I GHT I NG FUNCT I ON "
1 0 1 0 PR I NT SPC( S ) ; " 9 = E X I T "
1 0 1 2 A S = I NKEYS: I F A S = " " T H E N 1 0 1 2
1 0 1 4 ON VAL (AS) GOSUB 1 1 1 0 , 1 200 , 1 1 00 , 1 400 , 1 040 , 1 0 1 8 , 1 060 , 1 0 1 8 , 1 0 1 8
1 0 1 8 RETURN
1320 , ********* LOAD 2ND F I LE 16 B I T WORDS ******* * ****
1322 OPEN NM I S FOR RANDOM AS #1 LEN = L E N ( WRD )
1323 STZ = CHNLS ' : I STOP = 22' ' STEPSI ZE = 2 FOR STEREO
1324 FOR I = 0 TO Q F - 1
1 325 GET #1 , ( STZ * I ) + 4 5 , WRD ' LOCATE STZ* I +4S - - S0 WE STEP
1326 S ( I ) = S ( I ) + WRD . Aq)3 ' OVER 2 WORDS FOR STEREO
1 327 I F CHNLS = 1 THEN 1 330 ' = MONAURAL
1 328 GET #1 , ( STZ * I ) + 46, WRD ' SAME EXCEPT +46 FOR STEREO
1 329 I F I > Q THEN 1 332 ELSE S ( I ) = S ( I ) + WRD . Aq)3
1 330 NEXT I
1 332 RETURN
1 370 , ********* LOAD 2ND F I LE 8 B I T BYTES
1 372 OPEN " R " , #1 , NM I S , 1
1 374 F I ELD #1 , 1 AS DAS
1 376 FOR I = 0 TO Q F - 1 ' STEP STZ
1 378 GET #1 , ( STZ * I ) + 45
1 380 S( I ) = S( I ) + ASC(DAS) - 1 2 7
1 382 NEXT I
1 384 RETURN
, ***************** **********
,* SUM TWO F I LES TOGETHER *
, ***************************
, ASSUMES F I RST F I LE I S I N S ( I )
1 400 CLS : NUFLG = 1
1 402 PR I NT " F I LENAME ( ' PATH ' TO CHANGE PAT H ) " ; PAT H I S ;
1 404 I NPUT NM I S
1 406 I F NM I S = "PATH" THEN GOSUB 1 020 : GOTO 1 402
248 Appendix 12.2

1 408 N M I S = PAT H I S + NM I S
1410 OPEN "R" , #1 , NM I S , 1
1412 F I ELD #1 , 1 AS DAS
1416 GET #1 , 23 ' GET NUMBER OF CHANNELS
1418 CHNLS = ASC(DAS) ' SET # CHANNELS ( I . E . MONO/STEREO)
1 420 GET #1 , 35
1 422 WRD S I Z = ASC(DAS)
1 426 PR I N T QF; " AFTER WORD S I ZE"
1 428 GET #1 , 26 ' GET SAMPLE RATE H I GH BYTE
1 430 SR1 = ASC(DAS)
1 432 SR1 = 256 * SR1 ' F I LE SIR
1 434 GET #1 , 25
1 436 SR1 = SR1 + ASC(DAS)
1 438 CLOSE 1
1 440 STZ = 1
1 442 I F NUFLG = 0 THEN 1 450
1 444 NUFLG = 0
1 446 TOO = Q / DSR 1 : K1 = P2 / Q
1 450 I F WRDS I Z = 16 THEN GOSUB 1 320 ELSE GOSUB 1 370
1 452 CLOSE #1
1 454 CLS : GOSUB 2000
1 456 I F WT FLG = 1 THEN GOSUB 1 050
1 458 RETURN
***********************************
4000 ' *** SETUP MUS I C SYNTHES I ZER ***
***********************************
4002 CLS : PR I NT "TH I S ROUT I NE W I L L SAVE THE HARMON I CS SELECTED I N "
4004 PR I NT "THE ARRAYS CD ( X ) AND SD ( X ) T O B E USED LATER I N THE"
4005 PR I NT "SYNT HES I S O F A SON G . T H I S ALGOR I T HM WILL SERVE TO"
4006 PR I NT "DEMONSTRATE THE BAS I C PR I NC I PLE I NVOLVED IN A H I GH "
4008 PR I NT "QUAL I TY SYNTHE S I ZER . I NPUT BAS I C I NSTRUMENT SOUND"
4010 I NPUT "ELEMENTS BANDW I D T H FOR ALL ELEMENTS"; BAND
4012 BAND = C I N T ( BAND * TOO)
40 1 4 FOR HAR = 0 TO 10 ' DO FOR 10 HARMON I CS
40 1 6 PR I N T " F REQUENCY CFO FOR ELEMENT"; HAR;
40 1 8 I NPUT C FO
4020 C FO = C I NT ( C FO * TOO ) : C F 1 = C F O : OFSET = 2 * HAR
4022 FOR TF = C F 1 - BAND TO C F 1 + BAND ' TRANSFER TO DATA ARRAY
4024 CD ( T F - C F 1 + ( 1 + OFSET ) * BAND ) = C ( T F )
4026 SD ( T F - C F 1 + ( 1 + OFSE T ) * BAN D ) = S ( T F )
4028 NEXT T F
4030 CD( OFSET * BAND ) = C F 1 ' SAVE HARMON I C FREQUENCY
4032 NEXT HAR ' REBU I LD THE P I ANO BE FORE WE EX I T !
S H I F T HARMON I CS TO DESI RED NOTE
4034 FOR I = 0 TO Q: C ( I ) = 0: S ( I ) = 0: NEX T ' ZERO ARRAY
4036 FOR HAR = 0 TO 1 0 : OFSET = 2 * ( HAR )
4038 CF = CD ( O FSET * BAND )
4040 FSHO = C I NT ( C F * « 1 . 059463 1 # A NOT E ) - 1 »
4042 ' I F HAR = 0 THEN FSHO = 0 ' DON ' T SH I F T THE BOX
4044 FOR I = C F - BAND + 1 TO CF + BAND - 1
4046 C ( I + FSHO) = CD ( I - CF + BAND * ( 1 + OFSE T »
4048 S ( I + F S H O ) = SD ( I - C F + BAND * ( 1 + OFSET »
4050 NEXT I
4052 NEXT HAR
4054 RE TURN
Music Synthesis 249

************************************* ** ***
* SYNTHES I ZE A SONG ( 0 1 / 1 2/03 ) *
******************************************
T H I S ROUT I NE ASSUMES THE F I LE " P IANO . WAV" HAS BEEN LOADED
AND THE HARMON I CS SAVED I N THE CD ( I ) AND SD ( I ) F I LE S ) . I T
ALSO ASSUMES THE NOTE I S "A" . T H I S ROUT I NE CALCULATES
THE NOTE AND I TS DURAT I ON AND APPENDS IT TO F I LE "SONGNMS"
UNT I L THE "END OF SONG" CODE ( I . E . , "Z" ) IS I NPUT .
4080 REPOF = 1 : CLS : PR I NT : PR I N T " I N PUT SONG? ( Y/N ) " ;
4084 AS = I NKEYS: I F AS = " " THEN 4084
4086 I F AS = "Y" OR AS = " y " THEN 6000
4088 RETURN
**** SYNTHES I ZER ****
6000 SCREEN 9, 1 , 1 : CLS : F I LOC = 23
6002 PR I NT "ENTER F I LENAME FOR SONG ( PATH TO CHANGE PATH ) " ; PATHOS;
6004 I NPUT SONGNMS : I F SONGNMS = "PATH" THEN GOSUB 1 03 0 : GOTO 6002
6006 GOSUB 6200 ' OPEN F I LE AND WR I TE HEADER
6008 CLS : COLOR 1 5 , 1 : I SG = 1 : FFO = 469 . 693
60 1 2 LOCATE 1 , 1 : PR I NT SONGNMS; " NOT E " ; I SG
60 1 6 LOCATE 3, 1 : I NPUT "ENTER NOTE AS A, A#, Bb, E TC . " ; AS
6020 A = ASC(AS ) : A1 = ASC ( R I G HTS(AS, 1 »
6021 I F A = 1 1 1 THEN 08 = - 1 : GOTO 60 1 6 ' S H I FT DOWN AN OCTAVE
6022 I F A > 71 THEN 6 1 00 ' CLOSE F I LE
6024 I F A < 65 THEN 60 1 2
6026 LOCATE 4 , 1
6028 I NPUT "ENTER DURAT I ON AS 1 / 2 NOTE = 2, 1 /4 = 4, ETC . ) " ; B 1 9
6030 B = Q / B 1 9 ' : PR I NT " 1 / " ; B 1 9;
6034 ' MULT BY 2 FOR FULL STEPS, EXCEPT AT B - C AND E - F
6036 A = ( A - 65 ) * 2 : I F A > 3 THEN A = A - 1 : I F A > 7 THEN A = A -
6038 I F A > 7 OR 08 = - 1 THEN A = A - 1 2 : 08 = 0
6040 I F A1 = 35 THEN A = A + 1 ' SHARP?
6041 I F A1 = 98 THEN A = A . l ' FLAT?
6042 NOTE = A
6044 GOSUB 4034 ' PRODUCE NOTE
6046 LOCATE 20, 30 : P R I NT " I NVERSE TRANS FORM"
6048 GOSUB 700 ' I NVERSE TRANSFORM
6049 I F B > Q THEN BREM = B - Q : B = Q
6050 FOR I = 0 TO B
6052 LSET DA2S = MK I S( C I NT ( SK3 * S ( I » )
6054 PUT #2 , ( I + F I LOC)
6056 NEXT I
6058 F I LOC = F I LOC + B + 1
6059 I F BREM > 0 THEN GOSUB 6080
6060 LOCATE 20, 3 D : PR I NT " "
6062 I SG = I SG + 1
"
6064 LOCATE 3, 1 : PR I NT "
6066 LOCATE 4, 1 : PR I NT " "
6068 LOCATE I SG , 68: I F I SG > 22 THEN 6070
6069 GOSUB 6072 ELSE LOCATE 24 , 1 : PR I NT : LOCATE 22, 68 : GOSUB 6072
6070 GOTO 60 1 2
6072 PR I NT AS; " , 1 / " ; B 1 9 : RETURN
6080 LSET DA2S = MK I S ( 1 024)
6082 FOR I = 0 TO BREM : PUT #2, ( I + F I LOC) : NEXT
6084 F I LOC = F I LOC + BREM + 1 : BREM = 0
6086 RETURN
250 Appendix 1 2.2

**********************************************
**** UPDATE HEADER DATA & CLOSE F I LE ****
*************** *******************************
6 1 00 F I LC = 2 * ( F I LOC - 23 ) + 36
61 02 HDR ( 8 ) I NT ( F I LC/1 67772 1 6 ) : F I LC = ( F I LC - ( HDR ( 8 ) * 1 67772 1 6 »
6 1 04 HDR ( 7) = I NT ( F I LC/65536 ) : F I LC = F I LC - ( HDR( 7)*65536)
61 06 HDR(6) = I NT ( F I LC/256 ) : F I LC = F I LC - ( HD R ( 6)*256)
6 1 08 HDR ( 5 ) = I NT ( F I LC ) : F I LC = 2 * ( F I LOC - 23)
61 1 2 HDR ( 44 ) = I NT ( F I LC/1 67772 1 6 ) : F I L C = F I L C - ( HD R ( 44 ) * 1 67772 1 6 )
61 1 4 HDR (43) = I NT ( F I L C / 65536) : F I LC = F I LC - ( HD R ( 43 ) * 65536)
61 1 6 HDR(42) = I NT ( F I LC / 256) : F I LC = F I LC - ( HDR(42) * 256)
61 1 8 HDR(41 ) = I NT ( F I LC )
6 1 20 HDR ( 26 ) = I NT ( DSR1 / 256)
6 1 22 HDR ( 2 5 ) = I NT ( DSR1 - HDR(26 ) * 256)
6 1 26 DSR2 = 2 * DSR1
61 28 HDR(31 ) = I NT ( DSR2 / 65536 ) : DSR2 = DSR2 - HDR ( 3 1 ) * 65536
6 1 30 HDR(30) = I NT ( DSR2 / 256 ) : DSR2 = DSR2 - HDR (30) * 256
6 1 32 HDR(29) = I N T (DSR2)
6 1 40 FOR I = 1 TO 43 STEP 2
6 1 42 LSET DA2$ = CHR$( HDR ( I » + CHR$( HDR ( I + 1 »
6144 PUT #2 , ( I + 1 ) / 2
6146 NEXT I
6148 CLOSE #2
6150 REPOF = 0 : RETURN
*************************************
** OPEN SONG F I LE & WR I TE HEADER *
*************************************
6200 NM$ = PATHO$ + SONGNM$
6202 OPEN " R " , #2 , NM$, 2
6204 F I E LD #2 , 2 AS DA2$
6206 FOR I = 1 TO 43 STEP 2
6208 LSET DA2$ = CHR$( HDR ( I » + CHR$( HDR ( I + 1 »
62 1 0 PUT #2 , ( I + 1 ) / 2
62 1 2 NEXT I
62 1 4 RETURN
**********************************
*** F I N E L I NE SPECTRUM ***
**********************************
7000 CLS : PR I NT "CNTR FREQ, BNDWD T H , STEP 1/N ( E . G . 350 , 3 0 , 8 ) "
7002 I NPUT " " ; C F , BAND , F FRAC
7004 CLS : SCREEN 9, 1 , 1 : COLOR 7, 1
7006 YO = 300 : SKY2=SKY 1 / 2 : C F=C I NT ( C F*TOO ) : BAND = C I NT ( BAND*TOO)
7008 SKX1 = 600 / (2 * BAND ) : XO = 1 0 ' SET X SCALE FACTOR
70 1 0 GOSUB 5 1 00 ' SET D I SPLAY SCALE FACTOR = 200 P I X LS/SKY1
70 1 2 L I NE (XO, yO - 200 ) - (XO, YO ) ' DRAW ORD I NATE & ABSCI SSA
70 1 4 L I NE (XO, Y O ) - (600 + XO, YO )
70 1 6 L I NE ( XO + ( BAND * SKX1 ) , YO - 200 ) - ( XO + ( BAND * SKX 1 ) , YO)
701 8 L I N E (XO + SKX1 * BAND , yO + 5 ) - ( XO + SKX1 * BAND , YO - 200)
7020 L I NE (XO, Y O ) - ( X O , YO)
7022 LOCATE 20, 37: PR I NT C F / TOO
7024 LOCATE 20 , 1 : PR I N T ( C F - BAND ) / TOO
7026 LOCATE 20, 70 : PR I NT ( C F + BAND ) / TOO
7028 D E L F = 1 / F FRAC : X5 = 0 : Y5 = 0 : YMAX = 0
7030 COLOR 1 5 , 1
7032 FOR F = CF - BAND TO CF + BAND STEP D E L F
Music Synthesis 25t

7034 CTOT = 0 : STOT = 0 : KPI = P2 * F I ( Q )


7036 FOR I = 0 T O Q 1
7038 CTOT = CTOT+ ( S ( I ) *COS ( KP I * I » : STOT = STOT+( S ( I )*S I N ( KP I * I »
7040 NEXT I
7050 LOCATE 1 , 1 : PR I N T F ;
7051 PR I NT "COS COMPONENT =" ; CTOT/Q, " S I N COMPONENT =" ; STOT/Q
7052 CTOT = CTOT/Q : STOT = STOT/Q
, DRAW DATA
7054 X6 = X5 : Y7 = Y6
7056 X5 = ( F - C F+BAND )*SKX 1 : Y5 = SQR(CTOTA2 + STOTA2 ) : Y6 = SKY 1 *Y5
7058 L I NE ( XO + X6, YO - Y7) - (XO + X5 , YO - Y6)
7060 I F Y5 > YMAX THEN YMAX = Y5 : XMAX = F
7061 LOCATE 2 , 1 : PR I NT "YMAX =" ; YMAX , "@ F = " ; XMAX I TOO
7062 NEXT F
7064 LOCATE 3, 1
7066 I NPUT "ENTER TO RETURN" ; AS
7068 SKY1 = 300 I YMAX
7070 RETURN
5 1 00 ' ********** CAL I BRATE SCALE FACTOR **************
5 1 22 F = CF
5 1 24 CTOT = 0: STOT = 0 : KPI = P2 * F I ( Q )
5 1 26 FOR I = 0 T O Q1
5 1 28 CTOT = CTOT + S( I )*COS(KPI * I ) : STOT = STOT + S ( I )*S I N ( KP I * I )
5 1 30 NEXT I
5 1 32 LOCATE 1 , 1 : PR I NT F ,
5 1 34 PR I NT "COS COMPONENT =" ; CTOT/Q, " S I N COMPONENT =" ; STOT/Q
5 1 36 CTOT = CTOT I Q: STOT = STOT I Q
5 1 38 SKY1 = 200 I SQR( CTOT A 2 + STOT A 2 )
5 1 40 PR I N T 1 I ( SKY1 I 200 )
5 1 90 CLS : RETURN

We calculate the twiddle factors on the fly so as to eliminate the


two twiddle factor arrays. This is apparent in lines 1 32- 1 3 8 and 2 1 4-220.
We include the File Handler Menu here since we have added a routine to
swn two files together (line I 004)-although we do not repeat all the other
file subroutines. The major difference between this routine (lines 1 400-
1458) and the loadfile routine is we will already have one file loaded in
the S(I) array (either via reconstruction of a modified transform or loading
it with the standard loader). This routine sums a second time domain file
with the data already in the S(I) array (lines 1 3 26-29 and 1 3 80).
We come then to our music synthesizer We need a single piano
note (preferably concert A) for our model. At a sample rate of 22,050 sps
you will need about 0.743 sec. of data (i.e., 214 data points). Load this file
and transform it to the frequency domain, where you may then analyze the
maj or harmonic elements to find their center ( i . e . , peak ampl itude)
frequencies-lets talk about these.
First of all, in most instruments there will be frequencies below
the fundamental of the tone being sounded (the "box sounds"). These are
clearly visible in the spectrum, and you should experiment with including
252 Appendix 1 2.2

and eliminating them. The Synthesizer Setup routine expects 10 harmonic


elements (plus the box) so make sure you log at least 1 0. Each of these
harmonic elements has a number of sidebands, and you may experiment
with including more or less of these.
The setup routine will then step through 1 1 harmonic elements
asking for the center frequency of each element (you have just logged these
when you analyzed the piano sound above). The routine then takes the
number of sidebands you specified and transfers them to the arrays CD(I)
and SD(I). It then asks for the next harmonic clement centerfrequency,
etc., etc. Once these harmonic elements are loaded we are then ready to
synthesize our song.
The synthesizer top level routine starts at line 4080, but the
synthesizer starts at 6000. This is a very simple routine that allows typing
in a song (as notes and durations) which are converted to the piano sounds
we stored in the setup routine above (lines 4000 - 4032). The actual
generation of the transform domain for each sound is performed by the
routine at lines 4034 - 4054. Each harmonic element is shifted by the
number of half steps required to produce the desired note.
The notes are entered (line 6016) as A, B, C, etc., with the symbol
# indicating sharps and b indicating flats. A half note is entered as 2, a
quarter note as 4, etc., and you may terminate the song by typing any letter
greater than G.
There is one final routine that has been included: the Fine Line
Spectrum routine (lines 7000-7070). This is just a fractional frequency
DFT (as opposed to FFT). It's quite slow but intended for investigating
the fine line spectrum in the neighborhood of critical data. It can be used
for finding a best estimate of center frequencies for example. The human
ear can distinguish difference in frequency on the order of 1 1 1 00 Hz, and
if notes and harmonics are not accurate to that resolution we will never
produce a good synthesizer
This is only a "starter" program-if you get hooked on this you
will need to write many additional routines. For example, we control
duration by simply truncating the available note, but you should really use
the speed up technique of the previous chapteJ; but there 's much more . .
I n any case you can get a feel for where this sort o f technology i s heading.
APPENDIX 13.1

THE 2-D FFT

The core 2-D FFT is discussed in the text. We will cover the
associated routines required to display 2-D functions here. The routines to
generate 2-D functions are discussed in the next appendix.
*****************************************
******* *******
2D F F T 1 3 . 00 - 2D XFORM
*****************************************

10 SCREEN 9, 1 , 1 : COLOR 1 5 , 1 : CLS


14 I NPUT "SELECT ARRAY S I ZE AS 2AN . N = " ; N
16 N1 = N - 1 : Q = 2 A N : Q1 = Q - 1
18 ' $DYNAM I C
20 D I M C ( Q , Q ) , s e Q , Q ) , KC(Q ) , KS(Q ) , DAC ( Q , Q ) , DAS ( Q , Q )
30 Q 2 = Q / 2 : Q3 = Q 2 - 1 : Q4 = Q / 4 : Q5 = Q4 - 1 : Q 8 = Q / 8
32 P I = 3 . 1 4 1 592653589793# : P I 2 = 2 * P I : K1 = P I 2 / Q : CLVK = 1
, ****
TWIDDLE FACTOR TABLE GENERAT I ON ****
40 FOR I = 0 TO Q: KC( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I )
42 I F ABS (KC( I » < . 0000005 THEN KC( I ) = 0 ' CLEANUP TABLE
44 I F ABS(KS( I » < . 0000005 THEN KS( I ) = 0
46 NEXT I
48 FOR I = 1 TO Q1 : I NDX = 0
50 FOR J = 0 TO N 1
52 I F I AND 2 A J THEN I NDX = I NDX + 2 A ( N 1 - J )
54 NEXT J
56 I F I NDX > I THEN SWAP KC( I ) , KC( I NDX ) : SWAP KS( I ) , KS( I NDX )
58 NEXT I
I **********************

70 CLS : PR I NT : PR I NT : PR I NT " MA I N MENU" : PR I NT


74 PR I NT " 1 = TRANS FORM FUNCT I ON " : PR I NT
76 PR I NT " 2 = I NVERSE TRANSFORM " : PR I NT
84 PR I NT " 3 = GENERATE FUNCT I ONS " : PR I N T
88 PR I NT " 4 = EX I T " : PR I NT PR I NT
90 PR I NT " MAKE SELECT I ON " ;
92 A S = I NKEYS: I F AS = 1111 THEN 92
94 A = VAL ( AS ) : ON A GOSUB 1 00 , 1 50 , 5000 , 1 1 2
96 I F A = 4 THEN 9999
98 GOTO 70
I **********************************************
, * *
X FORM FUNCT I ON
I **********************************************

1 00 CLS : K6= - 1 : SK1 = 2: XD I R= 1 : T9= T I MER ' XD I R : 1 = FWD , O = I NVERSE


1 02 GOSUB 200 ' DO FORWARD ROW X FORMS
1 04 GOSUB 300 ' DO FORWARD COLUMN X FORMS
1 06 T9 = T I MER - T9 ' CHECK T I ME
112 RETURN
I **********************************************
, * *
I NVERSE TRANSFORM
I **********************************************

150 CLS : K6 = 1 : SK1 = 1 : XD I R = 0: T9 = T I MER


152 GOSUB 300 ' RECONSTRUCT COLUMNS
1 53 GOSUB 200 ' RECONSTRUCT ROWS
155 T9 = T I MER - T9 ' GET T I ME
1 60 RETURN
254 Appendix 13.1

I **********************************************
, * PLOT DATA *
, ************** ** ********** * ******* * ** *********
1 76 CLS : AMP1 = 0 ' F I ND LARGEST MAGN I TUDE I N ARRAY
1 78 FOR I = 0 TO Q - 1
1 80 FOR J = 0 TO Q - 1
1 82 I F XD I R = 0 THEN AMP = C ( I , J ) : GOTO 1 86
1 84 AMP = SQR ( C( I , J ) A 2 + S ( I , J ) A 2 )
1 86 I F AMP > AMP1 T H E N AMP1 = AMP
1 88 NEXT J
1 90 NEXT I
1 92 MAG2 = - 1 30 / AMP1 ' SET SCALE FACTOR
1 94 GOSUB 6000 ' PLOT 2 - D DATA
1 96 LOCATE 1 , 1 : PR I NT " T I ME = "; T9
1 98 RETURN

, *** * ***************** ***************************


, * TRANSFORMS *
I ************************************************
200 CLS : KRTST = 1 9
202 FOR K R = 0 T O Q1 ' X FORM 2D ARRAY B Y ROWS
204 ' I F XD I R = 1 THEN GOSUB 400
206 PR I NT US I N G "### " ; KR; , P R I NT ROW BE I NG X FORMED
208 I F KR = KRTST T H EN PR I NT : KRTST = KRTST + 20' END PR I NT L I NE

***********************************
* THE ROUT I NE BELOW I S FOR A ROW *
*********** ************************
210 FOR M = 0 TO N 1 : QT = 2 A (N - M ) ' DO N STAGES
212 QT2 = QT / 2: QT3 = QT2 - 1 : KT = 0
214 FOR J = 0 TO Q1 STEP QT : KT2 = KT + l ' DO ALL FREQUENCY SETS
216 FOR I = 0 TO QT3 : J1 = I + J : K = J1 + QT2' DO FREQUENC I ES IN SET
, ROW BUTTERFLY
218 CTEMP = ( C ( KR , J 1 ) + C ( KR , K )*KC ( K T ) - K6*S ( K R , K ) *KS ( K T » /SK1
220 STEMP = ( S ( KR , J 1 ) + K6*C ( KR , K ) * KS ( K T ) + S ( KR , K ) * KC ( K T » /SK1
222 CTEMP2 = ( C ( KR , J 1 ) + C ( KR , K ) *KC ( KT 2 ) - K6*S ( KR , K ) * KS(KT2» /SK1
224 S ( KR , K ) = ( S ( KR , J 1 ) + K6*C ( KR , K )*KS ( KT 2 ) + S ( KR , K )*KC ( KT 2 » /SK1
226 C ( K R , K ) = CTEMP2: C ( K R , J 1 ) = CTEMP : S ( K R , J 1 ) = STEMP
228 NEXT I ' ROTATE AND SUM NEXT PA I R O F COMPONENTS
230 KT = KT + 2
232 NEXT J ' DO NEXT SET OF FREQUENC I ES
234 NEXT M ' DO NEXT STAGE
, B I T REVERSAL FOR ROW TRANSFORMS
236 FOR I = 1 TO Q1 : I NDX = 0
238 FOR J = 0 TO N 1
240 I F I AND 2 A J THEN I NDX = I NDX + 2 A ( N 1 - J )
242 NEXT J
244 I F I NDX>I THEN SWAP C ( KR , I ) , C ( KR , I NDX ) : SWAP S ( KR , I ) , S ( KR , I NDX)
246 NEXT I
248 ' I F XD I R = 0 THEN GOSUB 400
250 NEXT KR
252 T9 = T I ME R - T9: GOSUB 1 76' USE TO SHOW RESULTS OF ROW X FORMS
254 AS = I NKEYS : I F AS = "" THEN 254
256 CLS : T9 = T I MER - T9: RETURN ' ROW TRANSFORMS DONE
The 2-D FFT 255

*************************************
* THE ROUT I NE BELOW IS FOR COLUMNS *
*************************************
300 KRTST = 1 9
302 FOR KR = 0 T O Q 1 ' XFORM 2 0 ARRAY B Y COLUMNS
304 ' I F XD I R = 1 THEN GOSUB 4 1 0
306 PR I NT US I NG "###_ " ; KR;
308 I F KR = KRTST THEN PR I NT : KRTST = KRTST + 20
310 FOR M = 0 TO N 1 : QT = 2 A ( N - M)
312 QT2 = QT / 2: QT3 = QT2 - 1 : KT = 0
314 FOR J = 0 TO Q1 STEP QT : KT2 = KT + 1
316 FOR I = 0 TO QT3: J 1 = I + J : K = J 1 + QT2
' COLUMN BUTTERFLYS
318 CTEMP = ( C ( J 1 , KR ) + C ( K , K R ) * KC( K T ) - K6* S ( K , KR ) * KS( KT » /SK1
320 STEMP = ( S ( J 1 , K R ) + K6* C ( K , K R ) * KS(KT ) + S ( K , K R ) * KC(KT » /SK1
322 CTEMP2 = ( C ( J 1 , KR ) + C ( K , K R ) *KC( KT2 ) - K6* S ( K , KR ) * KS( KT2 » /SK1
324 S ( K , K R ) = ( S ( J 1 , KR ) + K6* C ( K , K R ) * KS( KT 2 ) + S ( K , KR ) * KC(KT2» /SK1
326 C(K, KR ) = CTEMP2 : C ( J 1 , KR ) = CTEMP : S ( J 1 , KR ) = STEMP
328 NEXT I
330 KT = KT + 2
332 NEXT J
334 NEXT M
, ***** ************* **** ***************
, *
B I T REVERSAL FOR COLUMN TRANSFORMS *
, *************************************
336 FOR I = 1 TO Q1 : I NDX = 0
338 FOR J = 0 TO N 1
340 I F I AND 2 A J T H E N I NDX = I NDX + 2 A ( N 1 - J )
342 NEXT J
344 I F I NDX> I THEN SWAP C( I , KR ) , C ( I NDX , KR ) : SWAP S ( I , KR ) , S ( I NDX , KR )
346 NEXT I
348 ' I F XD I R = 0 THEN GOSUB 4 1 0
350 NEXT KR
352 I F K6 = 1 THEN XD I R = 1
354 T9 = T I MER - T9: GOSUB 1 76 ' USE TO SHOW RESULTS OF COLUMN X FORMS
356 I F K6 = 1 THEN XD I R = 0
358 AS = I NKEYS : I F AS = "" THEN 358
360 CLS : T9 = T I MER - T9: RETUR N ' COLUMN TRANSFORMS DONE

I ****************************************
, * *
MOD I FY ROW SAMP L I NG
I ****************************************

400 FOR I = 1 TO Q1 STEP 2


402 C ( KR , I ) = - C ( K R , I ) : S ( K R , I ) = - S ( K R , I )
404 NEXT I
406 RETURN

, ****************************************
, * *
MOD I FY COLUMN SAMPL I NG
, ****************************************
4 1 0 FOR I = 1 TO Q1 STEP 2
4 1 2 C( I , KR ) = - C ( I , KR ) : S C I , KR ) = - S C I , KR )
4 1 4 NEXT I
4 1 6 RETURN
256 Appendix 13.1

, *********************************
, * GENERATE FUNCT I ON S *
, *********************************
5000 XD I R = 0
5001 CLS : PR I NT : PR I NT : PR I NT " FUNCT I ON MENU" : PR I NT
5002 PR I NT " 1 = GENERATE S I NCA2 FUNCT I ON 2 = S I NC FUNCT I ON " : PR I NT
5009 PR I NT " 9 = EX I T : " : PR I NT
5010 PR I NT " MAKE SELECT I ON " ;
5012 A S = I NKEYS : I F A S = " " T H E N 5 0 1 2
5014 A = VAL ( AS ) : O N A GOTO 5030, 5500
5016 I F A = 9 THEN RETURN
5018 GOTO 5000

, *********************************
, * S I NCA2 FUN CT I ON *
I *********************************
5030 CLS
5032 I NPUT "W I DT H " ; WDTH1 ' I NPUT F I NCT I ON S I ZE
5034 I F WDTH1 = 0 THEN WDTH1 = 1 ' ZERO I NVAL I D
5036 SKL1 = P I 2 I WDT H 1 : MAG1 = Q ' CONSTANTS
5038 FOR I = 0 TO Q - 1 '
5040 YARG = SKL1 * ( I - Q2 ) : PR I NT "*" ;
5042 FOR J = 0 TO Q . 1
5 044 XARG = SKL1 * ( J • Q2)
5 046 I F YARG = 0 AND XARG = 0 THEN C ( I , J) = MAG1 : GOTO 5052
5 048 ARG = SQR(XARG A 2 + YARG A 2 )
5050 C ( I , J ) = MAG1 * ( S I N (ARG ) I ARG) A 2 : S ( I , J ) = 0
5052 NEXT J
5054 NEXT I
5055 MAG2 = - 1 30 I MAG1
5056 GOSUB 6000 ' PLOT FUNCT I ON
5058 PR I NT "ANY KEY TO CON T I NUE " ;
5060 A S = I NKEYS : I F A S = " " THEN 5060 ' WA I T
5080 RETURN

5500 ' *********************************


, * S I N C FUNCT I ON *
, *********************************
5502 CLS : MAG1 = Q: T O = 1 : T1 = 0
5 5 04 I NPUT " W I D T H " ; WD T H 1
5 5 06 SK L 1 = P I 2 I WDT H 1 : MAG1 = Q
5 5 08 FOR I = 0 TO Q - 1
5510 YARG = SKL1 * ( I - Q2 ) : PR I N T "*" ;
5520 FOR J = 0 TO Q - 1
5522 XARG = SKL1 * ( J - Q2)
5524 I F YARG = 0 AND XARG = 0 THEN C ( I , J) = MAG 1 : GOTO 5530
5526 ARG = SQR( XARG A 2 + YARG A 2 )
5528 C ( I , J ) = MAG1 * ( S I N (ARG) I ARG ) : S ( I , J ) = 0
5530 NEXT J
5550 NEXT I
5590 GOSUB 1 76
5592 PR I NT "ANY KEY TO CON T I NUE " ;
5594 A S = I NKEYS : I F A S = " " THEN 5594
5598 RETURN
The 2-D FFT 257

6000 ' *******************************


, * PLOT DATA *
I *******************************
6002 CLS ' CLEAR SCREEN AND SET SCALE FACTORS
6004 XCAL = 320 / Q: YCAL = 1 20 / Q: YD I S = 1 5 0 : Xo = 1 5
6006 FOR I = 0 T O Q - 1 ' FOR A L L ROWS
6008 D I SP = XO + (Q - I ) * 288 / Q ' D I SPLACE ROWS FOR 3/4 V I EW
601 0 PER = I / (2 * Q) , CORRECT FOR PERSPECT I VE
60 1 2 FOR J = 0 TO Q - 1 ' FOR EACH P I XE L I N ROW
601 4 X 1 1 = « XCAL + PER ) * J ) + D I SP : Y 1 1 = « YCAL + . 3 * PE R ) * I ) + YD I S
60 16 I F XD I R= 0 THEN AMP= C ( I , J ) ELSE AMP= SQR ( C ( I , J ) A2+ S ( I , J ) A 2 )
60 1 8 A M P = MAG2 * AMP
6020 L I NE ( X 1 1 , Y1 1 + AMP ) - ( X 1 1 , Y1 1 )
6022 PRESET (X 1 1 , Y 1 1 + AMP + 1 )
6024 NEXT J ' NEXT P I XE L
6026 NEXT I ' NEXT ROW
6028 RETURN ' ALL DONE
I ** ***********

9999 END : STOP

Displaying the 2-D function (lines 6000-28) must be discussed.


We scale the X axis to cover 320 pixels for Q data points (6004) and Y =
1 20/Q. Instead of defining YO we call it YDIS = 1 50, and along with XO
we define DISP in line 6008. Note that DISP changes as we step down
through the rows, moving slowly to the left. In line 60 1 4 we calculate the
actual location of the pixel as X 1 1 and Y 1 1 . At 60 1 8 we calculate the
intensity of the function (AMP) depending on whether it is a frequency or
time domain function (i.e., the Z axis component), and at line 6020 we plot
this as a verticalline. This simple routine results in a "3-D" representation
of the function. To make this routine work we must know the maximum
amplitude of the function to be plotted (MAG2), and we take care of that
requirement back in lines 1 76- 198. In lines 1 78-190 we step through the
data points and compare the magnitudes to a test value AMP 1 . If the data
point exceeds AMP I it becomes AMP l . In line 1 92 we use AMPI to
calculate MAG2. At line 194 we jump to the plot routine.
Lines 5000-5018 are the menu for the generate functions routines.
We use only two functions here and they both have the same general form.
You will recognize the argument (calculated as a radius in line 5048) is an
angular function, and the sinc function squared is calculated in line 5050.
We set the scale factor MAG2 = - 1 30IMAG 1 and jump directly to the plot
routine.
The one major modifi cation to this routine ( i . e . , quadrant
correction) may be implemented by simply removing the apostrophe from
in front of lines 204, 248, 304 and 348; however, you should always feel
free to modify these routines in any way you desire.
APPENDIX 14.1
2-D FUNCTIONS

14.1 QUADRANT SWITCHING

While the sampling modification of the previous chapter gets the


quadrants in the proper location, we may also solve the problem by simply
switching the quadrants around. The code is shown below, which replaces
the modify sampling routine at lines 400-434.
, ****************************************
, * *
QUADRANT CORRECT I ON
I ****************************************

400 FOR I = 0 TO Q3
402 FOR J = 0 TO Q3
404 1 2 = I + Q2 : J2 = J + Q2
406 SWAP C ( 1 2 , J 2 ) , C ( I , J ) : SWAP S ( 1 2 , J 2 ) , S ( I , J )
410 NEXT J
412 NEXT I
420 FOR I = 0 TO Q3
422 FOR J = Q2 TO Q - 1
424 1 2 = I + Q2 : J2 = J - Q2
426 SWAP C ( 1 2 , J 2 ) , C ( I , J ) : SWAP S ( 1 2 , J 2 ) , S ( I , J )
430 NEXT J
432 NEXT I
434 RETURN

To solve the problem completely we must switch before taking


the transform and after taking the transform-the shifts are identical in
both cases. We must switch them before and after taking the inverse
transform, of course-you might want to experiment with what happens
if you only switch once (the problem becomes apparent in Ch. 1 6).

The first function we consider is the sinusoidal "bar" pattern.

5200 REM *********************************


*
REM * S I NUSOIDAL BARS
REM *********************************
5202 CLS : KRAD = PI I Q
5204 PR I NT " I NPUT HOR I Z , VERT FREQUE N C I E S (MUST BE BETWEEN 1 AND" ; Q2;
5206 I NPUT FH, FV: I F F H < 0 OR F H > Q2 THEN 5204
5208 I F FV < 0 OR FV > Q2 THEN 5204
5 2 1 0 HKRAD = KRAD * F H : VKRAD = KRAD * FV
521 2 FOR I = 0 TO Q1
5 2 1 4 FOR J = 0 TO Q1
5 2 1 6 C ( I , J ) = S I N ( VKRAD * J - HKRAD * I ) A 2: S ( I , J ) = 0
5224 NEXT J
5226 NEXT I
5228 MAG2 = - 1 3 0 : GOSUB 6000' D I SPLAY FUNCT I ON
5230 I NPUT AS ' WA I T USER I NPUT
5232 RETURN
The 2-D Functions 259

This is another simple function. We input the frequencies of both the


horizontal and vertical sinusoids (if you want horizontal bars only, input
o for the vertical frequency, etc). We calculate the angular velocity for
vertical and horizontal in line 5210, and lines 52 12-26 set up loops to step
through the data points. J designates the column; so, if the horizontal
angular velocity is zero, we will generate the same values for each column
(similar horizontal results for zero vertical angular velocity).
We may conveniently make the point here that a digitized image
is a matrix of real valued numbers. Consequently, we could use the
PFFFT for the row transforms, cutting the transform time almost in half1
For a reasonably large picture this would be a significant gain; but, the
results of these row transforms are complex numbers, and a conventional
FFT is required for the columns. Nevertheless, we would only have half
as many components to transform if we used a PFFFT for the rows, so the
2: 1 speedup would be carried through the whole 2-D transform.
The connection with the sinusoidal bar generator is this: there are
two ways to generate the 2-D sinusoids in line 57 1 6--we may either add
the x and y variables or we may subtract them (in the present case we
subtract them). The difference in the final function is that the peaks and
troughs of the sinusoids either run from upper left to lower right or from
lower left to upper right. Both of these forms are necessary to draw all
possible pictures of course. The difference in the frequency domain is that
one of these forms shows up as negativefrequencies in the 2-D transform,
and that is why we must use a conventional, negative and positive
frequency FFT in the column transforms. It's not especially difficult to
construct a 2-D transform using the PFFFT for the horizontal transforms
and would be a good exercise for anyone who plans to spend a lot of time
working with images (i.e., 2-D data formats).
The second function we must generate is the sinc2 function.

, *********************************
, * S I NC"2 FUNCT I ON *
, *********************************
5030 CLS : T1 = 0 : T O = 1
5032 I NPUT "WIDTH"; WDTH1 ' I NPUT F I NCT I ON S I ZE
5 034 IF WDTH1 = 0 THEN WDTH1 = 1 ' ZERO I NVAL I D
5 036 SKL1 = P I 2 I WDT H 1 : MAG1 = Q ' CALC CONSTANTS
5038 FOR I = 0 TO Q - 1 '
5040 YARG = SKL 1 * ( I - Q2 ) : PR I NT " * " ;
5042 FOR J = 0 T O Q - 1
5044 XARG = SKL1 * ( J - Q2)
5046 I F YARG = 0 AND XARG = 0 THEN C( I , J ) = MAG1 : GOTO 5052
260 Appendix 14.1

5048 ARG = SQR( XARG � 2 + YARG � 2)


5050 C ( I , J) = MAG1 * ( S I N (ARG) / ARG) � 2: S( I , J) = 0
5052 NEXT J
5054 NEXT I
5055 MAG2 = - 1 30 / MAG1
5056 GOSUB 6000 ' PLOT FUNCT I ON
5058 I NPUT AS I WA I T
5060 RETURN

We know the sinc function is simply the sine of the argument


divided by the argument, but the argument in this case is the radial
distance from the center of the function. To draw this function in the
center of the matrix we make the zero at point (QI2, QI2). We enter a
desired "width" for our function at line 5032. Line 5036 then calculates
a scale factor for that width. At line 5038 we set up a loop which counts
the rows of the matnx, and at 5040 calculate the Y axis argument as
SKL l *(I-Q2) [thereby making the zero point at the middle row] . Line
5042 sets up a nested loop to count the columns and then we calcuate an
X axis argument which will be zero half-way across the columns. We
must then check for the 0,0 point to avoid division by zero. At line 5048
we calculate the radial argument for the sinc2 function, and at line 5050
calculate the value for this x, y position.

We next consider the Bessel function routine. The equations for


this function may be found in any good reference book (e.g., the CRC
Handbook of Chemistry and Physics, CRC Press). There are a great many
ways to implement a routine to generate these functions and, except for
the following comments, we will not go into detail on this particular
routine. The routine is presented below.

, *********************************
I * BESSEL FUNCT I ON *
I *********************************
5600 CLS : o E FoBL o - K
5604 I NPUT " W I D T H " ; WDTH1
5606 I F WD T H 1 < 1 THEN 5604 I M I N I MUM W I D T H
5608 S K L 1 = P I / ( 3 . 6 * WDTH1 * Q / 64)
561 0 FOR I = 0 TO Q - 1
561 2 YARG = SKL1 * ( I - Q2 ) : PR I NT " * " ;
5614 FOR J = 0 T O Q - 1
5616 XARG = SKL1 * ( J - Q2 )
5618 KARG = SQR( XARG � 2 + YARG � 2 )
5620 K A = 1 : K B = 1 : oAT 1 = 1 : KTGL = 1
5622 FOR K = 2 TO 900 STEP 2
5624 KTGL = - 1 * KTGL
5626 KA = KA * K: KB = KB * ( K + 2 ) : oENOM = KA * KB
5628 oAT2 = KTGL * ( WD T H 1 � (K / 2 ) * KARG � K / oENOM )
5630 I F ABS(oAT 2 ) < ABS(oAT 1 ) * 1 E - 1 0 THEN 5640
5632 oAT 1 = oAT 1 + oAT2
The 2-D Functions 261

5634 I PR I NT OAT 1 ,
5636 NEXT K
5638 PR I N T n# n
5640 C( I , J ) = OAT 1 : S ( I , J ) = 0
5642 NEXT J
5644 NEXT I
5646 GOSUB 1 76
5648 I NPUT AS
5650 RETURN

The correct aperture function, howeveI; may be generated via a


modification of the sinusoidal bar routine.

REM ****************************** ***


REM * BESSEL FUNCT I ON I I *
REM ***** ****************************
5800 C L S : MAG1 = Q: KR = P I 2 / Q: MAG2 = - 1 30
5802 FOR 1 = 0 TO Q: FOR J = 0 TO Q: C( I , J ) = 0: S ( I , J ) = 0 : NEXT : NEXT
5806 I N PUT n I H O T H n ; WDH
5808 FOR A = 0 TO WO H : I F A = 0 THEN M2 = 0 . 5 ELSE M2 = 1 . 0
5810 FOR B= 0 TO SQR (WDHA2 - AA2 ) : I F B= 0 THEN M1 = M2/2 E LSE M 1 = M2
581 2 FOR I = 0 TO Q1 : 12 = A * ( I - Q2)
581 4 FOR J = 0 TO Q1 : J 2 = B * (J - Q2)
581 6 C( I , J ) = C( I , J ) + M1 * ( COS(KR * ( 1 2 - J 2 » + COS ( KR * ( 1 2 + J 2 » )
581 8 NEXT J : NEXT I
5822 NEXT B : NEXT A
5828 GOSUB 1 76
5830 I NPUT AS
5832 RETURN

Sinusoidal bar patterns transform as single harmonics in the frequency


domain; therefore, we may place components at any position. To generate
the correct aperture function in the frequency domain we need only sum
the sinusoidal bars required to cover the desired aperture.
We ask for the desired "width" in line 5806, and in line 5808 we
set up a loop to step A from zero to this width. A will specify the
frequency of the sinusoids down the rows by stepping through the
harmonic frequencies from zero to WDH, so we must then step B through
all the frequencies that are to be generated within that row. For example,
when A 0, B must step through every frequency up to the WDH
=

specification; howeveI; when A = WDH, B will only take on the value of


zero. That is, B must take on all values to generate a circular pattern in
the frequency domain, which is accomplished by solving for the x, Y
components of a radius: B = VW 0 H 2 - A 2 . So, for each of these
frequencies we must perform the generate sinusoidal bars routine (lines
5 8 1 2-58 1 8). You will notice that we do not square the sinusoids in this
262 Appendix 14.1

routine [you might want to try that variation in your experiments]. You
should note the difference between Fig. 14. 14 and Fig. 14. 1 1 in the text.
Finally, we can generate the proper image domain function by
using the inverse of the above process. We generate a circular function
in the frequency domain and inverse transform (the Bessel III routine).

5300 ' *********************************


, * C I RC FUNCT I ON *
, *********************************
5302 CLS : MAG1 = Q
5304 I NPUT "D I AMETE R " ; D I A1
5306 I NPUT "CENTERED ON ( X , Y ) " ; CNTRX , CNTRY
5308 SKL1 = Q I D I A1 : MAG1 = Q
53 1 0 FOR I = 0 TO Q - 1
5312 YARG = I - CNTRY : PR I NT "* " ;
5314 FOR J = 0 TO Q - 1
5316 XARG = J - CNTRX
5318 C( I , J ) = 0 :
5320 ARG = SQR( XARG � 2 + YARG � 2 )
5322 I F ARG <= D I A1 THEN C( I , J ) = MAG 1 : S ( I , J ) = 0
5324 NEXT J
5326 NEXT I
5328 GOSUB 1 76
5330 I NPUT AS
5332 RETURN

This routine is so simple it doesn't require an explanation, but it should


be pointed out that for the aperture function, the function should be
centered at Q/2 , Q/2. [Note: I f you construct this function in the
frequency domain as it is presented here, when you reconstruct the image
domain, (without the benefit of quadrant re-arrangement) the reconstructed
function will be split into quarters as was the first 2-D frequency domain
function. A little thought will make it apparent why.]
We will not discuss the star or impulse function as it simply
places a data point at some desired location in the image.
In regard to the Bessel function, we should note that Professor
Gaskill I defines a "sombrero function" as a Bessel function of the first
kind of the first order (by dividing its argument analogous to the
construction of the sinc function). This is the function generated by a star
(or other point source) when imaged through an optical system with a
circular aperture.

l
In Linear Systems, Fourier Transforms, and Optics, lack 0 Gaskill, lohn
Wiley & Sons. So far as I know this is the standard graduate-level text in this field
APPENDIX 15.1

FOURIER OPTICS ROUTINES

5400 ' ***********************************


, * D I F FRACT I ON TEST *
, ***********************************

5402 CLS
5404 I NPUT " I NPUT SL I T W I D T H , LENGTH ( I . E . TO 2 , 20 ) " ; DELX , D E LY
5406 MAG1 = Q A 2: ANM = MAG1 * ANP : AN = 0
5408 FOR I = 0 TO Q - 1
54 1 0
FOR J = 0 TO Q - 1
5412 C ( I , J ) = AN : S ( I , J ) = AN
5414 NEXT J
541 5NEXT I
5416 I F DELX = 0 THEN 5450 ' HEXAGON APERTURE
5417 I F DELY = 0 THEN 5468 ' OCTAGON APERTURE
5418 I F DELX > Q2 OR DELY > Q2 THEN 5425
5420 FOR I = -DELX TO (DELX - 1 )
5421 FOR J = -DELY TO (DELY - 1 )
5422 C ( Q2 - I , Q2 + J ) = MAG1
5423 NEXT J
5424 NEXT I
5425 ' C ( O , 0) = MAG1
5426 MAG2 = - 1 20 I Q A 2
5428 GOSUB 1 76 ' D I SPLAY HAND I WORK
5430 I NPUT "C/R TO CON T I NUE " ; AS
5432 RETURN
, ******* *******
HEX APERTURE
5450 FOR I = - 6 TO 6: A = - C I NT(ABS( I ) * . 6285 - 6 . 8667)
5452 FOR J = - ( 1 + A) TO A
5454 C ( Q2 - I , Q2 + J ) = MAG1
5456 NEXT J
5458 NEXT I
5464 GOTO 5426
, ********** *******
OCTAGON APERTURE
5468 FOR I = 4 TO 8
5470 FOR J = - I TO I - 1 : C ( Q2 - 1 2 + I , Q2 + J ) = MAG1 : NEXT J
5472 NEXT I
5474 FOR I = 9 TO 1 4
5476 FOR J = - 8 T O 7 : C ( Q2 - 1 2 + I , Q 2 + J ) = MAG1 : NEXT J
5478 NEXT I
5480 FOR I = 8 TO 4 STEP - 1
5482 FOR J = - I TO I - 1 : C ( Q2 + 1 1 - I , Q2 + J ) = MAG 1 : NEXT J
5484 NEXT I
5486 GOTO 5426

This routine generates a slit of user selected dimensions (lines


5420-5424); however, if a zero is entered for the x dimension a small
hexagon shaped aperture will be created (lines 5450-5464) and if a zero
is entered for the y dimension an octagon shaped aperture will be created
(lines 5468-5486). You might want to look closely at how these are
generated--especiallythe hex aperture.
264 Appendix 15.1

I * *******************************************************
, * PR I NT OUTPUT
I ********* ***********************************************
500 CLS : PR I NT "ONLY DATA ABOUT THE 0 , 0 PO I NT \J I L L BE PR I NTED"
I ********************************************************
540 CLS : PR I NT " ONLY THE PHASES OF THE HARMON I CS ARE PR I NTED " :
PR I NT ' P R I N T SCREEN
542 FOR I = Q2 - 3 TO Q2 + 3
544 FOR ROLOC = Q2 - 3 TO Q2 + 3
546 Y2 = C ( ROLOC , I ) : X2 = S ( ROLOC , I ) : MAG = SQR ( Y2 A 2 + X2 A 2 )
548 ANG = 1 8 0 / P I * ATN ( X2 / Y2 ) : I F Y 2 < 0 THEN ANG = ANG + 1 80
550 PR I N T US I NG "### . ###- "; ANG;
552 NEXT ROLOC
554 PR I N T : NEXT
556 I NPUT AS
558 RETURN

This Print Routine is the one used to generate the tables ofp. 180
(Chapter 1 5 , section 1 5 . 6), and will display only the angle of the
transformed harmonics (for ± 3 rows and ± 3 columns about the 0, 0
location).
APPENDIX 16.1

IMAGE ENHANCEMENT

*****************************************
******* 2D F F T 1 6 . 00 - 20 X FORM *******
*****************************************
10 SCREEN 9, 1 , 1 : COLOR 1 5 , 1 : CLS
1 4 I NPUT "SELECT ARRAY S I ZE AS 2"N . N = " ; N
16 N1 = N - 1 : Q = 2 " N : Q1 = Q - 1
18 ' $DYNAM I C
20 D I M C ( Q , Q ) , S ( Q , Q ) , KC( Q ) , KS( Q ) , DAC ( Q , Q ) , DAS ( Q , Q )
2 2 TYPE P i x L
P I X AS I NTEGER
END TYPE
28 D I M P I XREC AS P i x L
3D Q2 = Q I 2: Q3 = Q2 - 1 : Q4 = Q I 4 : Q5 = Q4 - 1 : Q8 = Q I 8
32 PI = 3 . 1 4 1 592653589793#: P I 2 = 2 * P I : K1 = P I 2 I Q : CLVK = 1
I **** TWIDDLE FACTOR TABLE GENERAT I ON ****
40 FOR I = 0 TO Q: KC( I ) = COS ( K 1 * I ) : KS( I ) = S I N ( K 1 * I )
42 I F ABS(KC( I » < . 0000005 THEN KC( I ) = 0 I CLEANUP TABLE
44 I F ABS ( KS ( I » < . 0000005 THEN KS( I ) = 0
46 NEXT I
48 FOR I = 1 TO Q1 : I NDX = 0
50 FOR J = 0 TO N 1
52 I F I AND 2 " J THEN I NDX = I NDX + 2 " ( N 1 - J )
5 4 NEXT J
56 I F I NDX > I THEN SWAP KC( I ) , KC( I NDX ) : SWAP KS( I ) , KS ( I ND X )
5 8 NEXT I
I ***************
70 CLS : PR I NT : PR I N T : PR I NT " MA I N MENU" : PR I NT
72 PR I NT 1 = LOAD . BMP F I LE " : PR I NT
74 PR I NT 2 = TRANSFORM FUNCT I ON " : PR I N T
76 PR I NT 3 = I NVERSE TRANSFORM " : P R I N T
78 PR I NT 4 = MOO I FY TRANSFORM " : PR I N T
80 PR I NT 5 = SAVE F I LE " : P R I NT
84 PR I NT 6 = GENERATE FUNCT I ONS ": PR I NT
86 PR I NT 7 = MOO I FY SPACE DOMA I N FUNCT I ON " : PR I N T
88 PR I NT 9 = EX I T " : P R I N T : PR I NT
90 PR I NT MAKE SELECT I ON " ;
9 2 A S = I NKEYS: I F A S = " " THEN 92
94 A = VAL ( AS ) : ON A GOSUB 4000, 1 00 , 1 5 0 , 3000 , 4 1 00 , 5000 , 2400
96 I F A = 9 THEN 9999
98 GOTO 70
I ********** X FORM FUNCT I ON GOES HERE *************
2400 I *** MOO I F Y SPACE DOMA I N FUNC T I ON ***
2402 CLS : PR I N T : P R I N T SPC( 1 5 ) ; "MENU"
2404 P R I N T : PR I NT "1 = CHANGE GREY SCALE RANGE"
2406 P R I N T : P R I N T " 2 = MOO I FY CON TRAST"
2408 AS = I NKEYS: I F AS = " " THEN 2408
241 0 ON VAL (AS) GOSUB 2420, 2460
241 2 RETURN
I *** L I M I T GREY SCALE RESOLUT I ON ***
2420 CLS
2422 A = 1 : B = 0 I F I RST F I ND RANGE OF DATA
2424 FOR I = 0 TO Q - 1
2426 FOR J = 0 TO Q - 1
266 Appendix 16.1

2428 I F C ( I , J ) > A THEN A = C( I , J )


2430 I F C ( I , J ) < B THEN B = C ( I , J )
2432 NEXT J
2434 NEXT I
2436 I F B > 0 T HEN B = 0 ' I F > 0 E L I M I NATE FROM CALCS .
2438 I NPUT "NUMBER OF B I TS GREY SCALE ( LESS T HAN 1 6 ) " ; GK
2440 GK = 2 � GK
2442 A = (A - B) I GK
2444 FOR I = 0 TO Q - 1
2446 FOR J = 0 TO Q - 1
2448 C ( I , J ) = I NT « C( I , J ) - B ) I A )
2450 NEXT J
2452 NEXT I
2454 PR I NT A , B ' OKAY , NOW WE HAVE A NEW DYNAM I C RANGE
2456 RETURN
2460 ' *** CHANGE CONTRAST ***
2462 AMAX = 0: AM I N = 256
2464 FOR I = 0 TO Q - 1
2466 FOR J = 0 TO Q - 1
2468 A = C ( I , J ) : I F A > AMAX T HEN AMAX = A
2470 I F A < AM I N T HEN AM I N = A
2472 NEXT J
2474 NEXT I
2475 C = 0 : PR I NT "AMAX = " ; AMAX ; " AND AM I N = " ; AM I N
2476 PR I NT " HOLD BLACK OR W H I TE CONSTANT ( B/W ) ? "
2478 AS = I NKEYS : I F A S = " " T HEN 2478
2480 I F AS = "B" OR AS = "b" T HEN C = 1 : GOTO 2484
2482 I F AS <> "W" AND AS <> "w" T HEN 2478
2484 P R I NT : I NPUT " I NPUT MULT I P L I CAT I ON FACTOR " ; MK
2486 FOR I = 0 TO Q - 1
2488 FOR J = 0 TO Q - 1
2490 I F C = 0 THEN C ( I , J ) = AMAX - ( MK * (AMAX - C ( I , J » )
2492 I F C = 1 THEN C ( I , J ) = ( MK * ( C ( I , J ) - AM I N » + AM I N
2494 NEXT J
2496 NEXT I
2498 GOSUB 6000 ' D I SPLAY RESULTS
2500 I NPUT AS ' WA I T
2502 RE TURN
, T HE ROUT I NES BELOW REQU I RE D I ME N S I ON I N G ARRAY STD ( Q , Q )
, ********** SAVE P I CTURE **********
FOR I = 0 TO Q - 1
FOR J = 0 TO Q - 1
STD ( I , J ) = C ( I , J )
NEXT J
NEXT I
RETURN
, ********** RECALL P I CTURE **********
FOR I = 0 TO Q - 1
FOR J = 0 TO Q - 1
C ( I , J ) = STD ( I , J ) : S( I , J ) = 0
NEXT J
NEXT I
RETURN
, *********************************
, * MOO I FY TRANSFORM *
Image Enhancement 267

I *********************************
3000 CLS : PR I NT : PR I NT "MOO I FY SPECTRUM MENU " : PR I NT PR I NT
3002 PR I NT " 1 - MUL T I PL Y W I T H STOREO SPECTRUM"
3004 P R I NT " 2 - O I VIOE CURRENT/STOREO SPECTRUMS"
3006 P R I N T " 3 - F I LTER SPECTRUM"
3008 P R I NT " 4 - TRUNCATE SPECTRUM"
30 1 0 PR I NT " 5 - SAVE SPECTRUM"
30 14 PR I NT " 9 - EX I T " : P R I N T : PR I NT
30 1 8 PR I NT " MAKE SELECT I ON "
3020 A S = I NKEYS: I F A S = '"' T HEN 3020
3022 I F ASC(AS) < 49 OR ASC(AS) > 57 T HEN 3000
3024 A = VAL ( AS ) : ON A GOSUB 3200, 3300, 3 1 00 , 3500 , 3400
3026 I F A = 9 THEN A = 8
3028 RETURN
, **********************************
, * GAUSS I AN F I LTER
I **********************************

3 1 00 I NPUT "CUTOFF FREQ . "; FCO


3 1 02 FOR I = -Q2 TO Q2
3 1 04 FOR J = -Q2 TO Q2
3 1 06 F I = SQR ( I A2 + J A2 ) : ATTN = ( 1 0A ( - . 3/2* ( F I /FCO)A3»
3 1 08 1 2 = Q2 + I : J2 = Q2 + J
3110 C ( 1 2 , J 2 ) = C ( 1 2 , J 2 ) *ATTN : S ( 1 2 , J 2 ) = S ( 1 2 , J 2 ) *ATTN
3112 NEXT J
3114 NEXT I
31 1 6 GOSUB 6000 ' O I SPLAY RESULTS
31 1 8 I NPUT AS ' WA I T
3 1 20 RETURN
3200 ' **** MULT I P LY FREQUENCY FUNCT I ONS ****
3202 FOR I = 0 TO Q - 1
3204 FOR J = 0 TO Q - 1
3206 C I J = C( I , J ) : S I J = S( I , J )
3208 COAT = OAC( I , J ) : SO AT = OAS( I , J )
32 1 0 C ( I , J ) = ( C I J * COAT ) - ( S I J * SOAT ) : S ( I , J ) = ( C I J * SOAT )+ ( S I J * COAT )
321 2 NEXT J
3214 NEXT I
3216 GOSUB 6000 ' O I SPLAY RESULTS
3228 I NPUT AS ' WA I T
3230 RETURN
3300 CLS ' **** O I VI OE CURRENT/STOREO SPECTRUM *** *
3302 P R I NT SPC ( 5 ) ; "C = O I VI OE CURRENT FUNCT I ON BY STOREO FUNCT I ON "
3304 PR I NT SPC( 5 ) ; "s = O I VIOE STOREO FUNCT I ON B Y CURRENT FUNCT I ON "
3308 AS = I NKEYS: I F A S = " " T HEN 3308
33 1 0 CSFLG = 1 : I F AS = "S" OR AS = " s " THEN CSFLG = 2 : GOTO 33 1 4
33 1 2 I F A S <> "C" ANO A S < > " c " T H E N 3308
33 14 FOR I = 0 TO Q - 1
33 1 6 FOR J = 0 TO Q - 1
33 1 8 C I J = C( I , J ) : S I J = S( I , J ) : C( I , J ) = 0 : S( I , J ) = 0
3320 R I J = SQR ( C I J A 2 + S I J A 2 )
3322 ' I F R I J < . 0000001 T HEN 3348 ' SK I P I F OATA T OO SMALL ?
3324 I F C I J = 0 THEN P H I J = PI / 2: GOTO 3328 ' CAN ' T O I V IOE BY ZERO
3326 P H I J = ATN ( S I J / C I J ) , F I NO ANGLE
3328 I F C I J < 0 THEN P H I J = P H I J + PI ' CORRECT FOR NEG X AX I S
3330 COAT = OAC ( I , J ) : SOAT = OAS( I , J ) , GET STOREO OATA
3332 ROAT = SQR( COAT A 2 + SOAT A 2) , F I NO MAG
268 Appendix 16.1

3334 I F COAT = 0 THEN PHDAT = P I /2 : GOTO 3338 ' CAN ' T D I V I D E BY ZERO
3336 PHDAT = ATN ( SDAT / COAT) , GET ANGLE
3338 I F COAT < 0 THEN PHDAT = PHDAT + PI ' CORRECT FOR NEG X AX I S
, *** D I V I DE ( F I NALLY) ***
3340 I F C S F L G = 1 THEN RQOT = R I J/RDAT : P HQOT = P H I J - P HDAT : GOTO 3344
3342 RQOT = RDAT / R I J : P HQOT = PHDAT - P H I J
3344 C ( I , J ) = COS ( P HQOT ) * RQOT ' CONVE RT T O X , Y
3346 S ( I , J ) = S I N ( P HQOT ) * RQOT
3348 NEXT J
3350 NEXT I
3352 GOSUB 1 60 ' D I SP LAY RESULTS
3354 I NPUT AS ' WA I T FOR USER
3390 RETURN
3400 ' **** TEMP SAVE SPECTRUM IN DAX ( I , J ) ****
3402 AMPN = 1
3404 FOR I = 0 TO Q - 1
3406 FOR J = 0 TO Q -
3408 DAC( I , J ) = C( I , J ) : DAS( I , J ) = S( I , J )
34 1 0 NEXT J
34 1 2 NEXT I
34 1 4 RETURN
, **** TRUNCATE SPECT RUM ****
3500 ATTN = 0
3502 I NPUT "TRUNCATE SPECTRUM ABOVE HARMON I C # "; HARX
3504 FOR I = 0 TO Q2
3506 FOR J = 0 TO Q2
3508 I F SQR ( I A 2 + J A 2) < HARX THEN 35 1 8
35 1 0 GOSUB 3900
35 1 8 NEXT J
3520 NEXT I
3522 GOSUB 6000 ' D I SPLAY RESULTS
3524 I NPUT AS ' WA I T
3526 RETURN
3900 ' **** MOD I F Y HARMON I CS ****
3902 1 2 = Q2 + I : J 2 = Q2 + J : 13 = Q2 - I : J3 =Q2 - J
3904 C ( 1 2 , J 2 ) = C( 1 2 , J 2 ) * ATTN : S ( 1 2 , J 2 ) = S(12, J2) * ATTN
3906 C ( 1 2 , J3) = C( 1 2 , J3) * ATTN : S ( 1 2 , J3) = S(12, J3) * ATTN
3908 C ( 1 3 , J3) = C( 1 3 , J3) * ATTN : S ( 1 3 , J3) = S(13, J3) * ATTN
39 1 0 C ( 1 3 , J 2 ) = C ( 1 3 , J 2 ) * ATTN : S ( 1 3 , J 2 ) = S(13, J2) * ATTN
39 1 2 RETURN
I *********************************
, * LOAD . BMP F I L E *
I *********************************
4000 CLS : PR I NT : P R I NT : P R I NT
4002 DMAX = 20 : XD I R = 0 : PATHS = "A : \"
4004 RED I M I MAGE%(DMAX) , * . BMP HEADER ARRAY
4006 I NPUT " F I LE NAME ( . BMP F I L E S ON L Y ) " ; NMS
4008 OPEN PATHS + NMS + " . BMP" FOR RANDOM AS #3 L E N = LE N ( P I XR E C )
4010 PR I NT " LOF = " ; LOF ( 3 )
4012 FOR J = 1 T O 2 0 ' READ HEADER
4014 GET #3, J , P I XREC
4016 I MAG% = P I XREC . P I X
4018 I MAGE%( J ) = I MAG%
4024 NEXT J
4026 I F I MAGE%( 1 ) = 1 9778 AND I MAGE%( 1 0 ) = Q THEN 404 0 ' CHK. BMP& S I ZE
Image Enhancement 269

4030 I NPUT " T H I S IS NOT A LEGAL . BMP F I LE - ENTER TO CONT I NUE " ; AS
4032 CLOSE 3: GOTO 4090 ' CLOSE F I LE & E X I T
4040 STRT = I MAGE%( 6) I 2 + 1 ' GET OATA START LOCAT I ON
4044 L I NX = I MAGE%( 1 0 ) , NO. L I NES
4046 COLX = I MAGE%( 1 2 ) , NO. COL S .
, LOAO F I LE I NTO OATA ARRAY
4048 FOR I = 0 TO Q - 1 : K L 1 = STRT + ( L I NX* 1 / 2 ) ' DATA L I NE ADDRESS
4050 FOR J = 0 TO Q3 STEP 1 : KL = KL1 + J : J 2 = 2 * J ' DATA ADDRESS
4052 GET #3 , KL , P I XREC
4054 I MAG% = P I XREC . P I X
4056 C( I , J 2 ) = I MAG% AND 255 : C ( I , J 2 + 1 ) = ( I MAG% AND 65280 ) I 256
4058 S( I , J 2 ) = 0: S ( I , J 2 + 1 ) = 0
4060 NEXT J
4062 NEXT I
4064 CLOSE 3
4066 MAG2 = - . 025 ' SCALE FACTOR
4068 GOSUB 6000 ' D I SPLAY I MAGE
4074 I NPUT "C/R WHEN READY"; AS ' WA I T FOR USER
4090 RETURN
, *********************************
, * SAVE * . BMP F I LE *
, *************** ******************
4 1 00 CLS : PR I NT : PR I NT
4 1 02 I F XD I R = 1 THEN GOSUB 50 ' TRANSFORM TO SPACE DOMA I N DATA
4 1 04 A = 1 : B = 0 ' F I RST BR I NG DATA BACK I N TO RANGE , A=MAX , B=M I N
4 1 06 FOR I = 0 T O Q - 1
4 1 08 FOR J = 0 TO Q . 1
41 1 0 I F C ( I , J ) > A THEN A = C ( I , J )
4112 I F C ( I , J ) < B THEN B = C ( I , J )
4114 NEXT J
4 1 1 6 NEXT I
4 1 1 8 I F B > 0 THEN B = 0 ' I F > 0 E L I M I NATE FROM CALCULAT I ON S
4 1 20 A = (A - B ) I 2 5 5 ' F I ND 0 - 255 SCALE FACTOR
4 1 22 FOR I = 0 TO Q - 1 ' CONVE RT TO 8 B I T DATA
4 1 24 FOR J = 0 TO Q - 1
4 1 26 C ( I , J ) = I NT « C ( I , J ) - B ) I A )
4 1 28 NEXT J
4 1 30 NEXT I
4 1 32 FOR I = 0 TO 1 : C ( Q , I ) = 0 : C ( I , Q ) = 0 : NEXT I
4 1 34 PTH 1 S = " C : \W I NDOWS\D " : PTH2S = "C : \W I NDOWS\" : NM2S = NMS
4 1 36 I F L E N ( NM2S) > 7 THEN NM2S = LE FTS(NM2S, 7)
4 1 38 OPEN P T H 1 S + NM2S + " . BMP" FOR RANDOM AS #3 LEN = LE N ( P I XR E C )
4 1 4 0 OPEN PTH2S + NMS + " . BMP" FOR RANDOM A S #4 L E N = LE N ( P I XR E C )
4 1 4 2 FOR I = 1 T O STRT - 1
4 1 44 GET #4, I , P I XREC
4 1 46 PUT #3 , I , P I XREC
4 1 48 NEXT I
4 1 50 CLOSE #4
4 1 52 PR I NT "EXPAND F I LE ( YIN ) " ;
4 1 54 AS = I NKEYS: I F A S = " " THEN 4 1 54
4 1 56 I F AS = " n " OR AS = "N" THEN 4300
4 1 58 P I XREC . P I X = I NT ( 2 * Q )
4 1 60 PUT #3 , 1 0 , P I XREC
4 1 62 PUT #3 , 1 2 , P I XREC
4 1 64 FOR I = 0 TO Q - 1 : KS1 = (2 * I * Q ) + STRT
270 Appendix 1 6.1

4 1 66 FOR J = 0 TO Q - 1 : K S = K S 1 + ( J )
4 1 68 P I XE L 1 = C ( I , J ) : P I XE L 2 = ( C ( I , J + 1 ) + C ( I , J » 1 2
4 1 70 P I XE L = I N T ( P I XE L 1 ) + 256 * I NT ( P I X E L 2 )
4 1 72 I F P I XE L > 32767 THEN P I XE L = P I XE L - 65536
4 1 74 P I XRE C . P I X = I N T ( P I XE L )
4 1 76 PUT #3 , K S , P I XREC
4 1 78 NEXT J
4 1 80 KS1 = KS1 + Q
4 1 82 FOR J = 0 TO Q - 1 : KS = KS1 + J
4 1 84 P I X E L 1 = ( C ( I , J ) + C ( I + 1 , J » /2
4 1 85 P I XE L 2 = ( C ( I , J ) + C ( I + 1 , J ) + C ( I , J + 1 ) + C ( I + 1 , J + 1 » /4
4 1 86 P I XE L = I N T ( P I XE L 1 ) + 256 * I NT ( P I X E L 2 )
4 1 88 I F P I XEL > 32767 THEN P I XEL = P I XEL - 65536
4 1 90 P I XREC . P I X = I NT ( P I XE L )
4 1 92 PUT #3 , K S , P I XREC
4 1 94 NEXT J
4 1 96 NEXT I
4 1 98 CLOSE #3
4200 RETURN
4300 ' STORE UN EXPANDED P I CTURE
4302 FOR I = 0 TO Q - 1 : KS1 = ( I *Q/2) + STRT
4304 FOR J = 0 TO Q - 1 STEP 2: KS = KS1 + ( J /2)
4306 P I X E L 1 = C ( I , J ) : P I XE L 2 = C ( I , J + 1 )
4308 P I XEL = I NT ( P I XE L 1 ) + 256* I NT ( P I X E L 2 )
43 1 0 I F P I XEL > 32767 THEN P I XEL = P I XE L - 65536
43 1 2 P I XREC . P I X = I NT ( P I XE L )
4314 PUT #3 , K S , P I XREC
4316 NEXT J
4318 NEXT I
4320 CLOSE #3
4322 RETURN
I *********************************
, * GENERATE FUNCT I ONS *
I *********************************
5000 XD I R = 0
5001 CLS : P R I NT : PR I NT : P R I NT " FUNCT I ON MENU" : PR I NT
5002 PR I NT " 1 = BESSEL FUNCT I ON 2 = GAUSSA I N " : PR I NT
5009 P R I NT " 9 = EX I T : " : PR I NT
5010 PR I NT " MAKE SELECT I ON " ;
5012 A S = I NKEYS: I F AS = " " T H E N 5 0 1 2
5014 A = VAL ( AS ) : O N A GOTO 5600, 5700
5016 I F A = 9 THEN RETURN
5018 GOTO 5000
, *** BESSE L FUNCT I ON ***
5600 CLS : DE FDBL D - K
5604 I NPUT " W I D T H " ; WO T H 1
5606 I F WO T H 1 < 1 T H E N 5604 ' M I N I MUM W I D T H
5608 S K L 1 = P I / ( 3 . 6*WO T H 1 * Q/64 )
561 0 FOR I = 0 TO Q - 1
561 2 YARG = SKL 1 * ( 1 - Q2 ) : PR I N T " * " ;
5614 FOR J = 0 TO Q - 1
5616 XARG = SKL 1 * ( J - Q2)
5618 KARG = SQR (XARGA2 + YARGA2)
5620 KA = 1 : KB = 1 : DAT1 = 1 : KTGL =
5622 FOR K = 2 TO 900 STEP 2
Image Enhancement 271

5624 KTGL = - 1 * KTGL


5626 KA = KA * K: KB = KB * ( K + 2 ) : OENOM = KA * KB
5628 OAT2 = KTGL * ( � T H 1 A (K / 2 ) * KARG A K / OENOM)
5630 I F ABS(OAT2) < ABS(OAT 1 ) * 1 E - 1 0 THEN 5640
5632 OAT1 = OAT1 + OAT2
5636 NEXT K
5638 PR I NT "#"
5640 C ( I , J ) = OAT 1 : S ( I , J ) = 0
5642 NEXT J
5644 NEXT I
5646 GOSUB 1 76
5648 I NPUT AS
5650 RETURN
, *** ***
GAUSS I AN FUNCT I ON
5700 CLS : MAG1 = Q / P I
5702 FOR I = 0 T O Q - 1 : FOR J = 0 T O Q - 1
5704 C ( I , J ) = 0 : S ( I , J ) = 0
5706 NEXT J : NEXT I
5708 I NPUT "D I AMETE R , CONSTAN T " ; D I A1 , GCST
571 0 MAG1 = (Q / D I A1 ) A 2 / P I
571 2 FOR I = 0 T O Q 2 - 1 : 1 2 = I ' - Q2
5714 FOR J = 0 TO Q2 - 1 : J 2 = J ' - Q2
5716 RO = SQR ( 1 2A2 + J2A2 ) : MAG1 1 = MAG1 * EXP ( - ( R O / D I A 1 ) A 2 )
5 7 1 8 C ( Q2 + I , Q 2 + J ) = MAG1 1 : C(Q2 + I , Q2 - J ) = MAG1 1
5720 C ( Q2 - I , Q2 + J ) = MAG1 1 : C(Q2 - I , Q2 - J ) = MAG1 1
5722 NEXT J
5724 NEXT I
5726 C ( Q 2 , Q2) = C ( Q 2 , Q2) + MAG1 * GCST
5728 XD I R = 1
5730 GOSUB 1 76
5732 I NPUT AS
5734 RETURN
6000 ' *******************************
, * PLOT DATA *
I *******************************

6002 CLS ' CLEAR SCREEN AND SET SCALE FACTORS


6004 XCAL = 320 / Q : YCAL = 1 20 / Q: YD I S = 1 50
6006 FOR I = 0 TO Q1 ' FOR ALL ROWS
6008 D I SP = (Q - I ) * 288 / Q ' D I SPLACE ROWS FOR 3/4 V I E W
60 1 0 P E R = I / ( 2 * Q ) , CORRECT FOR PERSPECT I VE
60 1 2 FOR J = 0 TO Q1 ' FOR EACH P I XEL I N ROW
60 1 4 X1 1 = ( ( XCAL + P E R ) * J ) + D I SP : Y 1 1 = ( ( YCAL + . 3* P E R ) * I ) + YO I S
601 6 I F XD I R= 0 THEN AMP= C ( I , J ) ELSE AMP= SQR ( C ( I , J ) A2 + S ( I , J ) A 2 )
601 8 AMP = MAG2 * AMP
6020 L I NE ( X 1 1 , Y 1 1 + AMP ) - ( X 1 1 , Y 1 1 )
6022 PRESET ( X 1 1 , Y 1 1 + AMP + 1 )
6024 NEXT J ' NEXT P I XEL
6026 NEXT I ' NEXT ROW
6028 RETURN ' ALL DONE
I **************

9999 END : STOP

We have included a 2-D Gaussian function (lines 5700-5734).


This is just another radially symmetrical function equal to EXP(xI\2), and
272 Appendix 16.1

is similar to function routines of Appendix 14. 1 .


Okay, first o f all, we will work with the *.BMP fi l e format. As
a non-professional you will find all of the file formats are a real pain.
Pictures take incredible amounts of storage (easily exceeding several
mega-bytes); consequently, most file formats use a compression scheme
(and we don't want to get into that!). The *.BMP format usually stores
data as a straightforward matrix of the pixels, so we only need to know
enough about the file header to get data in and out of our array (after that
you're on your own). There are actually two headers-the *.BMP header
is 14 bytes and starts with ASCII "BM" ( 1 9778 in decimal). The next
double word (i.e., 4 bytes) are the file length. The last double word is the
image data offset which tells how far into the file the actual picture starts.
Next comes the information header, with a double word for header size
(40 bytes for our purposes). The next double word is image width (in
pixels), followed by another double word specifying image height, and
that's all we need to know about that. Let's look at loading a *.BMP file.
In lines 22-28 we use the TYPElPixel statement to define PIX as
an integer (i.e., a double byte), then dimension PIXREC as Pixel. The
reason for this obscure little ritual becomes apparent in the routine to load
the file, which starts at line 4000. At 4002 we set DMAX equal to 20
(which is the number of words from the header we intend to read) and
initialize things. In 4004 we redimension IMAGE%(DMAX) which we
will use to save the header info (you recall the % sign defines the array as
integer words). We get the file name and open file #3 in the Random
Access mode. The statement LOF(3) returns the length of the file. We
read the file header (lines 401 2-24) and then check the first word to see
if this is a *.BMP file, and also check (line 4026) to see if the tenth word
is equal to the size of the array we have defined (i.e., the number of pixels
along the side equals Q). If either of these conditions are not met we
close the file and exit (lines 4030-32). We next get the image offset (line
4040) and generate the starting address of the image data within thefile.
At 4048 we start loading the image into our data array. Note Since, in
the Random Access file mode, we must provide the address from which
data is to be loaded, we define KLl as STRT + LINX*J/2 When we start
reading the data (in the nested loop at line 4050) we obtain the address
of each stored data word by adding KLf to the loop counter J. We use
the GET #3 statement to read the data from the disk (KL providing the
address of the word we want to get, and PIXREC providing the place to
put it. We then transfer the integer data to IMAG% and, in line 4056 we
split out the two bytes and place them sequentially into our data array
C(I,12) and C(I, 12+ 1 ). At line 4068 we display this data (after setting a
Image Enhancement 273

scale factor for MAG2).


Okay, to save a file, we essentially follow the same procedure,
except we convert the real number data of the array to integer words
packed with two 8 bit bytes of image. First we scan through the data to
find the maximum and minimum data words ( l ines 4 1 06- 1 8 ) . We
calculate a scale factor and scan through the data once again scaling the
data to a 0 - 255 gray scale (lines 4 1 22-30). We generate a name for the
new file by simply adding a "D" in front of the old file name (you might
want to use something more imaginative).
Now, there is a lot of "junk" in the file header that we haven't
talked about, and for our immediate purposes, we really don't care about
it; but, we must still include this junk in the header if we hope to read this
file by conventional graphics software. We resort to a "quick and dirty"
solution to this requirement by simply opening the original file and
transferring the header to the new file (lines 4 1 42-50). . . . I sincerely hope
that none of you ever degrade yourselves by employing such a shabby
technique. We then pack the image data (two 8-bit bytes into each 1 6-bit
word), and save these to the disk (lines 4300-4322).

The majority of routines for this program deal with modifying the
frequency domain functions (a menu is located at lines 3000-3028). Lines
3 1 00-3 1 20 provide a routine to filter the frequency domain function using
a Gaussian response lowpass filter. The argument is found as the RSS of
the harmonic coordinates (line 3 106) and the attenuation is the same as the
Gaussian filter used in the Gibbs phenomenon illustration of Chapter 6.
A routine to multiply the p o i nts o f two spectrums ( i . e . ,
convolution) i s located at lines 3200-3230. Since the data i s used twice
in complex multiplication it's necessary to pull it out of the array and into
temporary variables (lines 3206-08) before forming the products (line
3210). A second spectrum must already be stored in arrays DAC(I,J) and
DAS(I,J) and we get it there via the Save Spectrum subroutine which is
located at lines 3400-34 14 (under control of the Modify Spectrum menu).
Division of two spectrums (deconvolution) is performed in lines
3300-3390. This routine is written as a straightforward complex division
routine, except that you may divide either the stored spectrum by the
current frequency domain function or vice-versa. You must specify the
direction in lines 3302-08 and a flag is set (CSFLG-line 32 10) according
to the selection. At line 3 3 1 4 we start the actual division. Again, we pull
the data from the arrays (line 33 1 8) and then clear the array data. In line
3320 we find the magnitude, and in lines 3322-3328 we find the angle.
In lines 3330-333 8 we do the same thing for the stored data and in lines
274 Appendix 16.1

3 3 40 or 3 3 4 2 we perform the division. We then convert back to


rectangular coordinates (lines 3344 and 3346), putting the data back into
the frequency domain array.
The routine at lines 3 500-3526 truncates (i.e., zeros out) the
spectrum above some selected harmonic number, using the sub-routine at
lines 3900-3912 to modify the spectrum symmetrically about the QI2, Q/2
point of the array. This is the routine we use to "cut hair" when digital
noise comes up.
Finally, there 's a routine located at lines 2420-2456 which will
change the number of bits in the gray scale. First we find the maximum
and minimum data words (lines 2422-2434), and then, based on the
number of binary bits desired, re-scale and form the data into integer
words (lines 2440-2452). This routine applies to the image domain, of
course, and is used to experiment with the number of bits desirable for
various enhancement procedures.
We have tried to show how easy these routines are to create, so
we have left out the techniques used in more polished software (e.g.,
taking care of incorrect entries, backing out of routines when you change
your m ind, etc . ) . You can add this sort of embelli shment to these
programs but, in my opinion, BASIC is not a good language to write real
software. It is, howevet; an excellent teaching tool, and a very good tool
for experimentation.
APPENDIX 16.2

IMPROVING THE SIGNALINOISE


& DATA RESOLUTION

This is how the story goes: A friend of mine worked on an


Extra-terrestrial Intelligence project. Basically they have a very big
antenna and a low noise receiver, and they search the sky for anything that
looks like an intelligent signal. So much data is gathered it simply must
be handled by a computet The computer examines the incoming signal
(i.e., noise) for anything that is statistically different from pure noise.
Now, not wanting to miss anything just because their threshold is a couple
of percent too high, they log an awful lot of noise in their archives.
So, if the computer detects something statistically different it
starts processing the signal. It runs various algorithms and if it detects
anything coherent it immediately pipes it to the control console; however,
more than 99% of the stuff is quietly logged into the archives.
But the computer doesn't j ust tape record a lot of noise-it
constantly runs tests on the data. If, for example, it detects anything
remotely suggesting periodicity, it starts logging the data in frames (i.e.,
the data is logged in serial strings whose length matches the detected
period). As I said, less than 1 % of this stuff gets looked at; the rest is
compressed and stored for "future study" (fat chance).
Any way, I mentioned to my friend that I needed a good
illustration for extracting a signal from noise and, shortly thereaftet; I
received a compressed file over the net with nothing more than a note
saying it was logged in the direction of Andromeda. The program below
de-compresses the file and displays it on the computer screen. I must
warn you that, in the rush to get the manuscript ready for the printer, I
never had time to actually examine this data. . . it's probably just garbage . . .
but who knows, maybe you'll find the first extra-terrestrial signal. . . .

I ********************************************************
I * PROGRAM TO I LLUSTRATE THE E F FECT OF NOI SE AVERAG I NG *
I * I T R E T R I EVES A S I GNAL BUR I ED ( 20DB DOWN ) I N NO I SE *
, ********************************************************
SCREEN 9, 1 : COLOR 1 5 , 1 : CLS : PI = 3 . 1 4 1 592653589793#
P I 2 = 2 * P I : K1 = P I 2 I 200 : XO = 1 00 : YM = 1 70
D I M 0 1 ( 4 , 1 9 ) , 0 2 ( 2 , 400 ) , XD%( 400)
FOR I = 1 TO 18
FOR J = 1 TO 4
READ A
D1(J, I ) = A
NEXT J
NEXT I
I N PUT " I NPUT AID DYNAM I C RANGE AS 2"N . N = " ; N
276 Appendix 16.2

OY = 1 00 / (2 A N )
FOR M = 1 TO 60000
12 = 0
FOR J = 1 TO 1 8
FOR I = 1 2 T O 0 1 ( 1 , J )
XO%( I ) = I NT ( I - 0 1 ( 2 , J »
02 ( 1 , I ) = 02 ( 1 , I ) + OY * I NT « 0 1 ( 3 , J) + 141 * ( RNO ( 1 ) - . 5 » / O Y )
0 2 ( 2 , I ) = 0 2 ( 2 , I ) + OY * I NT « 0 1 ( 4 , J ) + 1 4 1 * ( RNO ( 1 ) - . 5 » / O Y )
NEXT I
12 = 01 ( 1 , J ) + 1
NEXT J
CLS
FOR I = 1 TO 400
L I NE ( XO + XO%( I ) , YM + 02 ( 1 , I ) / M ) - (XO + XO%( I ) , YM + 0 2 ( 2 , I ) / M)
NEXT I
LOCATE 1 , 5 0 : P R I N T M
I F M > 1 000 THEN 1 200
FOR L = M TO 1 000
FOR KT I ME = 1 TO 1 00 : NEXT KT I ME
NEXT L
1 200 NEXT M
1 333 AS = I NKEYS: I F AS <> "G" THEN 1 333
STOP
DATA 1 00 , 0 , 0 , 0 , 1 03 , 0 , - 6 , 6, 1 1 4 , 0 , - 1 , 1 , 1 1 8 , 0 , - 6 , 6, 1 48 , 0 , 0 , 0
DATA 1 5 2 , 0 , - 6 , 6 , 1 62 , 0 , - 6 , - 5 , 1 72 , 1 0 , - 1 , 1 , 1 82 , 20 , 4 , 6, 2 1 3 , 30
DATA 0 , 0 , 2 1 6 , 30 , - 6 , 6 , 227, 30 , 4 , 6 , 267, 40 , 0 , 0 , 271 , 40 , - 6 , 6, 277
DATA 4 0 , - 6 , - 5 , 283, 46 , - 1 , 1 , 287, 46, - 6, 1 , 40 0 , 46, 0 , 0

What we're really doing here is adding a small amplitude signal


to a large amplitude noise (i.e., random numbers). As we add in more and
more frames, the signal increases linearly while the noise increases in a
random walk. Slowly the signal grows l arger than the noise. It's
interesting to note that this works even when we only have a two-bit AID
converter! The noise causes the bits to trip more frequently with a high
amplitude signal and less frequently with a low amplitude signal. The
time average then gives the correct amplitude signal when many frames
of data are averaged. Try this-you can actually see things improving.
The point is: this works! So long as the noise is above the least
significant bits, you can dig out a signal that's literally buried. Amateurs
tend to throw away the noisy bits-thereby excommunicating themselves
from the wondrous things that lie j ust outside the immediate view.
BIBLIOGRAPHY

To my way of thinking, it makes no sense at all to fill up pages


with long lists of references that are obviously not appropriate for the
intended audience. As noted in my previous book on the FFT, the
following references require a knowledge of the calculus. If you want to
pursue this field, but are unsure about your ability to handle calculus, I
recommend Silvanus P. Thompson 's Calculus Made Easy. Wi dely
available in book stores, this 1 9 1 0 publication can be read in a week (two
at most). If you can read and understand this little book you can probably
survive even the worst college presentation. With these comments in
mind, I recommend the following:

Bracewell, R.N., The Fourier Transform and Its Applications, McGraw­


Hill. This is my standard basic recommendation. Dr. Bracewell is well
known for his various accomplishments, but we know him best for
pushing this stuff a little farther across the table (so those of us with
shorter arms might have a better chance of reaching it).

Brigham, E.O., The Fast Fourier Transform And Its Applications, Prentice
Hall. This is another good reference for the FFT. Its strongly graphical
presentation (especially of the 2-D FFT) is helpful.

Gaskill, J.D., Linear Systems, Fourier Transforms, and Optics, John Wiley
& Sons. If you are interested in pursuing Fourier Optics this is pretty
much the standard text. The tutorial orientation is especially helpful and
the review of fundamentals is valuable if you have been away from this
material for some time.

Hubbard, B.B., The World According to Wavelets, A K Peters, Wellesley,


MA. This is a very readable introduction to wavelets; although, much of
it is oriented toward the mathematically savvy.

Walker, J.S., Fast Fourier Transforms, CRC Press. This book has a lot
of good material, but (for those who can handle the math) I especially
recommend the introduction to Fourier Optics (Chapter 6).
INDEX

AID conversion . . . . . . . . . . . . . . . . . . . . 1 1 1 , 1 40
. . . . . . . . . . . . . . . . .

Addition theorem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128, 1 29


Aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65, 1 1 0
Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26, 27
. . . . . . . . . . . . . . . . . .

Argand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 9, 1 0
Argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3, 5, 8, 22 1 -224
Array . . . . . . . . . . . . . . . . . 70, 7 1 , 73, 93-97, 1 5 8, 1 59, 209, 2 1 9, 226, 233
Average . . . . . . . . . . 25-29, 75, 1 37, 1 3 8, 1 59, 1 60, 1 66, 1 67, 1 85, 1 99
. . . .

Band-limited . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 47, 1 1 7
BASIC . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . 64, 1 04,
1 55, 1 62, 1 63, 205
Basis function . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . 36, 1 04, 1 82
Bessel function . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
1 7 1 , 1 73, 260-262
Binary . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .1 37- 1 39, 1 93
. . . . . . .

Bit reversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52, 77, 1 62


Butterfly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 62

Calculus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7, 200, 20 1 , 277


Camera . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5 8, 1 87, 1 9 1 , 193
. . . . . . . . . .

Capacitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4, 35, 41, 59


Circuit analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1 , 34, 37, 64, 66
Coefficient . . . . . . . . . . . . . . . . . . . . . . . . . 8, 1 8, 43-45, 87, 128, 1 29, 1 60
Complex addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9, 22
Complex conjugate . . . . . . . . . . . . . . . . 10, 22, 23, 25, 26, 68, 70, 22 1 -223
Complex exponential . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1 , 24-29
Complex mUltiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1 -24, 64, 273
Complex numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 1 0, 259
Convolution 21, . . . . . . 24, 3 1 , 58, 63, 1 0 1 , 1 1 1 , 1 33 - 1 35, 1 85 - 1 96, 205, 273

Deconvolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 85- 1 96, 273


.

DFT . . . . . . . . . . . . . . . . 1 , 2, 26, 50, 68, 72-77, 83, 92, 1 04, 1 1 3, 1 1 7- 1 1 8,


1 26, 1 2 8- 1 3 1 , 1 57, 1 58, 20 1 , 203, 206, 209, 252
Differentiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5, 1 6, 1 96, 20 1 -204
Digitization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 0, 1 1 1 , 1 3 8, 1 40, 142
Discrete Fourier transform . . . . . . . . . I
. . . . . . . . . . . . . . . . . . . . . . . . . .

Eigenfunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5 - 1 7
Execution time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64, 1 63
Exponential . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6, 7, 10, 1 7, 2 1 9
.

Fast Fourier transform . . . . . . . . . . . . . . . . . . . . . . . . . . 70, 1 03, 2 1 1 , 277


FFT . . . . . . . . . . . . . 1 , 2, 50-56, 66-82, 9 1 -97, 1 04, 1 1 6, 1 5 8- 1 65, 1 79- 1 84,
209-2 1 0, 2 1 1 -2 1 2, 2 1 5, 220, 223, 225, 227, 229, 277
Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 5 8-64, 1 1 9, 123, 1 8 5
FFTAPPSlIndx 279

Frequency domain . . . . 24, 3 1 , 3 5 , 58, 60, 65, 66, 97, 1 14- 1 1 6, 1 24, 1 26- 1 28,
1 29, 1 3 1 , 1 45- 1 47, 1 60, 1 63, 1 70, 1 73, 1 8 1 , 1 85 - 1 89, 1 92, 1 96, 2 0 1 -204
Frequency response . . . . . . . . . . . . . . . . . . . . . . . . 5 8 , 63, 64, 66, 1 2 1 - 123
Frequency shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 45- 1 47, 152
Functions . . . . . . . . . . . . . 1 , 1 2 , 16, 22-23, 28-30, 36, 9 1 , 97-98, 1 26- 1 3 1
.

1 59, 1 70- 1 73, 1 82, 20 1 , 25 8-262


Fundamental . . . . . . . . . . . . . . . 1 6, 29, 93, 95, 125, 1 27, 128, 1 56, 1 59, 202

Gaussian . . . . . . . . . . . . . . . . . . . . . . . . 60, 62-63, 1 03, 1 88- 1 94, 27 1 , 273


.

Gibbs Phenomenon . . . . . . . . . . . . . . 48-5 1 , 56-57, 64, 1 25- 1 26, 1 70, 1 73


.

Harmonic . . . . . . . . 47-50, 56-57, 6 1 , 63 , 95-97, 1 00- 1 02, 1 1 2- 1 1 6, 1 1 8, 1 22


142, 1 45-147, 1 54- 1 57, 1 66- 1 68, 1 79- 1 8 1 , 1 96, 20 1 , 203, 223

Imaginary number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 36
Impulse function . . . . . . 66, 1 1 2, 1 1 4, 1 26, 1 28 - 1 30, 1 72- 1 73 , 1 79, 1 8 1 , 1 86
Inductor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34-36, 4 1 , 60
Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 6, 26, 1 96, 20 1 -203, 204
Inverse DFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .. . 50, 83
.

Inverse FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83-90, 1 54

Laplace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Limit . . . . . . . . . . . . . . . . . . . . 28, 34, 47, 49, 1 09, 1 1 9, 123, 1 73 , 1 87, 1 93
Linear system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 6, 1 86, 20 1
Logarithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1 4, 220

Maclaurin series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
. .

Magnitude . . . . . . . . 6, 7, 2 1 , 23, 26, 98, 1 60, 1 68, 1 79, 1 80, 2 1 3 , 257, 273
Modulation . . . . . . . . . 1 9-23, 69, 99- 1 00, I l l , 1 1 6, 1 47, 1 49, 1 57, 1 8 1 , 1 82

Negative frequency . . . . . . . 56, 68-70, 82, 8 3 , 1 1 8, 1 1 9, 1 24, 1 46, 1 47, 1 60,


1 64, 1 67, 1 69, 205, 22 1 -224
Negative time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222, 223
Nyquist criterion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 0
Nyquist frequency . . . . . . . . . . 6 1 , 74, 77, 1 06, 1 07, 1 1 8- 1 20, 1 64, 22 1 , 224
Nyquist sampling rate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 05, 1 06, 224

Orthogonal functions . . . . . . . . . . . . . . . . . . . . 25-28, 30, 93, 10 I , 1 02, 1 04


Oversampling . . . . . . . . . . . . . . . 1 23 - 1 25, 1 3 1 - 1 33 , 1 45 , 1 73, 1 8 8, 225-227
Phase shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9, 36, 5 8 , 1 28, 1 47, 1 8 1
Phasor . . . . . . . . . . . . . . . 4, 9, 1 8, 19, 2 1 , 23, 26, 83, 86-88, 1 24, 1 60, 223
Polynomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60, 20 I

Real function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 8
Real part . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 , 46, 8 7
280 Appendix 16.2

Reconstruction . . . . . . . . . . . 93, 96, 1 1 4, 1 32, 1 3 3 , 1 49, 1 52, 1 60, 1 65, 173


Resolution . . . . . . . . . . . . 38, 47, 56, 97, 1 02, 1 04, 142, 1 84, 1 87, 1 92- 1 95

Sampled data 2, 97, 1 00, 1 07, 1 1 0, I l l , 1 1 7, 1 1 8, 1 20, 1 33, 1 34, 146, 224
. .

Sampling . . . . . . . .69-70, 93, 1 02, 1 05- 1 20, 140, 1 42, 148,


. . . . . . . . . . . .

1 64- 1 65, 22 1 , 223, 224, 233


Scaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 6, 28, 49, 1 1 5, 1 54
.

Shifting theorem . .. . . . .. . . . . 1 26, 145- 147, 1 52, 2 1 2


. . . . . . . . . . . . . .

Similarity theorem . . . .. . . . . . . .1 02, 1 45, 1 73


. . . . . . . . . . . . . . . . . . . .

Sine function .. . . 96- 1 03, 1 30- 1 34, 146, 149, 1 69, 1 70, 1 73, 1 84
. . . . . . . . .

Spectrum Analyzer . 9 1 -93, 95, 96, 1 0 1 , 1 32, 1 40, 1 42, 2 1 2


. . . . . . . . . . . .

Square wave . . . . 17, 47-50, 63-66, 99, 1 1 2, 1 39, 202-205, 223


. . . . . . . . . .

Stage . . . . . . . 67, 72, 75, 77-80, 83, 84, 88-9 1 , 9 1 , 1 62, 2 1 2, 229
. . . . . . . .

Step function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1 , 56, 63, 64, 205


.

Stretching theorem . . . . . . .68, 70, 1 1 4, 1 52, 208, 2 1 1


. . . . . . . . . . . . . . . .

Taylor series . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
. . . . . . . . . . . . . . . .

Time domain . . . . . . . . . . . . . . . . . . . 56-58, 83, 1 03, 1 1 5, 1 24- 1 3 1 ,


. . . . . .

1 5 1 - 1 54, 1 70, 1 8 1 , 1 85, 1 87, 1 96, 202, 223, 226


Time shifting . . . . . . . . . . . . . . . . . . . . . . . .
. . . 1 45, 147
. . . . . . . . . . .

Transfer function . . . . . . . . . . . . . . 37, 46, 58, 60, 64, 66, 1 86- 1 88, 190
. . .

Transient analysis . . . . . . . . . . . . . . . . . . . . . . . 3 1 , 64
. . . . . . . . . . . . . .

Truncation . . . . . . . . . . . . . . . . . . . . . . . 1 37, 1 3 8 , 1 9 1 , 1 95
. . . . . . . . . .

1Wo-dimensiona1 FF . . . . . . . . . . . . . . . . .1 58- 1 6 1 , 1 68, 1 70


. . . . . . . . . .

vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9, 2 1 , 26
.

Waveform . . . . . . 1 9, 20, 25, 1 00, 1 1 4, 1 1 5, 1 53, 1 54, 223, 226


. . . . . . . . . .

Weighting function 1 03, 1 32, 1 43, 1 49, 2 1 9, 220, 227, 228, 233
. . . . . . . . . .

You might also like