[R] power in a specific frequency band
Gabor Grothendieck
ggrothendieck at myway.com
Sat Oct 16 19:16:48 CEST 2004
Unfortunately the documentation seems somewhat sparse
but you can figure out what it is doing by looking at the code
of spec.pgram or just pumping a sine wave through it and
comparing that to a manually generated periodogram, which
we do below:
> tt <- 1:32 # time
> x <- sin(2*pi*tt/8) # sine save with period 8, i.e. freq = .125
> x <- x - mean(x)
>
> # Calculate the periodogram manually using the fft
> round(Mod(fft(x))^2/32, 3)
[1] 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0
>
> # Now recalculate using spectrum
> sp <- spectrum(x, taper = 0, detrend = FALSE)
>
> # Note the power concentrated at sp$freq[4]=.125 in sp$spec[4].
> # Note that the fft version returns the mean in element 1 so element 2
> # of the fft version corresponds to element 1 of the spectrum version.
> # Also in comparing we see that the spectrum version omits the symmetric
> # completion of the first half.
> round(sp$spec,2)
[1] 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0
> sp$freq
[1] 0.03125 0.06250 0.09375 0.12500 0.15625 0.18750 0.21875 0.25000 0.28125
[10] 0.31250 0.34375 0.37500 0.40625 0.43750 0.46875 0.50000
> 1/sp$freq
[1] 32.000000 16.000000 10.666667 8.000000 6.400000 5.333333 4.571429
[8] 4.000000 3.555556 3.200000 2.909091 2.666667 2.461538 2.285714
[15] 2.133333 2.000000
>
> # sum of squares vs. sum of periodogram values.
> # Note that power defined as sum of squares of demeaned series
> # equals twice sum of periodogram values returned by spectrum
> # (since spec.pgram does not return the half that is the same
> # by symmetry)
> sum(x*x)
[1] 16
> sum(sp$spec)
[1] 8
Date: Fri, 15 Oct 2004 19:55:40 -0400
From: Giuseppe Pagnoni <gpagnon at emory.edu>
To: <r-help at stat.math.ethz.ch>
Subject: [R] power in a specific frequency band
Dear R users
I have a really simple question (hoping for a really simple answer :-):
Having estimated the spectral density of a time series "x" (heart rate
data) with:
x.pgram <- spectrum(x,method="pgram")
I would like to compute the power in a specific energy band.
Assuming that frequency(x)=4 (Hz), and that I am interested in the band
between f1 and f2, is the power in the band simply the following?
sum(x.pgram$spec[(x.pgram$freq > f1/frequency(x)) & (x.pgram$freq <=
f2/frequency(x))])
If it is so, are the returned units the same units as the original time
series, but squared (if x is bpm, then the power is in bpm^2)?
I own a copy of Venables and Ripley (MASS 2003), but I was not able to
extract this information from the time series chapter....
thanks for any help
(please cc to my e-mail, if possible)
giuseppe
Giuseppe Pagnoni
Dept. Psychiatry and Behavioral Sciences
Emory University
1639 Pierce Drive, Suite 4000
Atlanta, GA, 30322
tel: 404.712.8431
fax: 404.727.3233
More information about the R-help
mailing list