线性卷积与圆周卷积

1.圆周卷积(circular convolution)

圆周卷积,也叫循环卷积,两个长度为N的有限场序列 x(n) x ( n ) h(n) h ( n ) 的循环卷积定义为


即循环卷积相当于周期延拓后的序列 x˜(n) x ~ ( n ) h˜(n) h ~ ( n ) 做周期卷积后再取主值区间,若x(n)和h(n)的离散傅里叶变换为 X(K) X ( K ) H(K) H ( K ) ,则有


时域中的循环卷积对应于其离散傅里叶变换的乘积,循环卷积的结果y(n)长度为N
关于圆周卷积的计算,可以看另一篇的图解计算

2.线性卷积(linear convolution)

  通常所说的卷积就是指线性卷积,设x(n)、h(n)长度分别为M和N,则它们的线性卷积结果为


得到的y(n)长度为M+N-1,同样,根据卷积定理可以知道,时域卷积等于频域相乘

 

 

注意,现在只是频域DTFT相乘相等,而离散傅里叶变换相乘并不相等,DFT是在DTFT基础上再进行了频域采样,即对 ω ω 离散化。
  要让线性卷积的时域结果与频域相乘的逆变换相等,首先容易想到的就是对H( ω ω )和X( ω ω )做相同的频域采样,也就是对x(n)、h(n)做相同点数的DFT,即让两序列在时域做圆周卷积,那么现在问题是,做多少点数的DFT能让圆周卷积等于线性卷积呢?
  
  线性卷积最常见,直接套用公式计算,这里就不图解。
  
结论:利用循环卷积计算线性卷积的条件为循环卷积长度 LM+N1 L ⩾ M + N − 1
利用循环卷积计算线性卷积的具体步骤为:

  1. 将序列 x(n) x ( n ) h(n) h ( n ) 补零延长,使其长度 LN1=N+M1 L ⩾ N 1 = N + M − 1 ,若采用基-2 FFT,还应使 L L 为不小于 N1 N 1 的2的最小整数次幂;
  
  2. 做 x(n) x ( n ) h(n) h ( n ) 的长度为 L L 的FFT得到 X(k) X ( k ) H(k) H ( k ) ,并求它们的积 Y(k)=X(k)H(k) Y ( k ) = X ( k ) H ( k ) ;
  
  3. 求 Y(k) Y ( k ) 的iFFT并取前 N1 N 1 点,获得线性卷积的结果 y(n)=IFFT[Y(k)],0nN1 y ( n ) = I F F T [ Y ( k ) ] , 0 ⩽ n ⩽ N 1

  说的好像很简单的样子,那就用代码验证下
  

x1 = [1,7,8,9,5,4,6,3,2];
x2 = [5,8,9,6,3,4,8,2,1,7,5,6,7];
conv(x1,x2)
L = 21;
ifft(fft(x1,L).*fft(x2,L))

上面程序中x1的长度为9,x2的长度为13,用matlab的conv函数直接计算出时域线性卷积,然后我们再验证下频域相乘,改变L值使分别L=13、21、23看看,与conv的结果对比,可以验证,只有当L>=9+13时才会得到与conv一样的结果。

  那为什么要讲线性卷积转化为循环卷积呢,那是因为时域中的循环卷积对应于其离散傅里叶变换的乘积,在两个卷积项非常长且长度相差不大时,转换到频域利用FFT计算量会大大减小。
  当两个卷积项长度相差很大时,又该怎么办呢,这又引出了下一个问题,重叠相加法与重叠保留法

你可能感兴趣的:(数字信号处理)