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/window/WindowQ15Test.lvt

namespace Livt.Signal.Tests.Window

using Livt.Signal.Stream
using Livt.Signal.Window

/**
 * Verifies standard coefficient tables, framing, arithmetic, and stalling.
 */
@Test
component WindowQ15Test
{
	const EIGHT_NEGATIVE_FULL_SCALE: int[8] = [-32768, -32768, -32768,
		-32768, -32768, -32768, -32768, -32768]
	const FOUR_POSITIVE_FULL_SCALE: int[4] = [32767, 32767, 32767, 32767]
	const TEN_NEGATIVE_FULL_SCALE: int[10] = [-32768, -32768, -32768,
		-32768, -32768, -32768, -32768, -32768, -32768, -32768]
	const CUSTOM_COEFFICIENTS: int[4] = [32767, 16384, 0, -16384]
	const FRAME_COEFFICIENTS: int[4] = [1000, 2000, 3000, 4000]

	hannIn: IQ15SampleStream
	hannOut: IQ15SampleStream
	hannSource: WindowQ15VectorSource<8>
	hann: HannWindowQ15<8>
	hannObserver: WindowQ15VectorObserver

	periodicHannIn: IQ15SampleStream
	periodicHannOut: IQ15SampleStream
	periodicHannSource: WindowQ15VectorSource<8>
	periodicHann: PeriodicHannWindowQ15<8>
	periodicHannObserver: WindowQ15VectorObserver

	hammingIn: IQ15SampleStream
	hammingOut: IQ15SampleStream
	hammingSource: WindowQ15VectorSource<8>
	hamming: HammingWindowQ15<8>
	hammingObserver: WindowQ15VectorObserver

	periodicHammingIn: IQ15SampleStream
	periodicHammingOut: IQ15SampleStream
	periodicHammingSource: WindowQ15VectorSource<8>
	periodicHamming: PeriodicHammingWindowQ15<8>
	periodicHammingObserver: WindowQ15VectorObserver

	blackmanIn: IQ15SampleStream
	blackmanOut: IQ15SampleStream
	blackmanSource: WindowQ15VectorSource<8>
	blackman: BlackmanWindowQ15<8>
	blackmanObserver: WindowQ15VectorObserver

	periodicBlackmanIn: IQ15SampleStream
	periodicBlackmanOut: IQ15SampleStream
	periodicBlackmanSource: WindowQ15VectorSource<8>
	periodicBlackman: PeriodicBlackmanWindowQ15<8>
	periodicBlackmanObserver: WindowQ15VectorObserver

	customIn: IQ15SampleStream
	customOut: IQ15SampleStream
	customSource: WindowQ15VectorSource<4>
	custom: WindowQ15<4>
	customObserver: WindowQ15VectorObserver

	frameIn: IQ15SampleStream
	frameOut: IQ15SampleStream
	frameSource: WindowQ15VectorSource<10, 1>
	frameWindow: WindowQ15<4>
	frameObserver: WindowQ15VectorObserver

	stalledIn: IQ15SampleStream
	stalledOut: IQ15SampleStream
	stalledSource: WindowQ15VectorSource<8>
	stalledWindow: PeriodicHannWindowQ15<8>
	stalledObserver: WindowQ15VectorObserver

	new()
	{
		hannSource = new WindowQ15VectorSource<8>(hannIn, EIGHT_NEGATIVE_FULL_SCALE)
		hann = new HannWindowQ15<8>(hannIn, hannOut)
		hannObserver = new WindowQ15VectorObserver(hannOut)
		periodicHannSource = new WindowQ15VectorSource<8>(periodicHannIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		periodicHann = new PeriodicHannWindowQ15<8>(periodicHannIn,
			periodicHannOut)
		periodicHannObserver = new WindowQ15VectorObserver(periodicHannOut)
		hammingSource = new WindowQ15VectorSource<8>(hammingIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		hamming = new HammingWindowQ15<8>(hammingIn, hammingOut)
		hammingObserver = new WindowQ15VectorObserver(hammingOut)
		periodicHammingSource = new WindowQ15VectorSource<8>(periodicHammingIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		periodicHamming = new PeriodicHammingWindowQ15<8>(periodicHammingIn,
			periodicHammingOut)
		periodicHammingObserver = new WindowQ15VectorObserver(periodicHammingOut)
		blackmanSource = new WindowQ15VectorSource<8>(blackmanIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		blackman = new BlackmanWindowQ15<8>(blackmanIn, blackmanOut)
		blackmanObserver = new WindowQ15VectorObserver(blackmanOut)
		periodicBlackmanSource = new WindowQ15VectorSource<8>(periodicBlackmanIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		periodicBlackman = new PeriodicBlackmanWindowQ15<8>(periodicBlackmanIn,
			periodicBlackmanOut)
		periodicBlackmanObserver = new WindowQ15VectorObserver(periodicBlackmanOut)
		customSource = new WindowQ15VectorSource<4>(customIn,
			FOUR_POSITIVE_FULL_SCALE)
		custom = new WindowQ15<4>(customIn, customOut, CUSTOM_COEFFICIENTS)
		customObserver = new WindowQ15VectorObserver(customOut)
		frameSource = new WindowQ15VectorSource<10, 1>(frameIn,
			TEN_NEGATIVE_FULL_SCALE)
		frameWindow = new WindowQ15<4>(frameIn, frameOut, FRAME_COEFFICIENTS)
		frameObserver = new WindowQ15VectorObserver(frameOut)
		stalledSource = new WindowQ15VectorSource<8>(stalledIn,
			EIGHT_NEGATIVE_FULL_SCALE)
		stalledWindow = new PeriodicHannWindowQ15<8>(stalledIn, stalledOut)
		stalledObserver = new WindowQ15VectorObserver(stalledOut)
	}

	@Test
	fn MatchesGeneratedStandardTables()
	{
		hannObserver.ready = true
		periodicHannObserver.ready = true
		hammingObserver.ready = true
		periodicHammingObserver.ready = true
		blackmanObserver.ready = true
		periodicBlackmanObserver.ready = true
		Simulation.Wait(48)
		assert hannObserver.accepted == 8
		assert hannObserver.sample0 == 0
		assert hannObserver.sample1 == 0xE7E7
		assert hannObserver.sample2 == 0xB1C2
		assert hannObserver.sample3 == 0x8657
		assert hannObserver.sample4 == 0x8657
		assert hannObserver.sample5 == 0xB1C2
		assert hannObserver.sample6 == 0xE7E7
		assert hannObserver.sample7 == 0
		assert periodicHannObserver.sample0 == 0
		assert periodicHannObserver.sample1 == 0xED41
		assert periodicHannObserver.sample2 == 0xC000
		assert periodicHannObserver.sample3 == 0x92BF
		assert periodicHannObserver.sample4 == 0x8001
		assert periodicHannObserver.sample5 == 0x92BF
		assert periodicHannObserver.sample6 == 0xC000
		assert periodicHannObserver.sample7 == 0xED41
		assert hammingObserver.sample0 == 0xF5C3
		assert hammingObserver.sample1 == 0xDF97
		assert hammingObserver.sample2 == 0xADC7
		assert hammingObserver.sample3 == 0x85D5
		assert hammingObserver.sample4 == 0x85D5
		assert hammingObserver.sample5 == 0xADC7
		assert hammingObserver.sample6 == 0xDF97
		assert hammingObserver.sample7 == 0xF5C3
		assert periodicHammingObserver.sample0 == 0xF5C3
		assert periodicHammingObserver.sample1 == 0xE484
		assert periodicHammingObserver.sample2 == 0xBAE1
		assert periodicHammingObserver.sample3 == 0x913F
		assert periodicHammingObserver.sample4 == 0x8001
		assert periodicHammingObserver.sample5 == 0x913F
		assert periodicHammingObserver.sample6 == 0xBAE1
		assert periodicHammingObserver.sample7 == 0xE484
		assert blackmanObserver.sample0 == 0
		assert blackmanObserver.sample1 == 0xF46C
		assert blackmanObserver.sample2 == 0xC539
		assert blackmanObserver.sample3 == 0x8A32
		assert blackmanObserver.sample4 == 0x8A32
		assert blackmanObserver.sample5 == 0xC539
		assert blackmanObserver.sample6 == 0xF46C
		assert blackmanObserver.sample7 == 0
		assert periodicBlackmanObserver.sample0 == 0
		assert periodicBlackmanObserver.sample1 == 0xF77F
		assert periodicBlackmanObserver.sample2 == 0xD47B
		assert periodicBlackmanObserver.sample3 == 0x9CFC
		assert periodicBlackmanObserver.sample4 == 0x8001
		assert periodicBlackmanObserver.sample5 == 0x9CFC
		assert periodicBlackmanObserver.sample6 == 0xD47B
		assert periodicBlackmanObserver.sample7 == 0xF77F
		assert hannObserver.firstSeen
		assert hannObserver.lastSeen
	}

	@Test
	fn SupportsArbitrarySignedFixedWindows()
	{
		customObserver.ready = true
		Simulation.Wait(24)
		assert customObserver.accepted == 4
		assert customObserver.sample0 == 32766
		assert customObserver.sample1 == 16384
		assert customObserver.sample2 == 0
		assert customObserver.sample3 == 0xC000
	}

	@Test
	fn ResynchronizesAndWrapsFramePosition()
	{
		frameObserver.ready = true
		Simulation.Wait(48)
		assert frameObserver.accepted == 10
		assert frameObserver.sample0 == 0xFC18
		assert frameObserver.sample1 == 0xF830
		assert frameObserver.sample2 == 0xFC18
		assert frameObserver.sample3 == 0xFC18
		assert frameObserver.sample4 == 0xF830
		assert frameObserver.sample5 == 0xFC18
		assert frameObserver.sample6 == 0xF830
		assert frameObserver.sample7 == 0xF448
		assert frameObserver.sample8 == 0xF060
		assert frameObserver.sample9 == 0xFC18
		assert frameObserver.firstSeen
		assert frameObserver.lastSeen
	}

	@Test
	fn FreezesCoefficientPositionWhileStalled()
	{
		stalledObserver.ready = false
		Simulation.Wait(10)
		assert stalledObserver.valid
		assert stalledObserver.accepted == 0

		stalledObserver.ready = true
		Simulation.Wait(40)
		assert stalledSource.accepted == 8
		assert stalledObserver.accepted == 8
		assert stalledObserver.sample0 == 0
		assert stalledObserver.sample1 == 0xED41
		assert stalledObserver.sample2 == 0xC000
		assert stalledObserver.sample3 == 0x92BF
		assert stalledObserver.sample4 == 0x8001
		assert stalledObserver.sample5 == 0x92BF
		assert stalledObserver.sample6 == 0xC000
		assert stalledObserver.sample7 == 0xED41
	}
}