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; }
		};
	}
}