Hello,
 
Here are few words about new FFT function.
It requires AmiBroker 4.86 BETA to run.
http://www.amibroker.com/devlog/2006/10/11/amibroker-4860-beta-released/

===============

FFT( array, len = 0 )

performs FFT (Fast Fourier Transform) on last 'len' bars of the array, if len is set to zero, then FFT is performed
on entire array. len parameter must be even.

Result:

function returns array which holds FFT bins for first 'len' bars. There are len/2 FFT complex bins returned,
where bin is a pair of numbers (complex number): first is real part of the complex number and second number
is the imaginary part of the complex number.

result = FFT( array, 256 );

where:
0th bin (result[0] and result[1]) represents DC component,
1st bin (result[1 ] and result[2]) represents real and imaginary parts of lowest frequency range
and so on upto result[ len - 2 ] and result[ len - 1 ]

remaining elements of the array are set to zero.

FFT bins are complex numbers and do not represent real amplitude and phase. To obtain amplitude and
phase from bins you need to convert inside the formula. The following code snipplet does that:

ffc = FFT(data,Len);
for( i = 0; i < Len - 1; i = i + 2 )
{
   amp[ i ] = amp[ i +
1 ] = sqrt(ffc[ i ]^ 2  +  ffc[ i + 1 ]^2);  
   phase[ i ] = phase[ i +
1 ] = atan2( ffc[ i + 1], ffc[ i ] );
}

IMPORTANT note: input array for FFT must NOT contain any Null values. Use Nz() function to convert Nulls to zeros
if you are not sure that input array is free from nulls.

 
Below is example code showing how to use new FFT function in AFL.
 

SetBarsRequired(100000,100000);

Len =
Param("FFT Length", 1024, 64, 10000, 10
);

Len =
Min( Len, BarCount
);

x =
BarIndex
();
x1 = x -
BarCount
+ Len;


input =
C
;
a =
LastValue( LinRegIntercept( input, Len - 1
) );
b =
LastValue( LinRegSlope( input, Len - 1
) );


Lr = a + b * x1;

data = "" - Lr;
// de-trending


ffc =
FFT
(data,Len);

for( i = 0; i < Len - 1; i = i + 2
)
{
  amp[ i ] = amp[ i +
1 ] = sqrt(ffc[ i ]^ 2  +  ffc[ i + 1 ]^2
);  
  phase[ i ] = phase[ i +
1 ] = atan2( ffc[ i + 1
], ffc[ i ] );
}

auto =
ParamToggle("Auto dominant cycle", "No|Yes", 1
);
sbar =
Param( "Which FFT bin", 1, 0, 50
);

skipbin1 =
ParamToggle("Skip 1st FFT bin", "No|Yes", 1
);

if
( auto )
{
  sbar =
int( LastValue(ValueWhen( amp == LastValue(Highest( IIf( skipbin1 AND x < 4, 0 , amp ) )), x / 2
)) );
}

fv =
Status("firstvisiblebar"
);

thisbar =
Ref( int(x/2
) == sbar, -fv);
Plot( Ref(amp,-fv),"amplitude (bin " + Ref( int(x/2), -fv ) +")", IIf( thisbar, colorRed, colorBlack ),styleArea
);

Plot( IIf( BarCount - BarIndex() < Len, data, Null ) , "de-trended input ("+Len+" bars)", colorOrange, styleLeftAxisScale
);
Plot( cos( phase[ sbar * 2 ] + (sbar) * x1 * 2 * 3.1415926 / Len ), "dominant cycle "+ Len/(sbar) + "(" + sbar + " bin) bars", colorBlue, styleOwnScale
);

GraphZOrder=1
;
GraphXSpace = 10;


Best regards,
Tomasz Janeczko
amibroker.com

__._,_.___

Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com

For other support material please check also:
http://www.amibroker.com/support.html






SPONSORED LINKS
Software support Small business finance Business finance online
Business finance training Business finance course

Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: Switch delivery to Daily Digest | Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | Unsubscribe

__,_._,___

Reply via email to