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: import samer.core.*; samer@0: import samer.maths.*; samer@0: import samer.tools.*; samer@0: samer@0: public class SpectralFIR implements Task samer@0: { samer@0: FFT fft; samer@0: Vec spectrum; samer@0: VVector A; samer@0: int n, m; samer@0: samer@0: public SpectralFIR(int n, VVector input) samer@0: { samer@0: this.n = n; samer@0: samer@0: fft=new FFT(n); samer@0: fft.setWindow(new Constant(1)); samer@0: fft.invert(); samer@0: samer@0: spectrum = input; samer@0: A=new VVector("coeffs",n); samer@0: } samer@0: samer@0: public VVector coefficients() { return A; } samer@0: samer@0: public void dispose() { A.dispose(); } samer@0: public void run() { samer@0: Vec.Iterator it=spectrum.iterator(); samer@0: double [] _A=A.array(); samer@0: samer@0: Mathx.zero(fft.real); samer@0: Mathx.zero(fft.imag); samer@0: samer@0: fft.real[fft.bitrev[0]]=it.next(); // zero frequency samer@0: for (int i=1; it.more(); i++) { samer@0: fft.real[fft.bitrev[i]] = fft.real[fft.bitrev[n-i]] = it.next(); // pos and neg freqs samer@0: } samer@0: fft.calculate(); samer@0: samer@0: // copy FFT results to filter coefficients samer@0: // with some reordering samer@0: System.arraycopy( fft.real, n/2, _A, 0, n/2); samer@0: System.arraycopy( fft.real, 0, _A, n/2, n/2); samer@0: A.changed(); samer@0: } samer@0: samer@0: // private static double pos(double t) { if (t<0) return 0; else return t; } samer@0: samer@0: public void starting() {} samer@0: public void stopping() {} samer@0: } samer@0: