93 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package auratests.math; | ||
|  | 
 | ||
|  | import utest.Assert; | ||
|  | 
 | ||
|  | import aura.math.FFT; | ||
|  | 
 | ||
|  | import Utils; | ||
|  | 
 | ||
|  | @:depends(auratests.types.TestComplexArray) | ||
|  | class TestFFT extends utest.Test { | ||
|  | 
 | ||
|  | 	function test_bitReverseUint32() { | ||
|  | 		// Haxe has some issue with signed/unsigned ints here, so we instead | ||
|  | 		// compare the individual strings as bits. This also makes the output in | ||
|  | 		// case of assertion failures much nicer to look at. | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0xFF000000), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x000000FF, 32))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x00FF0000), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x0000FF00, 32))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x0000FF00), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x00FF0000, 32))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x000000FF), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0xFF000000, 32))); | ||
|  | 
 | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0xC0000000), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x00000003, 32))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x20000000), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x00000004, 32))); | ||
|  | 
 | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x00FF0000), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x000000FF, 24))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x0000FF00), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x0000FF00, 24))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x000000FF), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x00FF0000, 24))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x0000FF00), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x000000FF, 16))); | ||
|  | 		Assert.equals(Utils.int32ToBytesString(0x00000003), Utils.int32ToBytesString(@:privateAccess aura.math.FFT.bitReverseUint32(0x00000018, 5))); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function test_RealValuedFFT() { | ||
|  | 
 | ||
|  | 		final realFFT = new RealValuedFFT(64, 2, 1); | ||
|  | 
 | ||
|  | 		final inputBuffer = realFFT.getInput(0); | ||
|  | 		for (i in 0...realFFT.size) { | ||
|  | 			inputBuffer[i] = Math.sin(i / realFFT.size * 2 * Math.PI * 8); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		realFFT.forwardFFT(0, 0); | ||
|  | 
 | ||
|  | 		var maxIdx = 0; | ||
|  | 		var maxVal = realFFT.getOutput(0)[0].real; | ||
|  | 		for (i in 1...realFFT.size) { | ||
|  | 			final val = realFFT.getOutput(0)[i].real; | ||
|  | 			if (val > maxVal) { | ||
|  | 				maxVal = val; | ||
|  | 				maxIdx = i; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		Assert.equals(8, maxIdx); | ||
|  | 
 | ||
|  | 		realFFT.inverseFFT(1, 0); | ||
|  | 
 | ||
|  | 		// Assert that ifft(fft(array)) == array | ||
|  | 		for (i in 0...realFFT.size) { | ||
|  | 			Assert.floatEquals(realFFT.getInput(0)[i], realFFT.getInput(1)[i]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function test_ComplexValuedFFT() { | ||
|  | 
 | ||
|  | 		final cplxFFT = new ComplexValuedFFT(64, 2, 1); | ||
|  | 
 | ||
|  | 		final inputBuffer = cplxFFT.getInput(0); | ||
|  | 		for (i in 0...cplxFFT.size) { | ||
|  | 			inputBuffer[i].real = Math.sin(i / cplxFFT.size * 2 * Math.PI * 8); | ||
|  | 			inputBuffer[i].imag = 0.0; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		cplxFFT.forwardFFT(0, 0); | ||
|  | 
 | ||
|  | 		// var maxIdx = 0; | ||
|  | 		// var maxVal = cplxFFT.getOutput(0)[0].real; | ||
|  | 		// for (i in 1...cplxFFT.size) { | ||
|  | 		// 	final val = cplxFFT.getOutput(0)[i].real; | ||
|  | 		// 	if (val > maxVal) { | ||
|  | 		// 		maxVal = val; | ||
|  | 		// 		maxIdx = i; | ||
|  | 		// 	} | ||
|  | 		// } | ||
|  | 		// Assert.equals(8, maxIdx); | ||
|  | 
 | ||
|  | 		cplxFFT.inverseFFT(1, 0); | ||
|  | 
 | ||
|  | 		// Assert that ifft(fft(array)) == array | ||
|  | 		for (i in 0...cplxFFT.size) { | ||
|  | 			Assert.floatEquals(cplxFFT.getInput(0)[i].real, cplxFFT.getInput(1)[i].real); | ||
|  | 			Assert.floatEquals(cplxFFT.getInput(0)[i].imag, cplxFFT.getInput(1)[i].imag); | ||
|  | 		} | ||
|  | 	} | ||
|  | } |