In signal processing, the overlap–add method is an efficient way to evaluate the discrete convolution of a very long signal x [ n ] {\displaystyle x[n]} with a finite impulse response (FIR) filter h [ n ] {\displaystyle h[n]} :
y [ n ] = x [ n ] ∗ h [ n ] ≜ ∑ m = − ∞ ∞ h [ m ] ⋅ x [ n − m ] = ∑ m = 1 M h [ m ] ⋅ x [ n − m ] , {\displaystyle y[n]=x[n]*h[n]\ \triangleq \ \sum _{m=-\infty }^{\infty }h[m]\cdot x[n-m]=\sum _{m=1}^{M}h[m]\cdot x[n-m],}
where h [ m ] = 0 {\displaystyle h[m]=0} for m {\displaystyle m} outside the region [ 1 , M ] . {\displaystyle [1,M].} This article uses common abstract notations, such as y ( t ) = x ( t ) ∗ h ( t ) , {\textstyle y(t)=x(t)*h(t),} or y ( t ) = H { x ( t ) } , {\textstyle y(t)={\mathcal {H}}\{x(t)\},} in which it is understood that the functions should be thought of in their totality, rather than at specific instants t {\textstyle t} (see Convolution#Notation).
The concept is to divide the problem into multiple convolutions of h [ n ] {\displaystyle h[n]} with short segments of x [ n ] {\displaystyle x[n]} :
where L {\displaystyle L} is an arbitrary segment length. Then:
and y [ n ] {\displaystyle y[n]} can be written as a sum of short convolutions:
where the linear convolution y k [ n ] ≜ x k [ n ] ∗ h [ n ] {\displaystyle y_{k}[n]\ \triangleq \ x_{k}[n]*h[n]\,} is zero outside the region [ 1 , L + M − 1 ] . {\displaystyle [1,L+M-1].} And for any parameter N ≥ L + M − 1 , {\displaystyle N\geq L+M-1,\,} it is equivalent to the N {\displaystyle N} -point circular convolution of x k [ n ] {\displaystyle x_{k}[n]\,} with h [ n ] {\displaystyle h[n]\,} in the region [ 1 , N ] . {\displaystyle [1,N].} The advantage is that the circular convolution can be computed more efficiently than linear convolution, according to the circular convolution theorem:
y k [ n ] = IDFT N ( DFT N ( x k [ n ] ) ⋅ DFT N ( h [ n ] ) ) , {\displaystyle y_{k}[n]\ =\ \scriptstyle {\text{IDFT}}_{N}\displaystyle (\ \scriptstyle {\text{DFT}}_{N}\displaystyle (x_{k}[n])\cdot \ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])\ ),}
where: