![]() |
![]() |
![]() |
![]() | The helical coordinate | ![]() |
![]() |
The most abstract method of spectral factorization is of the Russian mathematician A.N.Kolmogoroff. I include it here, because it is by far the fastest, so much so that giant problems become practical, such as the solar physics example coming up.
Given that
Fourier transforms to a causal function of time,
it is next proven that
Fourier transforms to a causal function of time.
Its filter inverse is
.
Grab yourself a cup of coffee
and hide yourself away in a quiet place
while you focus on the proof in the next paragraph.
A causal function
vanishes at negative
.
Its
transform
,
with
is really a Fourier sum.
Its square
convolves a causal with itself so it is causal.
Each power of
is causal, therefore,
, a sum of causals, is causal.
The time-domain coefficients for
could be computed
putting polynomials into power series or computed faster with Fourier transforms
(by understanding
as an FT.)
By the same reasoning,
the wavelet
has inverse
which is also causal.
A causal with a causal inverse is said to be ``minimum phase.''
The filter
with inverse
is minimum phase
because both are causal,
and they multiply to make the impulse ``1'',
so are mutually inverse.
The delay filter
has the noncausal inverse
which is not causal
(output before input).
The next paragraph defines ``Kolmogoroff spectral factorization.''
It arises in applications where one begins with an energy spectrum
and factors it into an
times its conjugate.
The inverse Fourier transform of that
is causal.
Relate amplitude
and phase
to a causal time function
.
![]() |
![]() |
![]() |
(7) |
Given a spectrum
, we find a filter with that spectrum.
Because
is a real even function of
, so is its logarithm.
Let the inverse Fourier transform of
be
,
where
is a real even function of time.
Imagine a real odd function of time
.
![]() |
![]() |
![]() |
(8) |
We easily manufacture an inverse filter by changing the polarity of the
.
This filter is also causal by the same reasoning.
Thus, these filters are causal with a causal inverse.
Such filters are commonly called ``minimum phase.''
Spectral factorization arises in a variety of contexts. Here is one: Rain drops showering on a tin roof create for you a signal with a spectrum you can compute, but what would be the sound of a single drop, the wavelet of a single drop? Spectral factorization gives the answer. Divide this wavelet out from the data to get a record of impulses, one for each rain drop (theoretically!). Similarly, the boiling surface of the sun is coming soon.
Everyone has their own favorite Fourier transform code, so why am I offering mine?
Because you MUST get the scale factors correct.
Few worries if you accidentally replace
by
,
because your humble plotting program might do that.
But, if you accidentally replace
by
,
you have squared it!
subroutine ftu( signi, nx, cx ) # Fourier transform # complex Fourier transform with traditional scaling (FGDP) # # 1 nx signi*2*pi*i*(j-1)*(k-1)/nx # cx(k) = -------- * sum cx(j) * e # scale j=1 for k=1,2,...,nx=2**integer # # scale=1 for forward transform signi=1, otherwise scale=1/nx integer nx, i, j, k, m, istep real signi, arg complex cx(nx), cmplx, cw, cdel, ct i=1; while( i<nx) i=2*i if( i != nx ) call erexit('ftu: nx not a power of 2') do i= 1, nx if( signi<0.) cx(i) = cx(i) / nx j = 1; k = 1 do i= 1, nx { if (i<=j) { ct = cx(j); cx(j) = cx(i); cx(i) = ct } m = nx/2 while (j>m && m>1) { j = j-m; m = m/2 } # "&&" means .AND. j = j+m } repeat { istep = 2*k; cw = 1.; arg = signi*3.14159265/k cdel = cmplx( cos(arg), sin(arg)) do m= 1, k { do i= m, nx, istep { ct=cw*cx(i+k); cx(i+k)=cx(i)-ct; cx(i)=cx(i)+ct } cw = cw * cdel } k = istep if(k>=nx) break } return; end
The ftu fast Fourier transform code has a restriction that the data length must be a power of 2. Zero time and frequency are the first point in the vector, then positive times, and then negative times.
It is an exercise for the student to show that a complex-valued time function has a positive spectrum that is nonsymmetrical in frequency, but it may be factored with the same code.
![]() |
![]() |
![]() |
![]() | The helical coordinate | ![]() |
![]() |