Previous Up Next

19.2.4  Convolution of two signals or functions

The convolution of two real vectors v=[v1,…,vn] and w=[w1,…,wm] is the complex vector z=v∗ w (note the difference between ∗ and the cross-correlation operation ⋆, see Section 19.2.2) of length n+m−1 given by

  zk=
k
∑
i=0
vi wk−i,   k=0,1,…,N−1,

such that vj=0 for j≥ n and wj=0 for j≥ m.

The convolution of two real functions f(x) and g(x) is the integral

  ∫
+∞


−∞
f(t) g(x−t) dt.

The convolution command finds the convolution of two vectors or two functions.

Examples

To find the convolution of two lists [1,2,3] and [1,−1,1,−1], enter:

convolution([1,2,3],[1,-1,1,-1])
     
⎡
⎣
1.0,1.0,2.0,−2.0,1.0,−3.0⎤
⎦
          

Compute the convolution of f(x)=25 e2 x θ(x) and g(x)=x e−3 x θ(x), where θ is the Heaviside function:

convolution(25*exp(2x),x*exp(-3x))
     
⎛
⎝
−5 x e−3 x−e−3 x+e2 x⎞
⎠
θ⎛
⎝
x⎞
⎠
          

Compute the convolution of f(t)=ln(1+t) θ(t) and g(t)=1/√t.

convolution(ln(1+t),1/sqrt(t),t)
     
−
⎛
⎜
⎜
⎜
⎜
⎝
2 t ln⎛
⎜
⎜
⎜
⎜
⎝
⎪
⎪
⎪
2 √
t
−2 √
t+1
⎪
⎪
⎪
2 √
t
+2 √
t+1
⎞
⎟
⎟
⎟
⎟
⎠
+4 √
t
 √
t+1
+2 ln⎛
⎜
⎜
⎜
⎜
⎝
⎪
⎪
⎪
2 √
t
−2 √
t+1
⎪
⎪
⎪
2 √
t
+2 √
t+1
⎞
⎟
⎟
⎟
⎟
⎠
⎞
⎟
⎟
⎟
⎟
⎠
θ⎛
⎝
t⎞
⎠
√
t+1
          

In the following example convolution is used for reverberation. Assume that the directory sounds contains two files, a dry, mono recording of a guitar stored in guitar.wav and a two-channel impulse response recorded in a French 18th century salon and stored in salon-ir.wav.

Load the files:

clip:=readwav("/path/to/sounds/guitar.wav"):; ir:=readwav("/path/to/sounds/salon-ir.wav"):;

Then:

plotwav(clip)
plotwav(ir)

Convolving the data from clip with both channels in ir produces a reverberated variant of the recording, in stereo.

data:=channel_data(clip):; L:=convolution(data,channel_data(ir,left)):; R:=convolution(data,channel_data(ir,right)):;

The convolved signals L and R now become the left and right channel of a new audio clip, respectively. The normalize option is used because convolution usually results in a huge increase of sample values (which is clear from the definition).

spatial:=createwav([L,R],normalize=-3):; playsnd(spatial)

Output: a music that sounds as if it was recorded in the same salon as the impulse response. Moreover, it is a true stereo sound. To visualize it:

plotwav(spatial)

Note that the resulting audio is longer than the input (for the length of the impulse response).


Previous Up Next