foxConvolverPartition

package
v0.0.0-...-2bc4062 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 23, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	PartitionedChunkSize        = 4096 // New samples per chunk (L)
	PartitionedFFTSize          = 8192 // FFT size = 2 × chunk size (N)
	PartitionedImpulseChunkSize = 4096 // Impulse partition size
	//PartitionedOverlapSize      = 4095 // M - 1 = samples to discard/overlap
	PartitionedOverlapSize = 4096 // M - 1 = samples to discard/overlap

)

Functions

func MaxGainFromFFT

func MaxGainFromFFT(impulse []float64) float64

MaxGainFromFFT - Calculate maximum gain in frequency domain Utility function for filter normalization

func NextPowerOf2

func NextPowerOf2(n int) int

func SetChunkSizeForSampleRate

func SetChunkSizeForSampleRate(sampleRate int)

Types

type PartitionedConvolver

type PartitionedConvolver struct {
	FilterImpulse []float64

	// Input buffering - accumulates until we have 2048 samples to process
	Buffer []float64

	MaxGain float64

	// Debug
	DebugOn     bool
	DebugFunc   func(string)
	WarningFunc func(string)
	// contains filtered or unexported fields
}

func NewPartitionedConvolver

func NewPartitionedConvolver(impulse []float64, sampleRate int) *PartitionedConvolver

func (*PartitionedConvolver) AmendFilterImpulse

func (pc *PartitionedConvolver) AmendFilterImpulse(impulse []float64)

func (*PartitionedConvolver) ConvolveChannel

func (pc *PartitionedConvolver) ConvolveChannel(inputSignalChannel, outputSignalChannel chan []float64)

ConvolveChannel - streaming convolution via channels Handles BOTH input and output buffering for proper gapless playback For GAPLESS: Does NOT flush at end - both buffers are saved for next track In ConvolveChannel:

func (*PartitionedConvolver) ConvolveFFT

func (pc *PartitionedConvolver) ConvolveFFT(signal []float64) []float64

func (*PartitionedConvolver) ConvolveOverlapSave

func (pc *PartitionedConvolver) ConvolveOverlapSave(signalBlock []float64) []float64

ConvolveOverlapSave processes signal blocks, accumulating input and producing output For GAPLESS: Does NOT process samples < PartitionedChunkSize - they remain in Buffer Returns variable-length output (0, 2048, 4096, etc.) based on how much input was processed

func (*PartitionedConvolver) DecodeState

func (pc *PartitionedConvolver) DecodeState(data []byte) error

func (*PartitionedConvolver) EncodeState

func (pc *PartitionedConvolver) EncodeState() ([]byte, error)

func (*PartitionedConvolver) GetInputBuffer

func (pc *PartitionedConvolver) GetInputBuffer() []float64

GetInputBuffer - Returns unprocessed input samples (for debugging/inspection) This is what gets saved for gapless continuation

func (*PartitionedConvolver) GetOutputBuffer

func (pc *PartitionedConvolver) GetOutputBuffer() []float64

GetOutputBuffer - Returns unsent output samples (for debugging/inspection) This is also saved for gapless continuation

func (*PartitionedConvolver) GetPaddedLength

func (pc *PartitionedConvolver) GetPaddedLength() int

func (*PartitionedConvolver) GetTail

func (pc *PartitionedConvolver) GetTail() []float64

GetTail - Returns the algorithm state (overlap tail) This is the 2047 samples used in overlap-save algorithm

func (*PartitionedConvolver) GobDecode

func (pc *PartitionedConvolver) GobDecode(data []byte) error

GobDecode - Restore state for gapless continuation When loading next track: 1. Restore algorithm state (continues convolution seamlessly) 2. Restore input Buffer (unprocessed samples from previous track) 3. Restore output Buffer (unsent samples from previous track) 4. New input appends to input Buffer, new output appends to output Buffer

func (*PartitionedConvolver) GobEncode

func (pc *PartitionedConvolver) GobEncode() ([]byte, error)

GobEncode - Save complete state for gapless playback Saves: 1. Algorithm state (previousChunkTail, audioFFTRing, ringPosition) 2. Unprocessed input (Buffer) - prepended to next track's input 3. Unsent output (outputBuffer) - prepended to next track's output

func (*PartitionedConvolver) InitForStreaming

func (pc *PartitionedConvolver) InitForStreaming()

func (*PartitionedConvolver) Reset

func (pc *PartitionedConvolver) Reset()

Reset - Clear all state (for fresh start, NOT for gapless)

func (*PartitionedConvolver) SetSignalBlockLength

func (pc *PartitionedConvolver) SetSignalBlockLength(signalBlockLength int)

func (*PartitionedConvolver) SetTail

func (pc *PartitionedConvolver) SetTail(tail []float64)

SetTail - Sets the algorithm state (overlap tail)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL