tests.be.tarsos.dsp.test.ImpulseDetection Maven / Gradle / Ivy
The newest version!
package be.tarsos.dsp.test;
import be.tarsos.dsp.resample.Resampler;
import be.tarsos.dsp.wavelet.lift.Daubechies4Wavelet;
public class ImpulseDetection {
public static void main(String[] args) {
double sampleRate = 2000.0;
double frequency = 8.0;
double amplitude = 0.8;
double twoPiF = 2 * Math.PI * frequency;
float[] data = new float[512];
for(int sample = 0 ; sample < data.length ; sample++){
double time = sample / sampleRate;
data[sample] = (float) (amplitude * Math.sin(twoPiF * time));
}
for(int sample = 0 ; sample < data.length ; sample++){
//System.out.println(data[sample]);
}
/*
float amount = 10;
for(int sample = 205 ; sample < 215 ; sample++){
data[sample] = (sample-205)/amount;
}
*/
data[62] = 1.0f;
Daubechies4Wavelet dwt = new Daubechies4Wavelet();
dwt.forwardTrans(data);
float[] levelFive = mra(data,5);//31.25 - 62.5
float[] levelFour = mra(data,4);//62.5-125
float[] levelThree = mra(data,3);//125-250
float[] levelTwo = mra(data,2);//250-500Hz
float[] levelOne = mra(data,1);//500-100Hz
dwt.inverseTrans(data);
normalize(data);
for(int i = 0 ; i < levelFive.length ; i++){
System.out.println(i+";"+data[i]+";"+levelFive[i]+";"+levelFour[i]+";"+levelThree[i]+";"+levelTwo[i]+";"+levelOne[i]);
}
double maxValue = 0;
int maxIndex = 0;
for(int i = 0 ; i < levelOne.length ; i++){
if(Math.abs(levelOne[i])>maxValue){
maxIndex = i;
maxValue = Math.abs(levelOne[i]);
}
}
System.out.println("Anomaly at " + maxIndex);
}
private static float[] mra(float[] data,int level){
int length = (int)Math.pow(2,level);
int startIndex = (int) (data.length/Math.pow(2,level));
int stopIndex = (int) (data.length/Math.pow(2,level-1));
float[] part = new float[stopIndex-startIndex];
int j = 0;
for(int i = startIndex ; i < stopIndex ;i++){
part[j] = -1 * data[i];
j++;
}
normalize(part);
float factor = data.length/(float)part.length;
Resampler r= new Resampler(false,factor,factor);
float[] out = new float[(int) (part.length * factor)];
r.process(factor, part, 0, part.length, false, out, 0, out.length);
float [] mra = new float[data.length];
j=0;
for(int i = 0 ; i < out.length ; i++){
if((i+length/2)%length==0){
mra[i] = part[j];
j++;
}
}
return mra;
}
private static void normalize(float[] data){
float maxValue = 0;
for(int i = 0 ; i < data.length ;i++){
maxValue = Math.max(Math.abs(data[i]),maxValue);
}
for(int i = 0 ; i < data.length ;i++){
data[i]=data[i]/maxValue;
}
}
}