Skip to content

tvconv

A time-varying convolution (FIR filter) opcode.

An opcode that takes two incoming signals and interprets one of them as the coefficients of linear time-variable finite impulse response filter. This is implemented via direct convolution (for partition sizes of 1 sample) or DFT-based partitioned convolution. The signals can be 'frozen' (i.e. the filter coefficients are kept the same) at any point in time, at a-rate or k-rate.

Syntax

ares = tvconv(asig1, asig2, xfreez1, xfreez2, iparts, ifils)
ares tvconv asig1, asig2, xfreez1, xfreez2, iparts, ifils

Initialization

iparts -- partition size, for sizes > 1, a DFT-based partitioned convolution process is used. Otherwise a time-domain delay line FIR is implemented. Partition sizes > 1 are rounded to the nearest power-of-two.

ifils -- filter size. For partition sizes > 1, filter sizes are rounded to the nearest power-of-two. With partition size = 1, since direct convolution is used, filters can be of any size.

Csound discards fractional parts first. If the partition size exceeds the filter size, it swaps the two sizes before choosing the method and rounding. When rounding either size to a power of two, ties round up.

Performance

ares -- audio output.

asig1, asig2 -- audio inputs.

xfreez1 -- freeze switch for asig1. Coefficients are only updated (ie. the signal is passing into the convolution) if xfreez1 > 0. This input can take an audio or a k-rate signal, or a constant.

xfreez2 -- freeze switch for asig2, similar to xfreez1 in operation.

DFT-based convolution adds a delay equal to its rounded partition size in samples. Divide this size by sr to get the delay in seconds. Direct convolution adds no processing delay. Delays from the filter coefficients apply in both cases.

Freezing stops updates to the stored samples. It does not stop convolution or mute the output. Initialization clears all stored samples and pending output.

Examples

Here is an example of the tvconv opcode. It uses the file tvconv.csd.

Example of the tvconv opcode.
<CsoundSynthesizer>
<CsOptions>
-odac 
</CsOptions>
<CsInstruments>
sr = 44100
ksmps = 32
nchnls = 2
0dbfs = 1

instr 1

 asig diskin "fox.wav",1,0,1
 air diskin "drumsMlp.wav",1,0,1
 air buthp air/0dbfs,1000
 k1 linseg 0,p3/3,0,0,1,2*p3/3,1
 a1 oscili k1, 0.5, 1
 a2 oscili k1, 0.6, 1
 asig tvconv asig,air,1-a2,1-a1,256,1024
 asig clip asig,1,0dbfs
 outs asig, asig

endin

</CsInstruments>
<CsScore>
f1 0 1024 7 0 512 0 1 1 511 1
i1 0 30
e
</CsScore>
</CsoundSynthesizer>

See also

Convolution and Morphing

Credits

Author: Victor Lazzarini
2017

New in version 6.09