package jass.generators; import jass.render.*; /** @author Kees van den Doel (kvdoel@cs.ubc.ca) */ public class FFTFilter implements Filter { protected float srate; protected int bufferSize; protected float[] xr,xi; protected FFTFloat fft; public FFTFilter(float srate,int bufferSize,int bits) { super(); this.srate = srate; this.bufferSize= bufferSize; init(bits); } protected void init(int bits) { xr = new float[bufferSize]; xi = new float[bufferSize]; fft = new FFTFloat(bits); } private float fScale(int fk) { //return 1; double b = .4; double f0=1000; int n = bufferSize/2; if(fk>=n) { fk -= n; } double f = srate*fk/bufferSize; return (float)Math.exp(-(f-f0)*(f-f0)/2*b); } /** Proces input (may be same as output). @param output user provided buffer for returned result. @param input user provided input buffer. @param nsamples number of samples written to output buffer. @param inputOffset where to start in circular buffer input. Must be 0 for this filter */ public void filter(float[] output, float[] input, int nsamples, int inputOffset) { boolean invFlag = false; for (int i = 0; i < bufferSize; i++) { xi[i] = 0; } fft.doFFT(input, xi, invFlag); for (int k = 0; k < nsamples; k++) { input[k] *= fScale(k); xi[k] *= fScale(k); } invFlag = true; fft.doFFT(input, xi, invFlag); for (int i = 0; i < bufferSize; i++) { output[i] = input[i]; } } public static void main(String args[]) throws Exception { float srate = 44100.f; int bufferSize = 256; int bits = 8; int bufferSizeJavaSound = 1024 * 8; final SourcePlayer player; final FFTFilter fftFilter = new FFTFilter(srate,bufferSize,bits); final FilterContainer fft = new FilterContainer(srate,bufferSize,fftFilter); RandOut ro = new RandOut(bufferSize); player = new SourcePlayer(bufferSize, bufferSizeJavaSound, srate); fft.addSource(ro); player.addSource(fft); String[] names = {"F1 ", "F2 ", "BW "}; double[] val = {400, 1000,1}; double[] min = {100, 400,.1}; double[] max = {10000,12000, 10}; int nbuttons = 1; Controller a_controlPanel = new Controller(new java.awt.Frame("Demo"), false, val.length, nbuttons) { public void onButton(int k) { switch (k) { case 0: player.resetAGC(); break; } } public void onSlider(int k) { switch (k) { case 0: //hp.setF0((float)this.val[k]); break; case 1: break; case 2: break; } } }; a_controlPanel.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { player.stopPlaying(); try { Thread.sleep(500); } catch (Exception e3) { } System.exit(0); } }); a_controlPanel.setSliders(val, min, max, names); a_controlPanel.setButtonNames(new String[]{"Reset"}); a_controlPanel.setVisible(true); player.start(); } }