[ncl-talk] compute frequency power density power spectra for selected regions

Sri nandini bax8609 at uni-hamburg.de
Tue Mar 2 05:52:45 MST 2021


Hello dear ncl-users,

I have a question regarding computing frequency power spectra density 
for my selected regions, e.g. Northwestern Atlantic SSH anomalies.

1) I calculated the frequency spectra of SSH anomalies by (1) extracting 
region and subtracting the ensemble mean, (2) temporal removal of mean 
and detrending was applied, as well as smoothing (periodogram estimates 
using modified Daniel) and percent tapering of the anomalies, (3) the 
function for spectral analysis returns the degrees of freedom -spectra 
for each ensemble, so i used a loop over all ensemble members to get the 
ensemble mean spectra (4) the variables returned are variance/(unit 
frequency interval) (y-axis) and frequency (cycles/months) for 
x-axis==see attached plot for power Spectra for historical Northwestern 
Atlantic SSH anomalies. I don't have a reference for this figure to 
compare with but it doesn't look meaningful, but do you think this is 
correct?

Would be grateful, below is my code

Sri


  f     = addfile ("Hist_monthly_corrected_pi_trend.nc", "r")
   hist_anom    = f->hist_trend(1632:1871,:,{-30:60},{0:-40})
   hist_anom_NY1=dim_avg_n_Wrap(hist_anom,(/2,3/))
   printVarSummary(hist_anom_NY1)
   hist_anom_NY1=hist_anom_NY1*100
    dimx = dimsizes(hist_anom_NY1)
    ntim = dimx(0)          ; 240
    nens = dimx(1)         ;100
   hist_ensavg=dim_avg_n(hist_anom_NY1,1)
   printVarSummary(hist_ensavg)
   hist_anom1 = hist_anom_NY1
   do n=0,nens-1
   hist_anom1(:,n) = hist_anom_NY1(:,n) - hist_ensavg
   end do

   nLen = ntim/2
   spec  = new ( nLen, typeof(hist_anom1))
   spec  = 0.0
   z1    = 0.0
   xtsVar= 0.0
   printVarSummary(nLen)
   printVarSummary(spec)
   printVarSummary(hist_anom1)
  ;-------------------------------------;
  ;set function agurments
  ;-------------------------------------;

   iopt  = 1                           ; detrending opt: 0=>remove mean 
1=>remove mean and detrend
   jave  = 7                           ; Average 7 periodogram estimates 
using modified Daniel
   pct   = 0.1                         ; percent tapered: (0.0 <= pct <= 
1.0) 0.10 common.
  ;-------------------------------------;
  ; calculate mean spectrum:specx_anal returns the degrees of freedom as 
a scalar.
  ; calculate confidence interval [here 5 and 95%] and lag1 auto cor.
  ; return 4 curves to be plotted
  ; loop over every ensemble member
  ;-------------------------------------;

   do ns=0,nens-1                      ; spectra for each ensemble member
    sdof  = specx_anal(hist_anom1(:,ns),iopt,jave,pct)
      spec   = spec + sdof at spcx        ; sum spectra
      xtsVar = xtsVar + sdof at xvari     ; sum ensemble member variances
    ; sum z-traansformed lag-1 correlations
      z1     = z1   + 0.5*log((1+sdof at xlag1)/(1-sdof at xlag1)) ; Fischer 
z-transform
    printVarSummary(z1)
    end do

   spec  = spec/nens                     ; average spectra ==> ensemble 
mean spectra
   z1    = z1/nens                       ; ensemble mean z=transformed lag1
   xvari = xtsVar/nens                   ; mean variance of ensemble members
   printVarSummary(spec)
   printVarSummary(z1)
   printVarSummary(xvari)
   printVarSummary(sdof)
  ;-----------------------------------------------------------------------------;
  ; create a new variable
  ;-----------------------------------------------------------------------------;

   ss       = (/ sdof /)
   ss at dof   = 2*nens                       ; # degrees freedom
   ss at bw    = sdof at bw                      ; representing the spectral 
band width.
   ss at spcx  = spec                         ;One-dimensional array of 
length N/2.units are variance/(unit frequency interval).
   ss at xvari = xvari                        ; representing the variance 
of the x series on input.
   ss at frq     = sdof at frq                   ; A one-dimensional array of 
length N/2 representing frequency (cycles/time).
   ss at xlag1 = (exp(2*z1)-1)/(exp(2*z1)+1)  ; match specx_anal
   printVarSummary(ss)
   splt = specx_ci(ss, 0.05, 0.95)               ; calc confidence interval
   printVarSummary(splt)
;-----------------------------------------------------------------------------;
; plotting parameters
;-----------------------------------------------------------------------------;
   wks  = gsn_open_wks("png","PSD_wNA_Monthly_Hist")

   res  = True                                                  ; plot 
mods desired
   res at gsnMaximize   = True                        ; blow up plot
   res at gsnDraw = False
   res at gsnFrame = False

   res at vpXF = 0.1
   res at vpYF = 0.7
   res at vpWidthF = 0.7
   res at vpHeightF = 0.25

   res at trXMinF = 0
   res at trXMaxF = .50
   res at trYMinF = 20
   res at trYMaxF = 0

   res at gsnStringFontHeightF = 0.018
   res at gsnRightString = " "
   res at tiXAxisString = "Frequency (cycles/month)"      ;the fraction (or 
use Period(months))
   res at tiXAxisFontHeightF = 0.018

   res at tiYAxisString = "PSD (cm^2/month^-1)" ;"Variance/frq_interval
   res at tiYAxisFontHeightF = 0.018

   res at tmXBLabelFontHeightF = 0.016
   res at tmYLLabelFontHeightF = 0.016

  ;-------------------------------------;
  ; 4-2. Timeseries plots
  ;-------------------------------------;

   colors = (/2, 71, 48/)
   colors_em = (/15, 84, 60/)

   res at gsnLeftString  = "a) Historical: Northwest Atlantic, SSHa 
Frequency Spectra"
   res at xyLineThicknesses   = (/2.,1.,1.,1./)       ; Define line thicknesses
   res at xyDashPatterns      = (/0,0,1,1/)           ; Dash patterns

res at xyLineColor = colors(0)
plot = gsn_csm_xy(wks,ss at frq, ss at spcx,res)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: PSD_wNA_Monthly_Hist.png
Type: image/png
Size: 60311 bytes
Desc: not available
URL: <https://mailman.ucar.edu/pipermail/ncl-talk/attachments/20210302/f8a45f78/attachment.png>


More information about the ncl-talk mailing list