package { import __AS3__.vec.Vector; public class FFT{ private var n:int; // データ数 private var bitrev:Vector.; // ビット反転テーブル private var cstb:Vector.; // 三角関数テーブル public static const HPF:String = "high"; public static const LPF:String = "low"; public static const BPF:String = "band" public function FFT(n:int) { if(n != 0 && (n & (n-1)) == 0) { this.n = n; this.cstb = new Vector.(n + (n>>2), true); this.bitrev = new Vector.(n, true); makeCstb(); makeBitrev(); } } // 1D-FFT public function fft(re:Vector., im:Vector., inv:Boolean=false):void { if(!inv) { fftCore(re, im, 1); }else { fftCore(re, im, -1); for(var i:int=0; i, im:Vector., inv:Boolean=false):void { var tre:Vector. = new Vector.(re.length, true); var tim:Vector. = new Vector.(im.length, true); if(inv) cvtSpectrum(re, im); // x軸方向のFFT for(var y:int=0; y, im:Vector., rad:uint, type:String, bandWidth:uint = 0):void { var r:int = 0; // 半径 var n2:int = n>>1; for(var y:int=-n2; yrad) || (type == BPF && (r(rad + bandWidth)))) { re[x + n2 + (y + n2)*n] = im[x + n2 + (y + n2)*n] = 0; } } } } private function fftCore(re:Vector., im:Vector., sign:int):void { var h:int, d:int, wr:Number, wi:Number, ik:int, xr:Number, xi:Number, m:int, tmp:Number; for(var l:int=0; l>2)]; wi = sign*cstb[h]; for(var i:int=j; i, im:Vector.):void { var tmp:Number = 0.0, xn:int = 0, yn:int = 0; for(var y:int=0; y<(n>>1); y++) { for(var x:int=0; x<(n>>1); x++) { xn = x + (n>>1); yn = y + (n>>1); tmp = re[x + y*n]; re[x + y*n] = re[xn + yn*n]; re[xn + yn*n] = tmp; tmp = re[x + yn*n]; re[x + yn*n] = re[xn + y*n]; re[xn + y*n] = tmp; tmp = im[x + y*n]; im[x + y*n] = im[xn + yn*n]; im[xn + yn*n] = tmp; tmp = im[x + yn*n]; im[x + yn*n] = im[xn + y*n]; im[xn + y*n] = tmp; } } } // 三角関数テーブル作成 private function makeCstb():void { var n2:int = n>>1, n4:int = n>>2, n8:int = n>>3; var t:Number = Math.sin(Math.PI/n); var dc:Number = 2*t*t; var ds:Number = Math.sqrt(dc*(2 - dc)); var c:Number = cstb[n4] = 1; var s:Number = cstb[0] = 0; t = 2*dc; for(var i:int=1; i> 1; while(k<=j) { j -= k; k >>= 1; } j += k; bitrev[i] = j; } } } }