Adaptive Optimal-Kernel (AOK) Time-Frequency Representation


                          Version 4.0


        Douglas L. Jones
                Coordinated Science Lab
                University of Illinois
                1308 West Main Street
                Urbana, IL 61801

                Tel:    (217) 244-6823
                Fax:    (217) 244-1642
                Email:  jones@uicsl.csl.uiuc.edu

        Richard G. Baraniuk
                Department of Electrical and
                   Computer Engineering
                Rice University
                P.O. Box 1892
                Houston, TX 77251-1892 USA

                Tel:    (713) 527-4020
                Fax:    (713) 524-5237
                Email:  richb@rice.edu
                URL:    http://www.dsp.rice.edu/



This document briefly describes how to compile and run version 4.0 of
the program ``aok'', which implements the adaptive optimal-kernel
(AOK) time-frequency representation algorithm described in the paper:

   ``An Adaptive Optimal-Kernel Time-Frequency Representation,''
   by D. L. Jones and R. G. Baraniuk, IEEE Transactions on Signal
   Processing, Vol. 43, No. 10, pp. 2361--2371, October 1995.

The program is written in the C language (for speed) and produces an
ASCII output that is readily read into Matlab for display.  For more
details on the specifics of the algorithm, please refer to this paper
--- preprints are available from either author or from the Rice DSP
WWW homepage at http://www-dsp.rice.edu.



1. COMPILING AOKn.C
   ----------------

aok4.c is written in the C language, and should compile immediately on
most platforms.  Compile using:

        cc aok4.c -lm -O4 -o aok

This will create the executable file ``aok''.



2. USING AOK
   ---------

aok is very simple to use.  When prompted, simply enter the following
data:

Name of input file?

        - the name of the file containing the signal that you wish to
          analyze.
        - the data should be in ASCII format, in two columns, as COMPLEX
          numbers (that is, with both real and imaginary parts) with the
          real part in the leftmost column and the imaginary part in the
          rightmost column, and with each new sample on a new line, like
          so:

                1.234   0.123           - first sample real and imag part
                4.1234  5.1235          - second sample real and imag part
                0.0     10e-5           - third sample real and imag part
                ...

        - if REAL data is to be analyzed, care must be taken to place
          zeros in the imaginary column, like so:

                1.234   0.00
                4.1234  0.00
                0.0     0.00

          Otherwise, erroneous output will result.  (!)
        - there is *no* need to "double oversample" the signal as with
          many other TFR programs, because special anti-aliasing protection
          has been provided.

Name of output file?

        - the name of the output file that will contain the adaptive
          optimal-kernel time-frequency distribution (AOK TFR).
        - the TFR is saved in ASCII format that is readable by Matlab.
          To load a TFR saved in file foo.dat with Matlab version 3,
          simply use the command

                load foo.dat

          With matlab version 4, use the command

                load foo.dat -ascii

          Each line in the ascii file corresponds to a row of the TFR
          matrix, which in turn corresponds to one time slice of the
          transform.  Note that the name of the TFR is ``foo'' after
          read-in.
        - when read into Matlab, the TFR is arranged as follows:  the
          row index is time, with increasing row index corresponding to
          increasing time, and the column index is frequency (between
          -pi and +pi rad/sec), with increasing column index corresponding
          to increasing frequency.
        - note that there are more time rows in the TFR than samples in
          the signal, to allow for any spreading that may occur from
          selecting very long kernels in the time direction.
        - while we have chosen to use an ASCII output for greater
          compatibility across various computing platforms, this choice
          also results in the data output portion of the program dominating
          the total running time of aok.  Note, however, that the save
          portion of aok4.c can easily be customized for other (faster!)
          types of output formats.   (In fact, a C-Mex version for direct
          interface with Matlab is planned.)

Number of signal samples in input file?

        - the number of signal samples in the data file.

Length of sliding analysis window?  (power of two)
  (Number of samples along each dimension of the STAF)

        - this value also corresponds to the length of the portion of the
          signal that is windowed and viewed to compute each update of the
          optimal kernel and slice of the adaptive optimal-kernel TFR.
        - this number is equivalent to the number of samples along one
          dimension of the short-time ambiguity function (STAF) that is
          utilized to update the optimal kernel and compute a slice of the
          adaptive optimal-kernel TFR.
        - in general, the window length should be chosen as the minimum of a
          number slightly larger (in samples) than the number of samples in
          the longest-duration signal component which it is desired to
          resolve, or the effective number of the maximum desired number of
          independently resolvable frequency bins.
        - the maximum allowable value is currently hardlimited to 256.
          If your machine has plenty of memory, this value can easily be
          increased by changing the array size definitions in the program.

Number of output frequency samples per time-slice?  (power of two)

        - number of samples in the frequency direction that are computed
          for the optimal-kernel TFR at each time instant.
        - the frequency output ranges from -0.5 to 0.5 cycles per sample
          (the full range available to a discrete-time signal).

Time increment in samples between time-slice outputs?

        - for very long signals, the optimal-kernel TFR can be decimated.
        - input value is the decimation factor.
        - for short signals, use the value 1.

Normalized volume of optimal kernel?
  (Typically between 1 and 5)

        - this parameter controls the amount of smoothing in the optimal-
          kernel TFR, and hence, controls the cross-component suppression
          versus auto-component smearing tradeoff.
        - a value of 1 corresponds to the same amount of smoothing as a
          spectrogram (in many cases excessive).
        - a value of above 5 or 10 gives essentially the pseudo Wigner
          distribution of the signal.
        - typically we balance between these two extremes by selecting
          a kernel volume of between 2 and 4 (2.5 or 3 are both good
          defaults).
        - if the results of the optimal-kernel TFR are not satisfactory,
          try again with a different volume:

                Too many cross-components  =>  decrease the volume
                Excessive smoothing        =>  increase the volume.



3. TEST SIGNALS
   ------------

Two test signals are included with this distribution of the aok
software.  The first, contained in the file ``chirp.sig'' is a simple
chirp signal, whose instantaneous frequency rises with time. After
starting aok, enter the following data to produce an adaptive TFR with
64 frequency bins:

Name of input file?
chirp.sig
Name of output file?
chirp_aok.dat
Number of signal samples in input file?
64
Length of sliding analysis window?  (power of two)
  (Number of samples along each dimension of the STAF)
64
Number of output frequency samples per time-slice?  (power of two)
64
Time increment in samples between time-slice outputs?
1
Normalized volume of optimal kernel?
  (Typically between 1 and 5)
3

Now, in Matlab version 4, enter the following to get a display of the adaptive
TFR of this chirp signal (``>>'' represents the Matlab prompt):

>> load chirp_aok.dat -ascii

*** Loads the matrix ``chirp_aok''

>> whos
              Name        Size       Elements     Bytes    Density   Complex

          chirp_aok    130 by 64        8320     66560       Full      No

Grand total is 8320 elements using 66560 bytes

*** To display the AOK TFR with the time axis horizontal and the
    frequency axis vertical, enter (in Matlab 4):

>> contour(abs(flipud(chirp_aok')))

*** Note also that the adaptive TFR is pre- and post-zeropadded by
    approximately Nstaf/2 samples, where Nstaf is the amount entered
    when prompted ``No. of samples in STAF?''.



The second signal is the test signal utilized in the paper mentioned
in the Introduction.  The signal in file ``papertest.sig'' contains
two closely-spaced impulses, two simultaneous sinusoids, a Gaussian
pulse, two parallel chirps, and a final impulse (in 223 time points).
Running aok as follows should result in a high resolution
time-frequency image:

Name of input file?
papertest.sig
Name of output file?
papertest_aok.dat
Number of signal samples in input file?
223
Length of the sliding analysis window?  (power of two)
  (Number of samples along each dimension of the STAF)
64
Number of output frequency samples per time-slice?  (power of two)
64
Time increment in samples between time-slice outputs?
1
Normalized volume of optimal kernel?
  (Typically between 1 and 5)
1.5



4. CHANGES FROM RUNRGK3.c
   ----------------------

aok4.c is simply a renamed version of the program runrgk4.c.  The main
change from runrgk3 to runrgk4 was an improvement in the iterative
algorithm that solves for the optimal spread vector of the optimal
radially Gaussian kernel.



5. COMMENTS / QUESTIONS ?
   ----------------------

If you have any comments, suggestions, or questions, please do not hesitate
to contact either one of us.  Thanks for trying out the AOK TFR!


                                                - Rich and Doug
                                                  November 15, 1992
                                                  February  9, 1993
                                                  January  29, 1996