/* * Created on 2 Jan 2008 * * Copyright (c) 2004-2007 Paul John Leonard * * http://www.frinika.com * * This file is part of Frinika. * * Frinika is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * Frinika is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.audio.analysis.dft; public class FFTClient1 implements FFTSpectrumClient { private float[][] magnArray; private float[][] magnArrayX; private double logMagn[]; int chunkPtr; private int sizeInChunks; FFTSpectrogramDataBuilder builder; public FFTClient1(FFTSpectrogramDataBuilder builder) { this.builder=builder; } public void setSize(int sizeInChunks, int nBin, float freq[], double dt) { magnArray = new float[sizeInChunks][nBin]; magnArrayX = new float[sizeInChunks][nBin]; logMagn=new double[nBin*2]; this.sizeInChunks=sizeInChunks; chunkPtr=0; } public float[][] getMagnitude() { return magnArray; } public float[][] getSMagnitude() { return magnArrayX; } public void process(double fftOut[], int nBin) { // double maxV=0.0; if (chunkPtr >= sizeInChunks) { try { throw new Exception(" ptr tpp big "); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return; } } for (int i = 0; i < nBin; i++) { double real = fftOut[2 * i]; double imag = fftOut[2 * i + 1]; magnArray[chunkPtr][i] = (float) Math.sqrt(real * real + imag * imag); logMagn[i]=Math.log(magnArray[chunkPtr][i]); logMagn[i+nBin]=0.0; // maxV = Math.max(maxV, magnArray[chunkPtr][i]); } // builder.getFFT().calcReal(logMagn, -1); double cutoff=400; // filter changes greater than 400 Hz// filter double Fs=builder.getSampleRate(); int i1=(int) (Fs/cutoff); for (int i = i1; i < nBin; i++) { logMagn[2*i]=logMagn[2*i+1]=0.0f; // (float) Math.sqrt(logMagn[2*i]*logMagn[2*i]+ logMagn[2*i+1]*logMagn[2*i+1]); } builder.getFFT().calcReal(logMagn, 1); for (int i = 0; i < nBin; i++) { magnArrayX[chunkPtr][i]=(float) Math.exp( logMagn[i]/nBin); // (float) Math.sqrt(logMagn[2*i]*logMagn[2*i]+ logMagn[2*i+1]*logMagn[2*i+1]); } // // System.out.println(maxV + " @ " +chunkPtr); chunkPtr++; } public float[] getMagnitudeAt(long chunkPtr) { if (magnArray == null) return null; // int pix = (int) (framePtr / chunksize); if (chunkPtr >= magnArray.length || chunkPtr < 0) return null; return magnArray[(int) chunkPtr]; } public float[] getPhaseAt(long chunkPtr) { return null; } public float[] getPhaseFreqAt(long chunkPtr) { return null; } public int getSizeInChunks() { return sizeInChunks; } public int getChunkRenderedCount() { return chunkPtr; } public boolean validAt(long chunkPtr2) { return chunkPtr2>=0 && chunkPtr2 < this.chunkPtr; } public float[] getSmagnitudeAt(long chunkPtr) { if (magnArrayX == null) return null; // int pix = (int) (framePtr / chunksize); if (chunkPtr >= magnArrayX.length || chunkPtr < 0) return null; return magnArrayX[(int) chunkPtr]; } }