samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.units; samer@0: samer@0: import samer.core.*; samer@0: import samer.maths.*; samer@0: import samer.tools.*; samer@0: import samer.functions.*; samer@0: samer@0: /** samer@0: Manages a fourier transform from a given Vec into samer@0: another vector. Can create tasks appropriate for samer@0: a power spectrum or an arbitrary function of a samer@0: power spectrum. samer@0: */ samer@0: samer@0: public class FFTVector extends FFT implements Task samer@0: { samer@0: Vec in; samer@0: samer@0: public FFTVector(Vec in) throws Exception { this(in.size()); setInput(in); } samer@0: public FFTVector(int N) throws Exception samer@0: { samer@0: super(N); samer@0: samer@0: // setup window function samer@0: String window = Shell.getString("ft.window","hamming"); samer@0: if (window.equals("rectangular")) setWindow(new Constant(1.0)); samer@0: else if (window.equals("hanning")) setWindow(new Hanning()); samer@0: else setWindow(new Hamming()); samer@0: } samer@0: samer@0: public void setInput(Vec in) { this.in = in; } samer@0: public String toString() { return "FT("+in+")"; } samer@0: public Vec real() { return new Vec.ForArray(real); } samer@0: public Vec imag() { return new Vec.ForArray(imag); } samer@0: samer@0: public void starting() {} samer@0: public void stopping() {} samer@0: public void run() { input(in.iterator()); calculate(); } samer@0: public void dispose() {} samer@0: samer@0: public Task calcTask() { samer@0: if (in.array()!=null) { samer@0: return new AnonymousTask() { samer@0: double [] b=in.array(); samer@0: public void run() throws Exception { samer@0: input(b); calculate(); samer@0: } samer@0: public String toString() { return FFTVector.this.toString()+": compute"; } samer@0: }; samer@0: } else return this; samer@0: } samer@0: samer@0: public Task getPower(final VVector A) samer@0: { samer@0: final double [] a=A.array(); samer@0: return new AnonymousTask() { samer@0: public void run() throws Exception { samer@0: outputPower(a); A.changed(); samer@0: } samer@0: public String toString() { return FFTVector.this.toString()+":power->"+A; } samer@0: }; samer@0: } samer@0: samer@0: public Task getFnPower(final Function f, final VVector A) samer@0: { samer@0: final double [] a=A.array(); samer@0: return new AnonymousTask() { samer@0: public void run() throws Exception { samer@0: outputPower(a); f.apply(a); samer@0: A.changed(); samer@0: } samer@0: public void dispose() { f.dispose(); super.dispose(); } samer@0: public String toString() { samer@0: return FFTVector.this.toString()+":"+f.format("power")+"->"+A; samer@0: } samer@0: }; samer@0: } samer@0: samer@0: public Task getLinearFT(final VVector A) samer@0: { samer@0: return new AnonymousTask() { samer@0: double[] a=A.array(); samer@0: samer@0: public void run() throws Exception samer@0: { samer@0: int i=1,j=1; samer@0: a[0]=real[0]; samer@0: for (; i"+A; } samer@0: }; samer@0: } samer@0: } samer@0: