Livt packages
Livt.Signal
Version 0.1.1
Q1.15 sample streams, filters, windows, rate conversion, FFTs, oscillators, and mixers for Livt.
Published files (80)
tests/transform/SequentialFftQ15Test.lvt
namespace Livt.Signal.Tests.Transform
using Livt.Signal.Transform
/**
* Verifies sequential FFT arithmetic, ordering, scaling, sizing, and stalls.
*/
@Test
component SequentialFftQ15Test
{
const ZERO: int[8] = [0, 0, 0, 0, 0, 0, 0, 0]
const IMPULSE: int[8] = [16384, 0, 0, 0, 0, 0, 0, 0]
const DC: int[8] = [8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192]
const SMALL_DC: int[8] = [1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000]
const FULL_SCALE: int[8] = [32767, 32767, 32767, 32767,
32767, 32767, 32767, 32767]
const COSINE: int[8] = [8192, 5793, 0, -5793,
-8192, -5793, 0, 5793]
const TONE_REAL: int[8] = [8192, 5793, 0, -5793,
-8192, -5793, 0, 5793]
const TONE_IMAG: int[8] = [0, 5793, 8192, 5793,
0, -5793, -8192, -5793]
const BIT_REVERSED_TONE_REAL: int[8] = [8192, -8192, 0, 0,
5793, -5793, -5793, 5793]
const BIT_REVERSED_TONE_IMAG: int[8] = [0, 0, 8192, -8192,
5793, -5793, 5793, -5793]
const BIN_ONE_REAL: int[8] = [0, 8192, 0, 0, 0, 0, 0, 0]
impulse: SequentialFftQ15Fixture<8>
dc: SequentialFftQ15Fixture<8>
tone: SequentialFftQ15Fixture<8>
bitReversedInput: SequentialFftQ15Fixture<8, FftDirection.Forward,
-1, FftOrder.BitReversed, FftOrder.Natural>
bitReversedOutput: SequentialFftQ15Fixture<8, FftDirection.Forward,
-1, FftOrder.Natural, FftOrder.BitReversed>
inverse: SequentialFftQ15Fixture<8, FftDirection.Inverse>
unscaled: SequentialFftQ15Fixture<8, FftDirection.Forward, 0>
saturated: SequentialFftQ15Fixture<8, FftDirection.Forward, 0>
conjugateSymmetry: SequentialFftQ15Fixture<8>
stalled: SequentialFftQ15Fixture<8>
roundTrip: SequentialFftRoundTripFixture
impulse8: SequentialFftImpulseFixture<8>
impulse16: SequentialFftImpulseFixture<16>
impulse32: SequentialFftImpulseFixture<32>
impulse64: SequentialFftImpulseFixture<64>
impulse128: SequentialFftImpulseFixture<128>
impulse256: SequentialFftImpulseFixture<256>
impulse512: SequentialFftImpulseFixture<512>
impulse1024: SequentialFftImpulseFixture<1024>
impulse2048: SequentialFftImpulseFixture<2048>
impulse4096: SequentialFftImpulseFixture<4096>
new()
{
impulse = new SequentialFftQ15Fixture<8>(IMPULSE, ZERO)
dc = new SequentialFftQ15Fixture<8>(DC, ZERO)
tone = new SequentialFftQ15Fixture<8>(TONE_REAL, TONE_IMAG)
bitReversedInput = new SequentialFftQ15Fixture<8,
FftDirection.Forward, -1, FftOrder.BitReversed,
FftOrder.Natural>(BIT_REVERSED_TONE_REAL,
BIT_REVERSED_TONE_IMAG)
bitReversedOutput = new SequentialFftQ15Fixture<8,
FftDirection.Forward, -1, FftOrder.Natural,
FftOrder.BitReversed>(TONE_REAL, TONE_IMAG)
inverse = new SequentialFftQ15Fixture<8,
FftDirection.Inverse>(BIN_ONE_REAL, ZERO)
unscaled = new SequentialFftQ15Fixture<8,
FftDirection.Forward, 0>(SMALL_DC, ZERO)
saturated = new SequentialFftQ15Fixture<8,
FftDirection.Forward, 0>(FULL_SCALE, ZERO)
conjugateSymmetry = new SequentialFftQ15Fixture<8>(COSINE, ZERO)
stalled = new SequentialFftQ15Fixture<8>(IMPULSE, ZERO)
roundTrip = new SequentialFftRoundTripFixture()
impulse8 = new SequentialFftImpulseFixture<8>()
impulse16 = new SequentialFftImpulseFixture<16>()
impulse32 = new SequentialFftImpulseFixture<32>()
impulse64 = new SequentialFftImpulseFixture<64>()
impulse128 = new SequentialFftImpulseFixture<128>()
impulse256 = new SequentialFftImpulseFixture<256>()
impulse512 = new SequentialFftImpulseFixture<512>()
impulse1024 = new SequentialFftImpulseFixture<1024>()
impulse2048 = new SequentialFftImpulseFixture<2048>()
impulse4096 = new SequentialFftImpulseFixture<4096>()
}
@Test
fn ComputesConfiguredTransformsAndEveryInitialSize()
{
impulse.outputReady = true
dc.outputReady = true
tone.outputReady = true
bitReversedInput.outputReady = true
bitReversedOutput.outputReady = true
inverse.outputReady = true
unscaled.outputReady = true
saturated.outputReady = true
conjugateSymmetry.outputReady = true
roundTrip.ready = true
impulse8.ready = true
impulse16.ready = true
impulse32.ready = true
impulse64.ready = true
impulse128.ready = true
impulse256.ready = true
impulse512.ready = true
impulse1024.ready = true
impulse2048.ready = true
impulse4096.ready = true
Simulation.Wait(100)
assert stalled.outputValid
assert stalled.accepted == 0
stalled.outputReady = true
Simulation.Wait(70000)
assert impulse.accepted == 8
assert impulse.GetReal(0) == 2048
assert impulse.GetReal(7) == 2048
assert impulse.GetImag(3) == 0
assert impulse.firstSeen
assert impulse.lastSeen
assert dc.GetReal(0) >= 8190 && dc.GetReal(0) <= 8192
assert dc.GetReal(1) == 0
assert dc.GetImag(0) == 0
assert tone.GetReal(1) >= 8188 && tone.GetReal(1) <= 8192
assert tone.GetImag(1) >= -2 && tone.GetImag(1) <= 2
assert tone.GetReal(0) >= -2 && tone.GetReal(0) <= 2
assert bitReversedInput.GetReal(1) >= 8188
assert bitReversedOutput.GetReal(4) >= 8188
assert bitReversedOutput.GetReal(1) <= 2
assert inverse.GetReal(0) >= 1023 && inverse.GetReal(0) <= 1024
assert inverse.GetImag(0) == 0
assert inverse.GetReal(2) >= -1 && inverse.GetReal(2) <= 1
assert inverse.GetImag(2) >= 1023 && inverse.GetImag(2) <= 1024
assert unscaled.GetReal(0) >= 7990 && unscaled.GetReal(0) <= 8000
assert unscaled.GetReal(1) == 0
assert saturated.GetReal(0) == 32767
assert conjugateSymmetry.GetReal(1) >= 4092
assert conjugateSymmetry.GetReal(7) >= 4092
assert conjugateSymmetry.GetImag(1) >= -2
&& conjugateSymmetry.GetImag(1) <= 2
assert conjugateSymmetry.GetImag(7) >= -2
&& conjugateSymmetry.GetImag(7) <= 2
assert roundTrip.accepted == 8
assert roundTrip.GetReal(0) >= 8186 && roundTrip.GetReal(0) <= 8192
assert roundTrip.GetImag(0) >= -2 && roundTrip.GetImag(0) <= 2
assert roundTrip.GetReal(2) >= -2 && roundTrip.GetReal(2) <= 2
assert roundTrip.GetImag(2) >= 8186 && roundTrip.GetImag(2) <= 8192
assert stalled.accepted == 8
assert stalled.GetReal(0) == 2048
assert stalled.firstSeen
assert stalled.lastSeen
assert impulse.GetStages() == 3
assert impulse.GetButterflyCount() == 12
assert impulse8.accepted == 8
assert impulse8.mismatches == 0
assert impulse16.accepted == 16 && impulse16.mismatches == 0
assert impulse32.accepted == 32 && impulse32.mismatches == 0
assert impulse64.accepted == 64 && impulse64.mismatches == 0
assert impulse128.accepted == 128 && impulse128.mismatches == 0
assert impulse256.accepted == 256 && impulse256.mismatches == 0
assert impulse512.accepted == 512 && impulse512.mismatches == 0
assert impulse1024.accepted == 1024 && impulse1024.mismatches == 0
assert impulse2048.accepted == 2048 && impulse2048.mismatches == 0
assert impulse4096.accepted == 4096 && impulse4096.mismatches == 0
assert impulse4096.firstSeen
assert impulse4096.lastSeen
}
}