精华内容
下载资源
问答
  • 利用FFT计算并分析线性卷积与循环卷积
  • 信号处理--线性卷积与循环卷积

    千次阅读 2020-12-06 19:52:49
    一、线性卷积 线性卷积(linear convolution)是在时域描述线性系统输入和输出之间关系的一种运算。 1. 背景   对于线性时不变离散时间系统来说,若序列x(n)x(n)x(n)是系统的输入,h(n)h(n)h(n)是系统在单位脉冲...

    一、线性卷积

    线性卷积(linear convolution)是在时域描述线性系统输入和输出之间关系的一种运算。

    1. 应用背景

      对于线性时不变离散时间系统来说,若序列x(n)x(n)是系统的输入,h(n)h(n)是系统在单位脉冲作用下的单位脉冲响应,由于输入离散时间序列x(n)x(n)可表示为一系列脉冲的线性组合,根据线性系统的齐次性和可加性,x(n)x(n)作用于系统所引起的零状态响应y(n)y(n)就是序列x(n)x(n)h(n)h(n)的卷积和。

    2. 定义式

    y(n)=x(n)h(n)=k=x(k)h(nk)y(n)=x(n)*h(n)=\sum_{k=-∞}^{∞}x(k)h(n-k)

    上式在运算过程中存在序列的翻转、移位、相乘和相加,所以称为卷积和

    3. 计算方法

    3.1 定义式

    3.2 作图法

    • 步骤:

    (1)将序列x(n)x(n)h(n)h(n)的自变量用kk代换,然后将序列h(k)h(k)以纵坐标为轴线反转,成为h(k)h(-k)
    (2)序列h(k)h(-k)沿kk轴正方向平移nn个单位,成为h(nk)h(n-k)
    (3)求乘积x(k)h(nk)x(k)h(n-k)
    (4)按定义式求各乘积之和。

    3.3 列表法

    y(n)=x(n)h(n)=k=x(k)h(nk)y(n)=x(n)*h(n)=\sum_{k=-∞}^{∞}x(k)h(n-k)可见,求和符号内x(k)x(k)的序号kkh(nk)h(n-k)的序号nkn-k之和`恰好等于kk

    求卷积和
    沿斜线上各数值之和就是卷积和。


    二、循环卷积

    1. 序列的循环移位

    x(n)x(n)为有限长序列,长度为M,M≤N,则x(n)x(n)的循环移位定义为:
    y(n)=x((n+m))NRN(n)y(n)=x\big((n+m)\big)_N R_N(n)
    该式表明,将x(n)x(n)以N为周期进行周期延拓得到x~(n)=x((n))N\tilde{x}(n)=x\big((n)\big)_N,再将x~(n)\tilde{x}(n)左移m得到x~(n+m)=x((n+m))N\tilde{x}(n+m)=x\big((n+m)\big)_N,最后取x~(n+m)\tilde{x}(n+m)的主值序列则得到有限长序列x(n)x(n)的循环移位序列y(n)y(n)y(n)y(n)是长度为N的有限长序列。

    clear all;
    close all;
    clc;
    %%%%%%%%%%%%%%% x(n)及其循环移位过程 %%%%%%%%%%%%%
    M=24;
    xn=triang(6);
    n=-M/3:2*M/3-1;
    x=zeros(1,M);
    for l=1:6
        x(8+l)=xn(l);
    end
    subplot(4,2,1);
    stem(n,x,'.'); axis([-8,16,0,1]); title('(a) x(n)');
    b=[xn' 0 0];
    y8=[b,b,b];
    subplot(4,2,3);
    stem(n,y8,'.'); axis([-8,16,0,1]); title('(b) x((n))_8')
    y8=[y8 b];
    for l=1:M'
        ym(l)=y8(l+2);
    end
    subplot(4,2,5);
    stem(n,ym,'.'); axis([-8,16,0,1]); title('(c) x((n+2))_8');
    for l=9:16
        x(l)=ym(l);
    end
    subplot(4,2,7);
    stem(n,x,'.'); axis([-8,16,0,1]); xlabel('n'); title('(d) x((n+2))_8R_8(n)');
    

    在这里插入图片描述

    2. 循环卷积的定义

    设序列h(n)h(n)x(n)x(n)的长度分别为N和M,h(n)h(n)x(n)x(n)的L点循环卷积定义为:
    yc(n)=[m=0L1h(m)x((nm))L]RL(n)y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n)
    式中,L称为循环卷积区间长度,Lmax[N,M]L≥max[N,M]x((nm))Lx\big((n-m)\big)_L是以L为周期的周期信号,n和m的变化区间均是[0L1][0,L-1]
    因此直接计算该式比较麻烦,计算机中采用矩阵相乘或FFT的方法计算循环卷积。

    3. 用矩阵计算循环卷积的公式

      当n=0,1,2,,L1n=0,1,2,\cdots,L-1时,由x(n)x(n)形成的序列为{x(0),x(1),x(2),,x(L1)}\{x(0),x(1),x(2),\cdots,x(L-1)\}

      令n=0,m=0,1,2,,L1n=0,m=0,1,2,\cdots,L-1x((nm))Lx\big((n-m)\big)_L形成的序列为:
    {x((0))L,x((1))L,x((2))L,,x((L+1))L}={x(0),x(L1),x(L2),,x(1)}\begin{aligned} &\{x((0))_L,x((-1))_L,x((-2))_L,\cdots,x((-L+1))_L\}\\ &=\{x(0),x(L-1),x(L-2),\cdots,x(1)\} \end{aligned}
    与序列x(n)x(n)进行对比,相当于将第一个序列值x(0)x(0)保持不变,将后面的序列{x(1),x(2),,x(L1)}\{x(1),x(2),\cdots,x(L-1)\}反转180°再放到x(0)x(0)的后面。这样形成的序列称为x(n)x(n)循环倒相序列

      令n=1,m=0,1,2,,L1n=1,m=0,1,2,\cdots,L-1x((nm))Lx\big((n-m)\big)_L形成的序列为:
    {x((1))L,x((0))L,x((1))L,,x((L+2))L}={x(1),x(0),x(L1),,x(2)}\begin{aligned} &\{x((1))_L,x((0))_L,x((-1))_L,\cdots,x((-L+2))_L\}\\ &=\{x(1),x(0),x(L-1),\cdots,x(2)\} \end{aligned}
    观察上式等号右端序列,它相当于x(n)x(n)的循环倒相序列向右循环移一位,即向右移1位,移出区间[0L1][0,L-1]的序列值再从左边移进。

    依次类推,当 n 和 m 均从 0 变化到 L-1 时,得到一个关于x((nm))Lx((n-m))_L的矩阵:
    [x(0)x(L1)x(L2)x(1)x(1)x(0)x(L1)x(2)x(2)x(1)x(0)x(3)x(L1)x(L2)x(L3)x(0)]\begin{bmatrix} x(0) & x(L-1) & x(L-2)& \cdots& x(1)\\ x(1)& x(0) & x(L-1) & \cdots & x(2)\\ x(2)&x(1)& x(0) & \cdots & x(3)\\ \vdots& \vdots &\vdots &\vdots& \vdots \\ x(L-1)&x(L-2)& x(L-3)& \cdots & x(0)\\ \end{bmatrix}
    上面矩阵称为x(n)的L点“循环卷积矩阵”,其特点是:

    1. 第一行是序列{x(0),x(1),x(2),,x(L1)}\{x(0),x(1),x(2),\cdots,x(L-1)\}的循环倒相序列。注意,如果x(n)x(n)的长度M<L,则需要在x(n)x(n)末尾补 L-M 个零后,再形成第一行的循环倒相序列;
    2. 第一行以后的各行均是前一行向右循环移1位形成的;
    3. 矩阵的各主对角线上的序列值均相等。

    有了循环卷积矩阵,就可以写出计算循环卷积的矩阵形式:

    [yc(0)yc(1)yc(2)yc(L1)]=[x(0)x(L1)x(L2)x(1)x(1)x(0)x(L1)x(2)x(2)x(1)x(0)x(3)x(L1)x(L2)x(L3)x(0)][h(0)h(1)h(2)h(L1)]\begin{bmatrix} y_c(0)\\ y_c(1)\\ y_c(2)\\ \vdots\\ y_c(L-1)\\ \end{bmatrix} =\begin{bmatrix} x(0) & x(L-1) & x(L-2)& \cdots& x(1)\\ x(1)& x(0) & x(L-1) & \cdots & x(2)\\ x(2)&x(1)& x(0) & \cdots & x(3)\\ \vdots& \vdots &\vdots &\vdots& \vdots \\ x(L-1)&x(L-2)& x(L-3)& \cdots & x(0)\\ \end{bmatrix} \begin{bmatrix} h(0)\\ h(1)\\ h(2)\\ \vdots\\ h(L-1)\\ \end{bmatrix}

    上式中如果h(n)h(n)的长度N<L,则需要在h(n)h(n)末尾补上 L-N 个零。

    三、线性卷积和循环卷积之间的关系

    • 假设h(n)h(n)x(n)x(n)都是有限长序列,长度分别为N和M。它们的线性卷积和循环卷积分别表示为:
      yl(n)=h(n)x(n)=m=0N1h(m)x(nm)y_l(n)=h(n)*x(n)=\sum_{m=0}^{N-1}h(m)x(n-m)
      yc(n)=[m=0L1h(m)x((nm))L]RL(n)y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n)
      其中,Lmax[N,M]L≥max[N,M]x((n))L=i=x(n+iL)x((n))_L=\sum_{i=-∞}^{∞}x(n+iL)
      所以yc(n)=[m=0N1h(m)i=x(nm+iL)]RL(n)=[i=m=0N1h(m)x(n+iLm)]RL(n)\begin{aligned} y_c(n)&=\Big[\sum_{m=0}^{N-1}h(m)\sum_{i=-∞}^{∞}x(n-m+iL)\Big]R_L(n)\\ &=\Big[\sum_{i=-∞}^{∞}\sum_{m=0}^{N-1}h(m)x(n+iL-m)\Big]R_L(n) \end{aligned}
      yl(n)y_l(n)式对照可以看出
      m=0N1h(m)x(n+iLm)=yl(n+iL)\sum_{m=0}^{N-1}h(m)x(n+iL-m)=y_l(n+iL)
      yc(n)=[i=yl(n+iL)]RL(n)y_c(n)=\Big[\sum_{i=-∞}^{∞}y_l(n+iL)\Big]R_L(n)
      也就是说,yc(n)y_c(n)等于yl(n)y_l(n)以L为周期的周期延拓序列的主值序列。

    • 线性卷积与循环卷积相等的条件

    • yl(n)y_l(n)的长度为N+M-1,因此只有当循环卷积长度L≥N+M-1时,yl(n)y_l(n)以L为周期进行周期延拓时才无时域混叠现象,此时取其主值序列显然满足 yc(n)=yl(n)y_c(n)=y_l(n)

    • 由此说明了循环卷积等于线性卷积的条件是L≥N+M-1

    clear all;
    close all;
    clc;
    %%%%%%%%%%%%%%% 验证线性卷积与循环卷积直接的关系 %%%%%%%%%%%%%
    xn=ones(1,5);                 % 设置x(n)=R5(n)
    hn=ones(1,4);                 % 设置h(n)=R4(n)
    Lx=length(xn);
    Lh=length(hn);
    
    nh=0:Lh-1;                  
    subplot(3,2,1); 
    stem(nh,hn,'.'); axis([0,10,0,1.5]);ylabel('h(n)');xlabel('n');title('(a) h(n)波形');
    
    nx=0:Lx-1;
    subplot(3,2,3);
    stem(nx,xn,'.');axis([0,10,0,1.5]);ylabel('x(n)');xlabel('n');title('(b) x(n)波形');
    % 调用conv计算线性卷积
    yn=conv(hn,xn);
    L=length(yn);
    ny=0:L-1;
    subplot(3,2,5);
    stem(ny,yn,'.');axis([0,10,0,5]);ylabel('y_l(n)');xlabel('n');title('(c) y_l(n)=h(n)*x(n)');
    % 循环卷积等于线性卷积的条件:循环卷积区间长度L>=M+N-1
    % L=6,用DFT计算序列循环卷积
    L1=6;
    Xk=fft(xn,L1);                    % L1点FFT[x(n)]
    Hk=fft(hn,L1);                    % L1点FFT[h(n)]
    Yck=Xk.*Hk;                       % 频域相乘得Yc(k)
    ycln=ifft(Yck,L1);                % L1点IFFT得到6点循环卷积结果yc(n)
    nycl=0:L1-1;
    subplot(3,2,2);
    stem(nycl,ycln,'.');axis([0,10,0,5]);ylabel('y_c(n)');xlabel('n');title('(d) 6点循环卷积');
    %L=8,用DFT计算序列循环卷积=线性卷积
    L2=8;
    Xk=fft(xn,L2);                      % L2点FFT[x(n)]
    Hk=fft(hn,L2);                      % L2点FFT[h(n)]
    Yck=Xk.*Hk;                         % 频域相乘得Yc(k)
    yc2n=ifft(Yck,L2);                  % L2点IFFT得到8点循环卷积结果yc(n)
    nyc2=0:L2-1;
    subplot(3,2,4);
    stem(nyc2,yc2n,'.');axis([0,10,0,5]);ylabel('y_c(n)');xlabel('n');title('(e) 8点循环卷积');
    %L=10,用DFT计算序列线性卷积
    L3=10;
    Xk=fft(xn,L3);                      % L3点FFT[x(n)]
    Hk=fft(hn,L3);                      % L3点FFT[h(n)]
    Yck=Xk.*Hk;                         % 频域相乘得Yc(k)
    yc3n=ifft(Yck,L3);                  % L2点IFFT得到10点循环卷积结果yc(n)
    nyc3=0:L3-1;
    subplot(3,2,6);
    stem(nyc3,yc3n,'.');axis([0,10,0,5]);ylabel('y_c(n)');xlabel('n');title('(f) 10点循环卷积');
    

    在这里插入图片描述

    四、用DFT计算循环卷积

    h(n)h(n)x(n)x(n)的长度分别为N和M,其L点循环卷积为
    yc(n)=[m=0L1h(m)x((nm))L]RL(n)y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n)

    {H(k)=DFT[h(n)]LX(k)=DFT[x(n)]L0kL1Lmax[N,M]\begin{cases} H(k)=DFT[h(n)]_L\\ X(k)=DFT[x(n)]_L \end{cases}\qquad 0\leq k \leq L-1,L≥max[N,M]
    则由DFT的时域循环卷积定理有
    Yc(k)=DFT[yc(n)]L=H(k)X(k)0kL1Y_c(k)=DFT[y_c(n)]_L=H(k)X(k) \qquad 0\leq k \leq L-1
    由此可见,循环卷积既可以在时域直接计算,也可以按照下面的计算框图在频域计算。
    由于DFT有快速算法,当L很大时,在频域计算循环卷积的速度快得多,因而常用DFT(FFT)计算循环卷积。
    循环卷积
    DFT只能直接用来计算循环卷积,然而在实际应用中,为了分析时域离散线性时不变系统或者对序列进行滤波处理等,需要计算两个序列的线性卷积。与计算循环卷积一样,为了提高运算速度,也希望用DFT(FFT)计算线性卷积。

    五、用DFT计算线性卷积

    取L≥N+M-1,则可按照上述框图用DFT(FFT)计算线性卷积。

    六、MATLAB实现

    1. 利用MATLAB的conv()函数计算线性卷积

    % x1的长度N=5,x2的长度M=3,那么x1与x2线性卷积的输出序列长度L=N+M-1=7
    % 可以验证,输出结果与我们使用列表法得到的结果一致
    x1=[1,1,3,4,2];
    x2=[1,3,2];
    y=conv(x1,x2);
    

    线性卷积

    2. 利用矩阵相乘原理计算循环卷积

    function [y] = circle_convolution(x1,x2,L)
    % circle_convolution 函数用于计算两个有限长序列的L点循环卷积
    % x1: 长度为N的有限长序列
    % x2: 长度为M的有限长序列
    % L:  循环卷积的长度
    % y:  x1与x2的L点循环卷积结果,L≥max(N,M);
    
    %********** 构造L点循环卷积矩阵 **********%
    N=length(x1);
    M=length(x2);
    
    x_1=[x1 ,zeros(1,L-N)] ;
    x_2=[x2 ,zeros(1,L-M)] ;
    x=zeros(L,L);
    h=circshift ( fliplr (x_1) ,1);  % 得到x1(n)的循环倒相序列
    for i=0:L-1
        x(i+1,:)= circshift(h,i);    % x即为L点循环卷积矩阵
    end
    %********** 矩阵相乘计算循环卷积 **********%
    x_2=x_2';     % 将补零后的x2转置为列向量
    y=x*x_2;      % 矩阵相乘
    end
    
    % 调用circle_convolution函数计算循环卷积
    x1=[1,1,3,4,2];
    x2=[1,3,2];
    L=7;
    y=circle_convolution(x1,x2,L);
    

    结果
    当L=9时,结果为:
    在这里插入图片描述
    当L=5时,结果为:
    在这里插入图片描述
    这里也进一步验证了线性卷积和循环卷积的关系:
    (1) 当L<N+M-1时,循环卷积是线性卷积长度为L的混叠;
    (2) 当L=N+M-1时,循环卷积=线性卷积;
    (3) 当L>N+M-1时,循环卷积是线性卷积末尾补L-(N+M-1)个零;

    3. 调用fft()函数计算循环卷积与线性卷积

    % 5点DFT
    x1=[1,1,3,4,2];
    x2=[1,3,2];
    
    X1=fft(x1,5);
    X2=fft(x2,5);
    Y=X1.*X2;
    y=ifft(Y);
    

    5点循环卷积

    % 7点DFT
    x1=[1,1,3,4,2];
    x2=[1,3,2];
    
    X1=fft(x1,7);
    X2=fft(x2,7);
    Y=X1.*X2;
    y=ifft(Y);
    

    在这里插入图片描述

    % 9点DFT
    x1=[1,1,3,4,2];
    x2=[1,3,2];
    
    X1=fft(x1,9);
    X2=fft(x2,9);
    Y=X1.*X2;
    y=ifft(Y);
    

    在这里插入图片描述

    展开全文
  • 其实卷积可以说是DSP 数字信号处理的入门操作, 基本思路:我们想测试一个系统的性能,得到这个系统的传递函数,得到你信号的响应(response),说白了就是往系统里面扔信号,出来的东西是啥?我咋知道呢? 其实方法...

    前言

    其实卷积可以说是DSP 数字信号处理的入门操作,

    基本思路:我们想测试一个系统的性能,得到这个系统的传递函数,得到你信号的响应(response),说白了就是往系统里面扔信号,出来的东西是啥?我咋知道呢?

    其实方法就是我扔个小石子 投石问路即可。 这里的小石子,就是一个最简单的脉冲信号δ(n)\delta(n),我放进去看看效果,这个效果就是脉冲响应 h(n)h(n)
    那别的信号咋办?很简单,把你的源信号分解成一个个脉冲响应就行,这样,把所有的脉冲响应(线性)叠加起来就好了:)

    那么 这和卷积有什么关系?卷积就是一个计算公式,就好像长方形面积就是底乘高。我们想要得到输出信号y(n) 可以将源信号与脉冲响应h(n)卷积:
    y(n)=x(n)h(n)=Σx(m)h(nm)y(n)=x(n)*h(n)=\Sigma x(m)h(n-m)

    题目

    在这里插入图片描述

    循环偏移函数cirshiftd

    %x 输入序列
    %m 偏移值
    %N 循环长度
    %y 输出循环序列
    
    function y=cirshiftd(x,m,N)
    if length(x)>N
        error('x > N');
    end
    x=[x,zeros(1,N-length(x))];
    n=[0:1:N-1];
    
    y=x(mod(n-m,N)+1);
    

    循环卷积函数circonv

    function yc=circonv(x1,x2,N)
    
    % 非法输入控制
    if length(x1)>N
        error('N < x1');
    end
    if length(x2)>N
        error('N < x2');
    end
    
    x1 = [x1,zeros(1,N-length(x1))];
    x2 = [x2,zeros(1,N-length(x2))];
    
    n=[0:1:N-1];
    x2=x2(mod(-n,N)+1);
    H=zeros(N,N);
    
    for n=1:1:N
        H(n,:)=cirshiftd(x2,n-1,N);
    end
    
    yc=x1*H';
    

    总程序 运用循环卷积函数

    % 输入序列
    Xn=[1,2,3,4,5];
    Hn=[1,2,1,2];
    
    % 调用线性卷积、循环卷积的计算函数 进行多点循环卷积的运算
    Yline=conv(Xn,Hn);
    Yc5=circonv(Xn,Hn,5);
    Yc6=circonv(Xn,Hn,6);
    Yc9=circonv(Xn,Hn,9);
    Yc10=circonv(Xn,Hn,10);
    
    % 计算出横坐标序列长度 以便作图
    Nyline=[0:1:length(Yline)-1];
    Ny5=[0:1:length(Yc5)-1];
    Ny6=[0:1:length(Yc6)-1];
    Ny9=[0:1:length(Yc9)-1];
    Ny10=[0:1:length(Yc10)-1];
    
    % 将5张图放置于同一版面
    
    % 线性卷积
    subplot(5,1,1);
    stem(Nyline,Yline,'r*');
    axis([0,9,0,25]);
    title('Linear convolution');
    % 5点循环卷积
    subplot(5,1,2);
    stem(Ny5,Yc5,'r*');
    axis([0,9,0,25]);
    title('Circular convolution with N=5');
    % 6点循环卷积
    subplot(5,1,3);
    stem(Ny6,Yc6,'r*');
    axis([0,9,0,25]);
    title('Circular convolution with N=6');
    % 9点循环卷积
    subplot(5,1,4);
    stem(Ny9,Yc9,'r*');
    axis([0,9,0,25]);
    title('Circular convolution with N=9');
    % 10点循环卷积
    subplot(5,1,5);
    stem(Ny10,Yc10,'r*');
    axis([0,9,0,25]);
    title('Circular convolution with N=10');
    

    运行结果

    在这里插入图片描述
    工作区情况
    在这里插入图片描述

    展开全文
  • 线性卷积循环卷积与FFT

    千次阅读 2020-06-15 19:05:20
    [话题讨论] [原创]一个开始:线性卷积与循环卷积 自己的理解, 最后,附上部分测试代码, clc;clear all;close all; x = [2 1 2 1]; y = [1 2 3]; xpad = [x zeros(1,6-length(x))]; ypad = [y zeros(1,6-length(y)...

    彼此的关系

    关于线性卷积、循环卷积和FFT之间的关系,MATLAB的帮助文档写的非常清晰,如下所示,
    在这里插入图片描述
    此外,链接[话题讨论] [原创]一个开始:线性卷积与循环卷积 自己的理解也提出了一种理解思路,
    在这里插入图片描述

    循环卷积的计算

    在这里插入图片描述
    附上部分测试代码,

    clc;clear all;close all;
    x     = [2 1 2 1];
    y     = [1 2 3];
    xpad  = [x zeros(1,6-length(x))];
    ypad  = [y zeros(1,6-length(y))];
    ccirc = ifft(fft(xpad).*fft(ypad))
    clin  = conv(x,y)
    

    MATLAB提供了函数cconv来计算循环卷积,下面

    clc;clear all;close all;
    %----------------------------------------------------------
    %比较循环卷积的直接实现与cconv函数的处理结果
    a   = [1 2 3 4 5];
    b   = [1 1];
    N   = 4;
    c   = conv(a,b);
    if N<length(c)
        zeropadding = N-mod(length(c),N);
        d = [c zeros(1,zeropadding)];
        e = reshape(d,N,length(d)/N);
        f = sum(e,2)'
    else
        f = c
    end
    g = cconv(a,b,N)
    
    %----------------------------------------------------------
    %cconv函数的循环卷积计算结果(指定长度)、默认计算结果、线性卷积计算结果
    a = [2 1 2 1];
    b = [1 2 3 4];
    c = cconv(a,b,4)
    d = cconv(a,b)
    e = conv(a,b)
    
    %----------------------------------------------------------
    %cconv函数的循环卷积计算结果(指定长度)、线性卷积计算结果
    a = [1 2 -1 1];
    b = [1 1 2 1 2 2 1 1];
    c = cconv(a,b,length(a)+length(b)-1)
    d = conv(a,b)
    
    %----------------------------------------------------------
    %互相关处理
    a = [1 2 2 1]+1i;
    b = [1 3 4 1]-2*1i;
    c = cconv(a,conj(fliplr(b)),length(a)+length(b)-1)
    d = conv(a,conj(fliplr(b)))
    e = xcorr(a,b)
    
    
    展开全文
  • 线性卷积与循环卷积 在音频信号处理中,卷积是很常见的信号处理方式,例如fir滤波器,卷积的计算公式也非常简单,对于系统h和输入信号x,卷积的计算公式如下:

    线性卷积与循环卷积

    在音频信号处理中,卷积是很常见的信号处理方式,例如fir滤波器,卷积的计算公式也非常简单,对于系统h和输入信号x,卷积的计算公式如下:

    y(t)=m=0N1x(tm)h(m)y(t)=\sum\limits_{m=0}^{N-1}x(t-m)h(m)

    这种普通的卷积也称为线性卷积,一个长为L的信号x和长为M的系统h进行卷积,相当于在x的前后做M-1个点的padding,然后再与h进行卷积运算,结果的长度为L+M+1

    y(t)=[m=0N1x(tm)h(m)]RN(t)y(t) = [\sum\limits_{m=0}^{N-1}x(t-m)h(m)]R_N(t)
    而一个N点循环卷积相当于将x和h做周期为N的延拓后进行卷积,然后再取其主值区间,得到的结果长度为N
    我们定义x=[1,2,3,4]x=[1,2,3,4]h=[5,6,7,8]h=[5,6,7,8],下面用一张示意图来表示线性卷积和圆周卷积的计算方式:
    在这里插入图片描述

    总结下来就是:
    线性卷积:将x补零,反褶,然后滑动,与对应位置的h相乘求和
    循环卷积:将x和h补零至N点,x逆时针平均分布在大圆上,h顺时针分布在小圆上,然后顺时针旋转大圆,与对应位置的h相乘求和
    我们可以将卷积中每一步的滑动变换为矩阵乘法并行的进行卷积运算,对于循环卷积,将其变换为矩阵后是一个循环矩阵,我们利用python代码来求线性卷积和循环卷积:

    import numpy as np
    from scipy.linalg import toeplitz
    
    def circular_convolve(x,h,N):
        c = np.pad(x,[0,N-len(x)],mode='constant')
        r = np.roll(c[::-1],1)
        x_c = toeplitz(c,r)
        h_c = np.pad(h,[0,N-len(h)],mode='constant')
        return np.dot(x_c,h_c)
        
    def convolve(x,h):
        L = len(x)
        M = len(h)
        N = L+M-1
        x_p = np.pad(x,[M-1,M-1],mode='constant')
        index = np.arange(M)[::-1][None, :] + np.arange(N)[:, None]
        return np.dot(x_p[index],h)
    
    
    x = [5,6,7,8]
    h = [1,2,3,4]
    L=4
    
    print('线性卷积结果为:')
    print(convolve(x,h))
    print('循环卷积结果为:')
    print(circular_convolve(x,h,L))
    

    输出为:

    线性卷积结果为:
    [ 5 16 34 60 61 52 32]
    循环卷积结果为:
    [66 68 66 60]
    

    卷积与FFT

    虽然卷积的计算方法很简单,但是当x和h都很长的时候,卷积计算是非常耗费时间的。直接卷积运算的复杂度为O[N2]\mathcal{O}[N^2],因此有必要找到比直接计算卷积更快的办法。
    相信大家都知道时域的卷积等于频域的乘积这个定理,因此要计算时域的卷积,可以将时域信号转换为频域信号,进行乘积运算之后再将结果转换为时域信号,实现快速卷积。
    在我之前的文章使用python实现基-2FFT、基-4FFT快速傅里叶变换算法中分析到,经过优化的FFT其运算的复杂度为O[NlogN]\mathcal{O}[NlogN],显然通过FFT计算卷积要比直接计算快速得多。
    不过由于FFT运算假设其所计算的信号为周期信号,因此通过FFT计算出的结果实际上是两个信号的循环卷积,而不是线性卷积。
    使用numpy的fft来计算卷积:

    import numpy as np
    
    x = [5,6,7,8]
    h = [1,2,3,4]
    
    X = np.fft.rfft(x)
    H = np.fft.rfft(h)
    y = np.fft.irfft(X*H)
    
    print('fft计算卷积结果为:')
    print(y)
    

    输出为:

    fft计算卷积结果为:
    [66. 68. 66. 60.]
    

    可以看到,将x和h变换到频域相乘,然后变换回时域的结果与循环卷积的结果一致。
    如果需要使用FFT计算线性卷积,就需要对信号进行补零扩展,使得其长度长于线性卷积结果的长度。
    对x和h进行补零,然后再进行fft:

    import numpy as np
    
    x = [5,6,7,8]
    h = [1,2,3,4]
    
    X = np.fft.rfft(x,n=7)
    H = np.fft.rfft(h,n=7)
    y = np.fft.irfft(X*H,n=7)
    
    print('fft计算卷积结果为:')
    print(y)
    

    输出为:

    fft计算卷积结果为:
    [ 5. 16. 34. 60. 61. 52. 32.]
    

    可以看到,结果与线性卷积结果一致

    展开全文
  • 线性卷积与循环卷积的比较 实验目的和要求 掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系。 实验内容和步骤 1) 已知两序列X(n) = ; h(n)=; 求两序列的线性...
  • 周期卷积 对象:用以建立周期序列DFS系数之间的桥梁。 定义式: 周期序列的周期卷积对应于之相应的傅里叶级数系数序列的乘积。 循环卷积 对象:用以建立有限长序列DFT系数之间的桥梁。...而且通过循环卷积...
  • 线性卷积、周期卷积和循环卷积

    千次阅读 2020-07-22 12:59:44
    线性卷积、周期卷积和循环卷积 例题:已知序列x1(n)=[0,2,2,1] (n=0,1,2,3); x2(n)=[1,2,-1,1] (n=0,1,2,3).求解 (1)计算线性卷积y1(n)=x1(n)✳x2(n); (2)计算周期卷积y2(n)=x1(n)⊛x2(n);(N=5) (3)计算循环卷积y3(n...
  • 线性卷积循环卷积的比较理解

    万次阅读 多人点赞 2016-11-24 19:25:43
  • 循环卷积与线性卷积

    千次阅读 2020-01-09 20:33:37
    循环卷积 针对的是两个长度都为N的序列,对两个序列做FFT,然后再做IFFT得到的结果就是循环卷积,结果的长度也是N。 直接计算步骤: 序列A序列B,长度都是N,新的序列C ...线性卷积 针对的是两个...
  • 数字信号处理循环卷积与线性卷积
  • 3、掌握线性卷积与循环卷积软件实现的方法,并验证二者之间的关系。 实验三目的: 1、通过这一实验,加深理解FFT在实现数字滤波(或快速卷积)中的重要作用,更 好的利用FFT进行数字信号处理。 2、进一步掌握循环卷积...
  • 用FFT实现线性卷积循环卷积,在matlab中还使用了conv、cconv函数FFT实现相比较
  • 线性卷积与圆周卷积

    千次阅读 2018-11-07 10:12:45
    https://blog.csdn.net/witnessai1/article/details/53324561 结合信号系统196-199页,理解用循环卷积线性卷积的方法
  • 题目用Matlab验证循环卷积线性卷积关系的软件设计仿真生物科学技术学院2013年级 专业生物医学工程答辩人蔡贝贝 导师王小东延时文字目录研究背景理论知识实验数据结论132延时符课题背景主要应用第一部分研究...
  • matlab实现线性卷积

    2013-03-01 17:20:54
    利用fft实现线性卷积。已知序列x1=[1 2 3 4],x2=[1 3 6 5 4 2];利用conv函数求x1和x2的线性卷积y(n)并绘出图形;...在用fft求x1与x2的8点和10点循环卷积,并绘出图形,比较四次结果,说明线性卷积与循环卷积的关系。
  • PAGE 用Matlab验证循环卷积线性卷积关系的软件设计 仿真 目 录 TOC \o "1-2" \h \z \t "标题 3,3" 摘 要 1 英文摘要 2 引 言 3 正 文 4 1 MATLAB平台概述 4 1.1 MATLAB软件简述 4 1.2 MATLAB举例应用 5 2 循环...
  • 重叠加法有助于确定线性卷积的值,脉冲响应或其他输入序列相比,包含大量输入序列。这是离散傅立叶变换的重要应用。这里,将大输入序列分成小框或part.circular 卷积是在另一个输入序列或脉冲响应和每个小盒子之间...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 171
精华内容 68
关键字:

线性卷积与循环卷积