【线性卷积的DFT算法--重叠相加法和重叠保留法】

线性卷积的DFT算法--重叠相加法和重叠保留法


前言

在复习数字信号处理课程中,有关线性卷积的DFT算法的重叠相加法和重叠保留法根据教材不甚理解,网络上未找到便于手算的例题讲解过程,故在学习之后两种方法分别用两个例题详细过程用于理解,写下此文章用于其他人查找和自己学习。


一、重叠相加法

步骤

1、将长序列 x [ n ] x[n] x[n] 拆分成多个短序列
x [ n ] = ∑ k x k [ n − k L ] x[n]=\sum_{k}x_k[n-kL] x[n]=kxk[nkL]
x k [ n ] x_k[n] xk[n]长度为 L , L ≪ N x L,L\ll N_x L,LNx
x k ( n ) = { x [ n + k L ] n = 0 , 1 , 2 , . . . , L − 1 0 其他 \begin{equation} x_k(n)=\left\{ \begin{aligned} &x[n+kL]\quad &n=0,1,2,...,L-1\\ &0\quad &其他\\ \end{aligned} \right . \nonumber \end{equation} xk(n)={x[n+kL]0n=0,1,2,...,L1其他
2、重叠相加
y [ n ] = ( ∑ k x k [ n − k L ] ) ⊗ h [ n ] = ∑ k x k [ n − k L ] ⊗ h [ n ] = ∑ k y k [ n − k L ] \begin{equation} \begin{split} y[n]&=(\sum_k x_k[n-kL])\otimes h[n]\\ &=\sum_k x_k[n-kL]\otimes h[n]\\ &=\sum_k y_k[n-kL] \end{split} \nonumber \end{equation} y[n]=(kxk[nkL])h[n]=kxk[nkL]h[n]=kyk[nkL]

例题

例:计算序列 x [ n ] x[n] x[n]与序列 h [ n ] h[n] h[n]的线性卷积和,其中
x [ n ] = { 1 , 2 , 3 , 2 , 1 , 0 , 1 , 2 , 2 , 1 , 1 , 1 } , h [ n ] = { 1 , 2 , 1 } x[n]=\left\{1,2,3,2,1,0,1,2,2,1,1,1 \right\},h[n]=\left\{ 1,2,1 \right\} x[n]={1,2,3,2,1,0,1,2,2,1,1,1},h[n]={1,2,1}

解:序列分解,用 x [ n ] x[n] x[n]做分解

% Matlab代码
x = [1 2 3 2 1 0 1 2 2 1 1 1];
h = [1 2 1];
x1=[1 2 3 2 0 0 0 0 0 0 0 0] ;
x2=[0 0 0 0 1 0 1 2 0 0 0 0];
x3=[0 0 0 0 0 0 0 0 2 1 1 1];
xh1 = conv(x1, h); % [1 4 8 10 7 2 0 0 0 0 0 0 0 0]
xh2 = conv(x2, h); % [0 0 0 0 1 2 2 4 5 2 0 0 0 0]
xh3 = conv(x3, h); % [0 0 0 0 0 0 0 0 2 5 5 4 3 1]
y=conv(x,h); % [1 4 8 10 8 4 2 4 7 7 5 4 3 1]

分别将分解出的序列与 h [ n ] h[n] h[n]作线性卷积,然后相加得到结果。

二、重叠保留法

步骤

1、将长序列 x [ n ] x[n] x[n]拆分成多个短序列
x [ n ] = ∑ k x k [ n − k L ] x[n]=\sum_k x_k[n-kL] x[n]=kxk[nkL]
x k [ n ] x_k[n] xk[n]长度为 L , L ≥ M , M 为 h [ n ] 的长度 L,L\ge M,M为h[n]的长度 LLM,Mh[n]的长度
x k ( n ) = { x [ n + k ( L − M + 1 ) ] n = 0 , 1 , 2 , . . . , L − 1 0 其他 \begin{equation} x_k(n)=\left\{ \begin{aligned} &x[n+k(L-M+1)]\quad &n=0,1,2,...,L-1\\ &0\quad &其他\\ \end{aligned} \right . \nonumber \end{equation} xk(n)={x[n+k(LM+1)]0n=0,1,2,...,L1其他
2、重叠保留圆周卷积 x k [ n ] L ◯ h [ n ] x_k[n] \normalsize{\textcircled{\scriptsize{L }}}\normalsize h[n] xk[n]Lh[n]的后 L − M + 1 L-M+1 LM+1点。原因是 L L L点序列与 M M M点序列圆周卷积后,前 M − 1 M-1 M1点发生了混叠。
w k [ n ] = x k [ n ] L ◯ h [ n ] w_k[n]=x_k[n] \normalsize{\textcircled{\scriptsize{L }}}\normalsize h[n] wk[n]=xk[n]Lh[n]
y [ n ] = ∑ k y k [ n − k L ] , y k [ n ] = { 0 n = 0 , 1 , 2 , . . . , L − 1 w k [ n ] M − 1 ≤ n ≤ L − 1 \begin{equation} y[n]=\sum_k y_k[n-kL],y_k[n]=\left\{ \begin{aligned} &0\quad &n=0,1,2,...,L-1\\ &w_k[n]\quad &M-1\le n\le L-1\\ \end{aligned} \right . \nonumber \end{equation} y[n]=kyk[nkL],yk[n]={0wk[n]n=0,1,2,...,L1M1nL1

例题

例:计算序列 x [ n ] x[n] x[n]与序列 h [ n ] h[n] h[n]的线性卷积和,其中
x [ n ] = { 1 , 2 , 3 , 2 , 1 , 0 , 1 , 2 , 2 , 1 , 1 , 1 } , h [ n ] = { 1 , 2 , 1 } x[n]=\left\{1,2,3,2,1,0,1,2,2,1,1,1 \right\},h[n]=\left\{ 1,2,1 \right\} x[n]={1,2,3,2,1,0,1,2,2,1,1,1},h[n]={1,2,1}

解:序列分解(以 x [ n ] x[n] x[n]为例)

% Matlab代码
x = [1 2 3 2 1 0 1 2 2 1 1 1];
h = [1 2 1]; H = fft(h,6);
x1=[0 0 1 2 3 2];
x2=[3 2 1 0 1 2];
x3=[1 2 2 1 1 1];
x4=[1 1 0 0 0 0];
X1=fft(x1,6); Y1=X1.*H;
X2=fft(x2,6); Y2=X2.*H;
X3=fft(x3,6); Y3=X3.*H;
X4=fft(x4,6); Y4=X4.*H;
y1=ifft(Y1,6);y2=ifft(Y2,6);
y3=ifft(Y3,6);y4=ifft(Y4,6);

即分解成 x 1 [ n ] = { 0 , 0 , 1 , 2 , 3 , 2 } , x 2 [ n ] = { 3 , 2 , 1 , 0 , 1 , 2 } , x 3 [ n ] = { 1 , 2 , 2 , 1 , 1 , 1 } , x 4 [ n ] = { 1 , 1 , 0 , 0 , 0 , 0 } x_1[n]=\left\{0,0,1,2,3,2 \right\},x_2[n]=\left\{3,2,1,0,1,2 \right\},x_3[n]=\left\{1,2,2,1,1,1 \right\},x_4[n]=\left\{1,1,0,0,0,0 \right\} x1[n]={0,0,1,2,3,2},x2[n]={3,2,1,0,1,2},x3[n]={1,2,2,1,1,1},x4[n]={1,1,0,0,0,0}
如此分解是因为选取 L = 6 ≥ M L=6\ge M L=6M,前 M − 1 M-1 M1即2点发生混叠,保留后4点,于是在初始选取时需要在前面补2个零,弥补混叠后丢失的值。
计算有
x 1 [ n ] 6 ◯ h [ n ] = { 7 , 2 , 1 , 4 , 8 , 10 } x 2 [ n ] 6 ◯ h [ n ] = { 8 , 10 , 8 , 4 , 2 , 4 } x 3 [ n ] 6 ◯ h [ n ] = { 4 , 5 , 7 , 7 , 5 , 4 } x 4 [ n ] 6 ◯ h [ n ] = { 1 , 3 , 3 , 1 , 0 , 0 } x_1[n] \normalsize{\textcircled{\scriptsize{6 }}}\normalsize h[n]=\left\{7,2,1,4,8,10 \right\}\\ x_2[n] \normalsize{\textcircled{\scriptsize{6 }}}\normalsize h[n]=\left\{8,10,8,4,2,4 \right\}\\ x_3[n] \normalsize{\textcircled{\scriptsize{6 }}}\normalsize h[n]=\left\{4,5,7,7,5,4 \right\}\\ x_4[n] \normalsize{\textcircled{\scriptsize{6 }}}\normalsize h[n]=\left\{1,3,3,1,0,0\right\} x1[n]6h[n]={7,2,1,4,8,10}x2[n]6h[n]={8,10,8,4,2,4}x3[n]6h[n]={4,5,7,7,5,4}x4[n]6h[n]={1,3,3,1,0,0}
于是每个结果保留后4位,得到最后结果
x [ n ] L ◯ h [ n ] = { 1 , 4 , 8 , 10 , 8 , 4 , 2 , 4 , 7 , 7 , 5 , 4 , 3 , 1 } x_[n] \normalsize{\textcircled{\scriptsize{L }}}\normalsize h[n]=\left\{1,4,8,10,8,4,2,4,7,7,5,4,3,1 \right\} x[n]Lh[n]={1,4,8,10,8,4,2,4,7,7,5,4,3,1}

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值