package HTools.Math { import HTools.Math.Complex; import flash.utils.*; import flash.errors.*; public class FFT { public var values:Vector.; private var exponentials:Vector. >; private var posMap:Vector.; private var invPosMap:Vector.; private var points:uint; private var logPoints:uint; private function buildExponentials(points:uint) { var i:uint; this.points=points; exponentials=new Vector. >(); var sqrtPoints:Number = Math.sqrt(points); // calculate binary log var tempPoints=points-1; while (tempPoints != 0) { tempPoints >>= 1; logPoints++; } var _2_l:int = 2; for (var l:uint = 1; l <= logPoints; l++) { var subV:Vector.=new Vector.(); for (i = 0; i < points; i++ ) { var re:Number = Math.cos (2. * Math.PI * i / _2_l); var im:Number = -Math.sin (2. * Math.PI * i / _2_l); subV.push( new Complex(re, im) ); } exponentials.push(subV); _2_l *= 2; } // set up bit reverse mapping posMap=new Vector.(); invPosMap=new Vector.() invPosMap.length=points; var rev:uint = 0; var halfPoints:uint = points/2; for (i = 0; i < points - 1; i++){ posMap[i] = rev; invPosMap[rev]=i; var mask:uint = halfPoints; // add 1 backwards while (rev >= mask) { rev -= mask; // turn off this bit mask >>= 1; if(rev==0 && mask == 0) { throw ArgumentError("Points has to be a multiple of 2!"); } } rev += mask; } posMap[points-1] = points-1; } public function loadSamples(b:ByteArray) { values=new Vector.(); values.length=points; for(var i:uint;i0;i--) { var sample=values[posMap[i-1]].real; b.writeFloat(sample); CONFIG::DOUBLE_READ { b.writeFloat(sample) } } } public function FFT(points:uint) { buildExponentials(points); } public function newLoadSamples(b:ByteArray):void { values=new Vector.(); values.length=points; var nd2:uint=points/2; var j:uint=nd2; var i:uint; var t:Complex; for(i=0;i