NCL Home>
Application examples>
Data Analysis ||
Data files for some examples
Example pages containing:
tips |
resources |
functions/procedures

# Spectral Analysis and Complex Demodulation

Spectral analysis of time series is the process of partitioning the temporal variance information
into frequency variance information. The latter is called the

*spectrum*.
The spectrum breaks the sample variance of time series into discret components,
each of which is associated with a particular frequency.

A nice simple example of the concept and process is provided at
**Introduction to Spectral Analysis** (D. Percival, U. Washington).

The NCL functions **specx_anal** and **specxy_anal**
perform the temporal-to-frequency transformation via the
**Fast Fourier Transform (FFT)**.
The **FFT** implicitly assume the time series are 'cyclic'. Generally, this is not true.
Hence, the source time series must be pre-treated (*aka*, "pre-whitening").
In most applications, this means the data must be tapered in the time or frequency domains.
NCL's functions perform the tapering in the time domain. Further, removing any linear
trend in the source data is recommended. The trend removal is performed first, then the
trend-removed data are tapered. This combination minimizes "ringing" and "leakage".

The FFT performed on the pre-whitened series create periodogram estimates. Nominally,
each periodogram estimate has 2 degrees of freedom for each frequency band.
("Nominally" because the source data has been pre-whitened which slightly reduces
the degrees of freedom..) To provide some level
of statistical reliability, the periodogram estimates must be smoothed.
For example, a 5-point smoother would nominally result in 10 degrees of freedom (5*2).
The side effect of the smoothing process is that the effective band-width is wider
(think, 5*periodogram-band-width). A nice description is at:
**Spectral Analysis: Smoothed Periodogram Method** (DMeko, U. Arizona).

spec_1.ncl: Reads in a time series from
a netCDF file, calculates the spectrum and plots the results.

**specx_anal**: Calculates the spectra of a time series with options on
smoothing, demeaning, detrending, and tapering.

**dimsizes**: calculates the dimension sizes of any array.

spec_2.ncl: Reads in two time series
and calculates their spectra, cospectra, coherence, quadrature spectra,
and phase and creates a panel plot of all values.

**specxy_anal**: Calculates the cospectra, coherence-squared, quadrature
spectra, and phase as well as the spectra of two time series with
options on smoothing, demeaning, detrending, and tapering.

The coherence-squared is a statistic that can be used to examine the relation between
two signals or data sets. It allows identification of significant frequency-domain
correlation between the two time series. **Phase estimates in the cross spectrum are
only useful where significant frequency-domain coherence-squared exists.** The
6.4.0 release contains two functions that can be used to test for significance:
**cohsq_c2p** and **cohsq_p2c**.

**gsn_panel** is the plot interface that panels plots together.
More examples of panel plots.

spec_3.ncl: Calculates red noise
confidence intervals and creates several plot variations.

**specx_ci** is the

Shea Utility that
calculates a red noise confidence interval. This function
returns four curves: the calculated spectrum, the "red noise" curve
and the curves indicating the upper and lower confidence bounds.

spec_4.ncl: Plots spectra and
"red noise" confidence intervals on a log scale and draws the bandwidth.

*trYLog* = True

*trYMinF* =
0.10

*trYMaxF* =
30.0, Changes the Y-axis to log and manually
sets the lower and upper limits.

**gsn_polyline** and

**gsn_text**
are used to add the bandwidth line and label to the figure.

spec_5.ncl: A variation of Example 4.
The leftmost plot uses frequency as the abscissa. The two rightmost plots
use period (1/fequency) as the abscissa. Since the period is not linear,
plotting a subset of all the periods may be more useful. The

**ind**
function is used to select the desired indices. The rightmost plot illustrates
how to reverse the abscissa order.

NCL

**6.4.0**, which contains the

**demod_cmplx** function,
is not released. However, the 6.4.0 'contributed.ncl' library which
contains the most up-to-date functions can be downloaded from

**here**.

demod_cmplx_1.ncl:
Reproduce Bloomfield's demodulation of Wolf's annual sun spot series (1700-1960) using NCL's

**demod_cmplx** function.
The modulation period used is 22 years (

*frqdem*=(1/22)).
The is figure 6.9 on page 141. The amplitude is

*very slightly* different
due to NCL's use of a different filter (

**filwgts_lanczos** and
(likely) a different low-pass filter cut-off frequency. The phase plots are the

*principal* (raw) phases.

demod_cmplx_2.ncl:
Read and unpack daily sea-level-pressures (slp) from NCEP-1 grid points surrounding
Kanton Island (2.8N, 188.325E). Perform a simple areal average. Perform a complex
demodulation about a period of 35 days (

*frqdem*=(1/35). Commonly,
the Madden-Julian Oscillation (MJO) is described as having a 30-60 day period.