/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package weka.filters.timeseries;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.SimpleBatchFilter;
/**
*
* @author ajb
*/
public class PowerCepstrum extends PowerSpectrum{
public PowerCepstrum(){
}
@Override
public String globalInfo() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected Instances determineOutputFormat(Instances inputFormat) throws Exception {
//Set up instances size and format.
int length=(fftFilter.findLength(inputFormat));
length/=2;
FastVector atts=new FastVector();
String name;
for(int i=0;i<length;i++){
name = "PowerSpectrum_"+i;
atts.addElement(new Attribute(name));
}
if(inputFormat.classIndex()>=0){ //Classification set, set class
//Get the class values as a fast vector
Attribute target =inputFormat.attribute(inputFormat.classIndex());
FastVector vals=new FastVector(target.numValues());
for(int i=0;i<target.numValues();i++)
vals.addElement(target.value(i));
atts.addElement(new Attribute(inputFormat.attribute(inputFormat.classIndex()).name(),vals));
}
Instances result = new Instances("Cepstrum"+inputFormat.relationName(),atts,inputFormat.numInstances());
if(inputFormat.classIndex()>=0)
result.setClassIndex(result.numAttributes()-1);
return result;
}
@Override
public Instances process(Instances instances) throws Exception {
//Find power spectrum
Instances output=determineOutputFormat(instances);
output=super.process(instances);
//Take logs
logDataSet(output);
//Take Inverse FFT of logged Spectrum.
for(int i=0;i<output.numInstances();i++){
//Get out values, store in a complex array
Instance next=output.instance(i);
double[] ar=next.toDoubleArray();
FFT.Complex[] complex=new FFT.Complex[ar.length-1];
for(int j=0;j<ar.length-1;j++)
complex[i]=new FFT.Complex(ar[i],0);
//Take inverse FFT
inverseFFT(complex,complex.length);
//Square the terms for the PowerCepstrum
for(int j=0;j<complex.length;j++)
next.setValue(j,complex[i].real*complex[i].real+complex[i].imag*complex[i].imag);
}
return output;
}
public void logDataSet(Instances out ){
for(int i=0;i<out.numInstances();i++){
Instance ins=out.instance(i);
for(int j=0;j<ins.numAttributes();j++){
if(j!=ins.classIndex())
ins.setValue(j,Math.log(ins.value(j)));
}
}
}
}