/**
* NativeFFTTest.java
*
* @author Created by Omnicore CodeGuide
*/
package edu.sc.seis.sod.process.waveform;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import edu.sc.seis.fissuresUtil.freq.Cmplx;
public class OregonDspFFTTest {
@Test
public void testForward() {
float[] data = new float[1024];
data[3] = 6;
data[23] = 9;
data[67] = 10;
data[100] = 2;
data[200] = -1.5f;
data[300] = .25f;
float[] nativeData = new float[data.length];
float[] javaData = new float[data.length];
System.arraycopy(data, 0, nativeData, 0, data.length);
System.arraycopy(data, 0, javaData, 0, data.length);
nativeData = OregonDspFFT.forward(nativeData);
Cmplx[] cData = Cmplx.fft(javaData);
// for (int i = 0; i < cData.length/2; i++) {
// System.out.println("real i="+i+" "+ (float)cData[i].real()+" "+ nativeData[2*i]);
// System.out.println("imag i="+i+" "+ (float)cData[i].imag()+" "+ nativeData[2*i+1]);
// }
// for (int i = cData.length/2; i < cData.length; i++) {
// System.out.println("real i="+i+" "+ (float)cData[i].real());
// System.out.println("imag i="+i+" "+ (float)cData[i].imag());
// }
System.out.println("real i=0"+" "+ (float)cData[0].real()+" "+ nativeData[0]);
System.out.println("imag i=nyq"+" "+ (float)cData[cData.length/2].real()+" "+ nativeData[nativeData.length/2]);
for (int i = 1; i < cData.length/2; i++) {
System.out.println("real i="+i+" "+ (float)cData[i].real()+" "+ nativeData[i]);
System.out.println("imag i="+i+" "+ (float)cData[i].imag()+" "+ nativeData[nativeData.length-i]);
}
// check 0, and F_n/2 is in imaginary of F_0
assertEquals("real F0", nativeData[0], cData[0].real(), 0.00001f);
assertEquals("real F_n/2", nativeData[cData.length/2], cData[cData.length/2].real(), 0.00001f);
for (int i = 1; i < data.length/2; i++) {
System.out.println(i+" "+nativeData[i]+" "+cData[i].real());
assertEquals("real i="+i, (float)cData[i].real(), nativeData[i], 0.001f);
// oregonDSP uses opposite sign convention on imag part, so mul -1
assertEquals("imag i="+i, (float)cData[i].imag(), -1*nativeData[nativeData.length-i], 0.001f);
}
}
@Test
public void testVsCmplxCorrelate() {
float[] fdata = new float[128];
float[] gdata = new float[128];
fdata[5]=1;
fdata[6]=2;
fdata[10]=10;
gdata[43]=7;
gdata[44]=13;
gdata[50]=20;
float[] nativecorr = OregonDspFFT.correlate(fdata, gdata);
float[] cmplxcorr = Cmplx.correlate(fdata, gdata);
assertArrayEquals(nativecorr, cmplxcorr, 0.001f);
}
@Test
public void testVsCmplxConvolve() {
float[] fdata = new float[128];
float[] gdata = new float[128];
fdata[5]=1;
fdata[6]=2;
fdata[10]=10;
gdata[43]=7;
gdata[44]=13;
gdata[50]=20;
float delta = 0.5f;
float[] nativecorr = OregonDspFFT.convolve(fdata, gdata, delta);
float[] cmplxcorr = Cmplx.convolve(fdata, gdata, delta);
assertArrayEquals(nativecorr, cmplxcorr, 0.001f);
}
@Test
public void testRoundTrip() {
float[] data = new float[128];
data[40] = 1;
float[] nativeData = new float[data.length];
nativeData = OregonDspFFT.forward(data);
nativeData = OregonDspFFT.inverse(nativeData);
assertArrayEquals("round trip", data, nativeData, 0.001f);
}
@Test
public void testCorrelation() {
float[] fData = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float[] gData = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float[] corr = OregonDspFFT.correlate(fData, gData);
assertEquals("lag 0", 0f, corr[0], 0.00001f);
assertEquals("lag 1", 2f, corr[1], 0.00001f);
assertEquals("lag 2", 0f, corr[2], 0.00001f);
assertEquals("lag 3", 0f, corr[3], 0.00001f);
}
@Test
public void testConvolve() {
float[] fData = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float[] gData = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float[] corr = OregonDspFFT.convolve(fData, gData, 1);
assertEquals("lag 0", 0f, corr[0], 0.00001f);
assertEquals("lag 1", 0f, corr[1], 0.00001f);
assertEquals("lag 2", 0f, corr[2], 0.00001f);
assertEquals("lag 3", 2f, corr[3], 0.00001f);
assertEquals("lag 4", 0f, corr[4], 0.00001f);
assertEquals("lag 5", 0f, corr[5], 0.00001f);
assertEquals("lag 6", 0f, corr[6], 0.00001f);
assertEquals("lag 7", 0f, corr[7], 0.00001f);
}
}