Documentation
¶
Index ¶
- Variables
- func MaxGainFromFFT(impulse []float64) float64
- func NextPowerOf2(n int) int
- func SetChunkSizeForSampleRate(sampleRate int)
- type PartitionedConvolver
- func (pc *PartitionedConvolver) AmendFilterImpulse(impulse []float64)
- func (pc *PartitionedConvolver) ConvolveChannel(inputSignalChannel, outputSignalChannel chan []float64)
- func (pc *PartitionedConvolver) ConvolveFFT(signal []float64) []float64
- func (pc *PartitionedConvolver) ConvolveOverlapSave(signalBlock []float64) []float64
- func (pc *PartitionedConvolver) DecodeState(data []byte) error
- func (pc *PartitionedConvolver) EncodeState() ([]byte, error)
- func (pc *PartitionedConvolver) GetInputBuffer() []float64
- func (pc *PartitionedConvolver) GetOutputBuffer() []float64
- func (pc *PartitionedConvolver) GetPaddedLength() int
- func (pc *PartitionedConvolver) GetTail() []float64
- func (pc *PartitionedConvolver) GobDecode(data []byte) error
- func (pc *PartitionedConvolver) GobEncode() ([]byte, error)
- func (pc *PartitionedConvolver) InitForStreaming()
- func (pc *PartitionedConvolver) Reset()
- func (pc *PartitionedConvolver) SetSignalBlockLength(signalBlockLength int)
- func (pc *PartitionedConvolver) SetTail(tail []float64)
Constants ¶
This section is empty.
Variables ¶
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 ¶
MaxGainFromFFT - Calculate maximum gain in frequency domain Utility function for filter normalization
func NextPowerOf2 ¶
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)