Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
st: Rescaling Fast Fourier Transform
From
Jorge Eduardo Pérez Pérez <[email protected]>
To
<[email protected]>
Subject
st: Rescaling Fast Fourier Transform
Date
Tue, 4 Jan 2011 17:34:20 -0500
Dear Statalist:
I'm trying to implement in Stata the Ideal Band Pass Filter for time
series described in
Corbae and Ouliaris (2006) "Extracting Cycles from Nonstationary
data"Econometric theory and Practice: Frontiers of Analysis and
Applied Research (Cambridge and New York: Cambridge University Press),
pp 167-177
At some point, I have to compute a Discrete Fourier Transform. I
translated a function -dft- to do this into Mata:
complex matrix dft( transmorphic matrix x)
{
real matrix yr, yi, dftr, dfti, range
real scalar n, i, ae
complex matrix y, df
y=C(x)
yr=Re(y)
yi=Im(y)
n=rows(x)
dftr=J(n,1,.)
dfti=J(n,1,.)
range=range(1,n,1)
for (i=0; i<=n-1; i++) {
ae=-2*pi()/n
dftr[i+1]=colsum(yr:*cos((range:-1):*ae:*i)-yi:*sin((range:-1):*ae:*i))
dfti[i+1]=colsum(yr:*sin((range:-1):*ae:*i)+yi:*cos((range:-1):*ae:*i))
}
df=conj(C(dftr,dfti))
return(df)
}
For vectors with length equal to a power of 2, this function yields
the same results as the built-in -fft- function (That uses the Fast
Fourier Transform algorithm), up to rounding error:
mata
: x=range(1,4,1)
: dft(x)
1
+--------------------+
1 | 10 |
2 | -2 - 2i |
3 | -2 + 9.7972e-16i |
4 | -2 + 2i |
+--------------------+
: fft(x)
1
+-----------+
1 | 10 |
2 | -2 - 2i |
3 | -2 |
4 | -2 + 2i |
+-----------+
However, if the length of the vector is not a power of 2, I have to
use zero padding. i.e: -fft(ftpad(x))- . How do I scale the results
obtained from -fft(ftpad(x))- to be the same as the ones obtained from
-dft- ?
Thank you.
_______________________
Jorge Eduardo Pérez Pérez
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/