[Thread Prev][Thread Next][Index]
Re: FFT
On Feb 17, 11:45am, Ilana Wainer wrote:
> Subject: FFT
>
> Anybody out there has a "go tool" that can calculate FFT in FERRET?
>
> thanks
>
> Ilana Wainer
>
>-- End of excerpt from Ilana Wainer
===============================================
Hi Ilana,
The external function framework that will be part of Ferret version 5 will
provide FFT's. But that is then ... here is are some Ferret scripts that you
can use now as a stop-gap.
The scripts work in conjunction with the public domain GMT package, so you must
have GMT installed on your system (http://www.soest.hawaii.edu/wessel/gmt.html)
The Ferret script names are
gmt_power - computes the power spectrum
and overlay_bars - graphical tool for error bars
Instructions on using the routines are available from inside Ferret using the
commands
yes? GO/HELP gmt_power
and
yes? GO/HELP overlay_bars
Sample usage - plot power spectrum of Navy winds at X=180, Y=0
yes? SET DATA monthly_navy_winds
yes? GO gmt_power uwnd[x=180,y=0] uwnd x180y0 64
yes? PLOT x180y0_power
yes? GO overlay_bars x180y0_power x180y0_error red
cheers - steve
P.S. Instructions: Copy the two attached files,
gmt_power.jnl and overlay_bars.jnl, into the directory $FER_DIR/go.
--
| NOAA/PMEL | ph. (206) 526-6080
Steve Hankin | 7600 Sand Point Way NE | FAX (206) 526-6744
| Seattle, WA 98115-0070 | hankin@pmel.noaa.gov
\cancel mode verify
! gmt_power.jnl 10/96
! update 10/23 - display the GMT commend that is issued
! Description: define a variable for the power spectrum of a time series
! Output: variable definitions for "out_name".power and "out_name".error
! Usage: 1 2 3 4
! GO gmt_power my_T_series grid [out_name] [seg_len]
! Arguments:
! my_T_series - variable or expression for time series
! (should not depend on SET REGION/T=...)
!
! grid The name of the grid upon which your time series is defined
! (If computing the power spectrum of a file variable you
! may simply use the variable name here.)
! [default="unknown"]
!
! out_name - name stem for the resultant variables
! [default="gmt"]
! use this argument especially when it is necessary to
! work with multiple time series simultaneously
!
! seg_len seg_len ("-S" in GMT spectrum1d man pages)
! [default=largest power of 2 less than 1/2 Npoints]
! ... a radix-2 number of samples per window for ensemble
! averaging. The smallest frequency estimated is 1.0/(segment_size *
! dt), while the largest is 1.0/(2 * dt). One standard error in power
! spectral density is approximately 1.0 / sqrt(n_data / segment_size),
! so if segment_size = 256, you need 25,600 data to get a one standard
! error bar of 10%.
! Example: power spectrum of zonal wind at Equator, dateline
! yes? SET DATA monthly_navy_winds
! yes? GO gmt_power uwnd[x=180,y=0] uwnd x180y0 64
! yes? PLOT x180y0_power
! yes? GO overlay_bars x180y0_power x180y0_error red
! See "man spectrum1d" for detailed explanations.
! Note -- this tool:
! - computes a power spectrum at a single geographical location, only
! - CANCELs the current REGION
! - cannot accept missing data (gaps) in the time series
! For details on the FFT calculation type "man spectrum1d" at the Unix prompt.
! check for valid time series - must exist, must be a simple 1D time series
query/ignore $1%<Usage: GO gmt_power my_T_series grid [out_name] [seg-len]%
query/ignore $2%<Usage: GO gmt_power my_T_series grid [out_name] [seg-len]%
DEFINE SYMBOL psgmt_shape `$1,return=shape`
IF ($psgmt_shape"|T>0|*>1") THEN
SAY You must pass a simple time series to this routine
SAY Your argument of $1 is ($psgmt_shape) dimensioned
CANNOT_CONTINUE using $1 ! deliberate syntax error
ENDIF
! abort if the time series contains missing values
LET/quiet psgmt_check = $1
IF `psgmt_check[l=@nbd]` THEN
SAY >>> GMT FFT routines cannot handle gaps in data
SAY >>> Expression contains `psgmt_check[l=@nbd]` missing values: $1
EXIT
ENDIF
! determine the "segment length" (if not passed as an argument)
IF $4"0" THEN
DEFINE SYMBOL psgmt_seg $4
ELSE
! ... greatest power of 2 less than one half of the time series length
DEFINE SYMBOL psgmt_Nt `$1,return=lsize`
DEFINE SYMBOL psgmt_seg `2^(INT(LOG(($psgmt_Nt))/LOG(2))-1)`
SAY Using segment length of ($psgmt_seg)
ENDIF
! set up symbols for variable names, and file names
DEFINE SYMBOL psgmt_var $3"gmt"
DEFINE SYMBOL psgmt_dat ($psgmt_var).tseries
! determine delta T for the time series (in days)
LET/QUIET gmt_T_one = T[G=$2]/T[G=$2]
DEFINE SYMBOL psgmt_days `gmt_T_one[l=@din]/(gmt_T_one[l=@ngd]*60*60*24)`
CANCEL VARIABLE gmt_T_one
! clean up files after last use
SPAWN rm -f ($psgmt_dat)
! write the indicated time series data into a new file
list/file=($psgmt_dat)/format=(1PG15.6)/nohead $1
! compute the power spectrum using GMT routine
SAY >>> Using GMT command: spectrum1d ($psgmt_dat) -N($psgmt_var) -S($psgmt_seg) -D($psgmt_days)
SPAWN spectrum1d ($psgmt_dat) -N($psgmt_var) -S($psgmt_seg) -D($psgmt_days)
! read the frequency axis from the resulting spectrum
SET DATA/SAVE
CANCEL REGION
file/var=freq ($psgmt_var).xpower
DEFINE AXIS/T=`freq[i=1]`:`freq[i=@max]`/npoints=`freq[i=@ngd]`/units="1/days" ($psgmt_var)freq
define grid/T=($psgmt_var)freq ($psgmt_var)freq
CANCEL DATA ($psgmt_var).xpower
! define variables for the results: power series and error
file/grid=($psgmt_var)freq/var=-,power,error ($psgmt_var).xpower
! set titles and units for resultant variables
LET/QUIET ($psgmt_var)_power = power[d=($psgmt_var).xpower]
SET VARIABLE/TITLE="Power Spectrum of $1 " ($psgmt_var)_power
LET/QUIET ($psgmt_var)_error = error[d=($psgmt_var).xpower]
SET VARIABLE/TITLE="Spectral Error of $1 " ($psgmt_var)_error
! let the user know what the power spectrum variables are
SAY >>> Power spectrum is ($psgmt_var)_power (try PLOT ($psgmt_var)_power )
SAY >>> Spectral error is ($psgmt_var)_error
! clean up
CANCEL SYMBOL psgmt*
SET DATA/RESTORE
SET MODE/LAST VERIFY
\CANCEL MODE VERIFY
! overlay_bars.jnl 10/96
! DESCRIPTION: Overlay error bars on a time series (or frequency) plot
! This is a simple routine to overlay error bars. It is applicable only to
! T axis plots and it creates only a simple vertical line (no I bar).
! A more sophisticated script could be both faster and higher functioning.
! Usage: 1 2 3
! GO overlay_bars spectrum errors [color]
! Arguments:
! spectrum - 1D field to be plotted (on T axis)
!
! errors - a 1D field of errors (bars from spectrum-error to spectrum+error)
!
! color - color of the error bars
! check color parameter
DEFINE SYMBOL ob_color $3"1|1|2|3|4|5|6|7|8|9|10|11|12|13|14|black>1|red>2|green>3|blue>4|<Unknown color argument"
! define a 2-point vertical line with this variable
LET/QUIET kk=k ! to work around a known bug in Ferret V4.4
LET/QUIET vbar = if kk eq 1 then (-1)*$2 else $2
! error bar plot
REPEAT/L=`$1,return=lstart`:`$1,return=lend` PLOT/OVER/VS/LINE=($ob_color)/K=1:2/NOLAB $1*kk*0+T,$1+vbar
! clean up
CANCEL REGION/l
CANCEL VARIABLE kk, vbar
CANCEL SYMBOL ob_color
SET MODE/LAST VERIFY
[Thread Prev][Thread Next][Index]
Dept of Commerce /
NOAA /
OAR /
PMEL /
TMAP
Contact Us | Privacy Policy | Disclaimer | Accessibility Statement