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/WindowQ15Fixture.lvt

namespace Livt.Signal.Tests.Window

using Livt.Signal.Stream

/**
 * Emits a fixed vector; pattern one exercises frame recovery boundaries.
 */
component WindowQ15VectorSource<COUNT: int, PATTERN: int = 0>
{
	stream: IQ15SampleStream
	values: int[COUNT]
	index: int
	public accepted: int

	new(stream: flip IQ15SampleStream, values: const int[COUNT])
	{
		this.stream = stream
		this.values = values
	}

	process Send()
	{
		state Emit {
			stream.sample = values[index] as logic[16]
			stream.valid = true
			static if (PATTERN == 0) {
				stream.first = index == 0
				stream.last = index == COUNT - 1
			} else {
				stream.first = index == 0 || index == 3 || index == 5
				stream.last = index == 1
			}
			goto AwaitAccept
		}

		state AwaitAccept {
			if (stream.ready) {
				stream.valid = false
				accepted++

				if (index == COUNT - 1) {
					goto Idle
				} else {
					index++
					goto Gap
				}
			}
		}

		state Gap {
			stream.valid = false
			stream.first = false
			stream.last = false
			goto Emit
		}

		state Idle {
			stream.valid = false
			stream.first = false
			stream.last = false
			goto Idle
		}
	}
}

/**
 * Retains up to twelve accepted window results.
 */
component WindowQ15VectorObserver
{
	stream: IQ15SampleStream
	public ready: in bool
	public valid: out bool
	public accepted: int
	public firstSeen: bool
	public lastSeen: bool
	public sample0: logic[16]
	public sample1: logic[16]
	public sample2: logic[16]
	public sample3: logic[16]
	public sample4: logic[16]
	public sample5: logic[16]
	public sample6: logic[16]
	public sample7: logic[16]
	public sample8: logic[16]
	public sample9: logic[16]
	public sample10: logic[16]
	public sample11: logic[16]

	new(stream: IQ15SampleStream)
	{
		this.stream = stream
	}

	process Observe[]()
	{
		stream.ready = this.context.rst == 0b0 && ready
		valid = stream.valid
	}

	process Capture()
	{
		state {
			if (stream.valid && stream.ready) {
				if (accepted == 0) {
					sample0 = stream.sample
				} elif (accepted == 1) {
					sample1 = stream.sample
				} elif (accepted == 2) {
					sample2 = stream.sample
				} elif (accepted == 3) {
					sample3 = stream.sample
				} elif (accepted == 4) {
					sample4 = stream.sample
				} elif (accepted == 5) {
					sample5 = stream.sample
				} elif (accepted == 6) {
					sample6 = stream.sample
				} elif (accepted == 7) {
					sample7 = stream.sample
				} elif (accepted == 8) {
					sample8 = stream.sample
				} elif (accepted == 9) {
					sample9 = stream.sample
				} elif (accepted == 10) {
					sample10 = stream.sample
				} elif (accepted == 11) {
					sample11 = stream.sample
				}

				if (accepted == 0 && stream.first) {
					firstSeen = true
				}

				if (stream.last) {
					lastSeen = true
				}

				accepted++
			}
		}
	}
}