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