精华内容
下载资源
问答
  • Matlab:matlab实现循环卷积计算(矩阵法)
    万次阅读
    2018-05-17 16:54:00

    Matlab:matlab实现循环卷积计算(矩阵法)

     

     

    目录

    matlab实现循环卷积计算

    实现代码


     

     

    matlab实现循环卷积计算

    实现代码

    clear
    clc
    %输入基本变量x1,x2,L.
    a=input('x1=');
    b=input('x2=');
    L=input('L=');
    A=zeros(L,1);
    B=zeros(L,1);
    [a1m,a1n]=size(a);
    [b1m,b1n]=size(b);
    i=1;
    k=1;
    %定义最基础的x1,x2
    while(k==1)
        A(i,1)=a(1,i);
        i=i+1;
        if i>a1n
            k=0;
        end
    end
    i=1;
    k=1;
    while(k==1)
        B(i,1)=b(1,i);
        i=i+1;
        if i>b1n
            k=0;
        end
    end
    i=2;
    j=L;
    k=1;
    x=zeros(L,L);
    x(1,1)=A(1,1);
    %实现L点循环卷积矩阵的第一行
    while(k==1)
        x(1,i)=A(j,1);
        i=i+1;
        j=j-1;
        if(j==1)
            k=0;
        end
    end
    i=1;
    j=L;
    k=1;
    a=zeros(1,L);
    %实现x的L点循环卷积矩阵
    %将第一行以后的各行向右循环移一位
    while(k==1)
        c=x(i,:);
        a(1)=c(L);
        a(2:L)=c(1:L-1);
        x(i+1,:)=a;
        i=i+1;
        if i==L
            k=0;
        end
    end
    y=x*B;
    figure
    grid on
    
    
    stem(y)
    
    更多相关内容
  • 数字信号处理:循环卷积快速计算技巧

    万次阅读 多人点赞 2021-05-10 16:58:48
    法一:从一个例题出发来看循环卷积的过程,首先我们采用定义循环卷积的公式来求解。我们把公式的计算过程写成矩阵相乘会更加直观。先把要进行循环的序列x2写成矩阵形式(由于循环卷积不满足交换律,注意先后顺序),...

    法一:从一个例题出发来看循环卷积的过程,首先我们采用定义循环卷积的公式来求解。我们把公式的计算过程写成矩阵相乘会更加直观。先把要进行循环的序列x2写成矩阵形式(由于循环卷积不满足交换律,注意先后顺序),把x2以y轴为对称轴翻转,翻转后进行周期延拓。在矩阵的第一行记录下此时0-3点的值。第二行记录下右移1位之后0-3点的值。以此类推,写出整个矩阵,与x1向量相乘,即得结果。计算过程完全符合公式。

    法2:上面的方法计算起来速度不够快,我们可以通过一个简单的方法快速写出x2的矩阵。按列来观察,第一列是1234,第二列把4往前挪到首位,以此类推,写出整个矩阵。考虑8次循环卷积时,只需要注意补上0即可。

    法3:另一种方法是先算出对位相乘相加序列,然后根据循环区间修正结果。若循环区间为4,则把4之后的序列搬移到前面,两序列求和即得最终结果。

    另外,需要注意原始序列有平移的情况。

    展开全文
  • 1.循环卷积原理 2.循环卷积与线性卷积的联系 3.对位相加法计算循环卷积 4.Matlab 实操 4.1源代码 4.2

    目录

    1.循环卷积原理

    2.循环卷积与线性卷积的联系

    3.对位相加法计算循环卷积

    4.Matlab 实操

       4.1源代码

       4.2仿真结果

    循环卷积原理

    设x(n)和h(n)是两个长度分别为N和M的有限长序列,它们的L点循环卷积y(n)定义为:

    y_{c}(n)=x(n)\circledast h(n)=[\sum_{m=0}^{L-1}x\left ( m \right )\times h\left ( \left ( n-m \right ) \right )_{L}]\times R_{L}(n)(1)

    其中

    x((n))_{L}=\sum_{i=-\propto }^{+\propto }x(n+iL)(2) 

    所以h((n-m))L可以看做将序列h(n)以L为周期进行周期延拓得到周期序列h((n)L,再将h((n))L右移m位得到h((n-m))L,即:

    h((n-m))_{L}=\sum_{i=-\propto }^{+\propto }h(n+iL-m)(3)

    RL(n)为矩形窗函数。由公式(3)可进一步得到:

    y_{c}(n)=[\sum_{m=0}^{L-1}x(m)\sum_{i=-\propto }^{+\propto}h(n-m+iL)]R_{L}(n)=[\sum_{i=-\propto}^{+\propto}\sum_{m=0}^{L-1}x(m)h(n-m+iL)]R_{L}(n)](4)

     我们知道有限长线性卷积公式:

    y_{l}(n)=x(n)\ast h(n)=\sum_{m=0}^{L-1}x(m)h(n-m)(5)

    由此我们可以得知(4)式中:

    \sum_{m=0}^{L-1}x(m)h(n-m+iL)=y_{L}(n+iL)(6)

    进而得到:

    y_{c}(n)=[\sum_{i=-\propto }^{+\propto }y_{l}(n+iL)]R_{L}(n)(7)

    我们可以看出公式(7)是循环卷积另一种表示方式,而且它诠释了循环卷积与线性卷积的关系,即线性卷积以yl(n)以L为周期进行周期延拓得到周期序列后求和再乘以L点长度的矩形窗函数得到周期序列的主值序列(第一个周期的序列)。 

    循环卷积与线性卷积的联系

     根据第一部分的公式推导我们已经知道了循环卷积和线性卷积之间的联系,其实它们之间的关系可总结为以下三个要点:

    (1)当L<N+M-1,循环卷积是线性卷积长度为L 的时域混叠,一般要求L>=max(N,M),N+M-1是线性卷积结果新序列的长度。

    (2)当L=N+M-1,循环卷积就是线性卷积。

    (3)当L>N+M-1,循环卷积是线性卷积结果末尾补L-(N+M-1)个零。

     

    对位相加法计算循环卷积

    我们知道图解法是最为普遍的方法来求解线性卷积,当然它对循环卷积也依然适用,此处不予详细说明,本节我们介绍一种新的计算循环卷积的方法叫做对位相加法。基本原理可以概括为先依照对位相乘法计算出线性卷积,然后根据循环区间修正结果,若循环区间L为2,则把2之后的序列搬到前面,两序列相加求和即得最终结果。举个例子,依然使用序列x(n)=[1 2 3]和h(n)=[1 1 1 1],我们知道它的线性卷积结果为[1 3 6 6 5 3],下图介绍不同点数的循环卷积对位相加法如何操作:

    我们看到2点循环卷积的结果为[12 12],以4点为循环区间:

    依次类推,我们知道以6点为循环区间时截余线就在元素3之后,由此我们知道[1 3 6 6 5 3]就是循环卷积的结果,以8点为循环区间:

    我们可以看到此时只有N位保留序列,并无截余序列。此时需要在N位线性卷积序列后补上L-N个零。 上述结果都可以在Matlab里面使用cconv函数验证正确性。

    Matlab 实操

    源代码

    %% =========================================================================================================
    % 程序说明:本程序在依照对位相乘法而自定义线性卷积函数的基础上依据循环卷积的原理和对位相加法自定义循环卷积函数,替代Matlab自带cconv函数和y=ifft(fft(x).*fft(h)),供大家参考
    % 程序名称:Cicular Convolution 循环或圆周卷积
    % 作者: hill5678
    % 当前版本:1.0
    %% =========================================================================================================
    clear all;
    close all;
    clc;
    %% ==================================================主函数部分==============================================
    X=input('enter a arbitrary discrete-time sequence here:');
    H=input('enter a arbitrary discrete-time sequence here:');
    L=input('enter the desired circular convolution data points here:');
    Y=circular_convolution(X,H,L);
    display(Y);
    %% ================================================定义循环卷积函数============================================
    function y=circular_convolution(x,h,L)
    %L为计算循环卷积的数据点数或者为输出序列的长度
    n=length(x);m=length(h);% 输入离散时间序列的长度
    y1=[];y2=[];y3=[];y4=[];y5=[];y6=[];y7=[];y8=[];y9=[];
    a=m;
    N=n+m-1;% 卷积后新序列的长度
    b=N;
    M=N-n;% 矩阵形成并移位后每行需要补零的个数
    for i1=0:a-2
        for i=0:m-1
            for k=0:n-1
                y1(i+1,k+1)=h(i+1)*x(k+1);% 按照对位相乘法将两个序列左端对齐,依次对位相乘
            end
            y2=y1;% 将结果矩阵赋给y2
        end
        y3=[y2,zeros(m,M)];%将y2后面加入零矩阵
        y4=circshift(y3(i1+2,:),i1+1,2);% 循环移位函数,将y4从第二行开始向右按行移位。第二行移一位,第三行移两位,按此规律依次类推
        y5=[y5;y4];
    end
    y6=[y3(1,:);y5];% y3的第一行不变
    y7=sum(y6);% 将矩阵y6按列相加得到卷积结果
    disp(y7);
    figure(1)
    stem(y7,'fill')
    title('linear convolution result:sequence y7(n)');
    grid on;
    %%此处开始定义循环卷积函数
    y10=[];y11=[];y=[];
    J=ceil(N/L);%对位相加后所形成矩阵的行数
    for i2=L:L:(J-1)*L%矩阵从第2行开始基于第一行元素即线性卷积结果一共做(J-1)*L次向左循环移位
        z=zeros(1,i2);
        y8=circshift(y7,-(i2),2);
        y8(N-i2+1:N)=z;
        y9=[y9;y8];
    end
    y10=[y7(1,:);y9];
    for i3=0:L-1
    %%当L<N,循环卷积是线性卷积长度为L的时域混叠;当L=N,循环卷积就是线性卷积;当L>N,循环卷积是线性卷积末尾补上L-N个零
    if L<N 
        y11=[y11,sum(y10(:,i3+1))];
        y=y11;
    elseif L==N
        y=y7;
    else 
        y=[y7,zeros(1,L-N)];
    end
    end
    disp(y)
    figure(2)
    stem(y,'fill')
    title('circular convolution result:sequence y(n)');
    grid on;
    end

     此代码前一段还是产生线性卷积结果,故在仿真结果里面不再显示。

    仿真结果

     使用序列x=[1 2 3]和h=[1 1 1 1],求4点循环卷积,Matlab命令窗口:

     

    Matlab仿真图:



    参考文献  

    数字信号处理:循环卷积快速计算技巧

     

     

     

     

    展开全文
  • 信号处理--线性卷积与循环卷积

    万次阅读 多人点赞 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) x(n)是系统的输入, h ( n ) h(n) h(n)是系统在单位脉冲作用下的单位脉冲响应,由于输入离散时间序列 x ( n ) x(n) x(n)可表示为一系列脉冲的线性组合,根据线性系统的齐次性和可加性, x ( n ) x(n) x(n)作用于系统所引起的零状态响应 y ( n ) y(n) y(n)就是序列 x ( n ) x(n) x(n) h ( n ) h(n) h(n)的卷积和。

    2. 定义式

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

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

    3. 计算方法

    3.1 定义式

    3.2 作图法

    • 步骤:

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

    3.3 列表法

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

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


    二、循环卷积

    1. 序列的循环移位

    x ( n ) x(n) x(n)为有限长序列,长度为M,M≤N,则 x ( n ) x(n) x(n)的循环移位定义为:
    y ( n ) = x ( ( n + m ) ) N R N ( n ) y(n)=x\big((n+m)\big)_N R_N(n) y(n)=x((n+m))NRN(n)
    该式表明,将 x ( n ) x(n) x(n)以N为周期进行周期延拓得到 x ~ ( n ) = x ( ( n ) ) N \tilde{x}(n)=x\big((n)\big)_N x~(n)=x((n))N,再将 x ~ ( n ) \tilde{x}(n) x~(n)左移m得到 x ~ ( n + m ) = x ( ( n + m ) ) N \tilde{x}(n+m)=x\big((n+m)\big)_N x~(n+m)=x((n+m))N,最后取 x ~ ( n + m ) \tilde{x}(n+m) x~(n+m)的主值序列则得到有限长序列 x ( n ) x(n) x(n)的循环移位序列 y ( n ) y(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) h(n) x ( n ) x(n) x(n)的长度分别为N和M, h ( n ) h(n) h(n) x ( n ) x(n) x(n)的L点循环卷积定义为:
    y c ( n ) = [ ∑ m = 0 L − 1 h ( m ) x ( ( n − m ) ) L ] R L ( n ) y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n) yc(n)=[m=0L1h(m)x((nm))L]RL(n)
    式中,L称为循环卷积区间长度, L ≥ m a x [ N , M ] L≥max[N,M] Lmax[N,M] x ( ( n − m ) ) L x\big((n-m)\big)_L x((nm))L是以L为周期的周期信号,n和m的变化区间均是 [ 0 , L − 1 ] [0,L-1] [0L1]
    因此直接计算该式比较麻烦,计算机中采用矩阵相乘或FFT的方法计算循环卷积。

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

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

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

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

    依次类推,当 n 和 m 均从 0 变化到 L-1 时,得到一个关于 x ( ( n − m ) ) L x((n-m))_L x((nm))L的矩阵:
    [ x ( 0 ) x ( L − 1 ) x ( L − 2 ) ⋯ x ( 1 ) x ( 1 ) x ( 0 ) x ( L − 1 ) ⋯ x ( 2 ) x ( 2 ) x ( 1 ) x ( 0 ) ⋯ x ( 3 ) ⋮ ⋮ ⋮ ⋮ ⋮ x ( L − 1 ) x ( L − 2 ) x ( L − 3 ) ⋯ 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(0)x(1)x(2)x(L1)x(L1)x(0)x(1)x(L2)x(L2)x(L1)x(0)x(L3)x(1)x(2)x(3)x(0)
    上面矩阵称为x(n)的L点“循环卷积矩阵”,其特点是:

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

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

    [ y c ( 0 ) y c ( 1 ) y c ( 2 ) ⋮ y c ( L − 1 ) ] = [ x ( 0 ) x ( L − 1 ) x ( L − 2 ) ⋯ x ( 1 ) x ( 1 ) x ( 0 ) x ( L − 1 ) ⋯ x ( 2 ) x ( 2 ) x ( 1 ) x ( 0 ) ⋯ x ( 3 ) ⋮ ⋮ ⋮ ⋮ ⋮ x ( L − 1 ) x ( L − 2 ) x ( L − 3 ) ⋯ x ( 0 ) ] [ h ( 0 ) h ( 1 ) h ( 2 ) ⋮ h ( L − 1 ) ] \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} yc(0)yc(1)yc(2)yc(L1)=x(0)x(1)x(2)x(L1)x(L1)x(0)x(1)x(L2)x(L2)x(L1)x(0)x(L3)x(1)x(2)x(3)x(0)h(0)h(1)h(2)h(L1)

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

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

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

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

    • y l ( n ) y_l(n) yl(n)的长度为N+M-1,因此只有当循环卷积长度L≥N+M-1时, y l ( n ) y_l(n) yl(n)以L为周期进行周期延拓时才无时域混叠现象,此时取其主值序列显然满足 y c ( n ) = y l ( n ) y_c(n)=y_l(n) yc(n)=yl(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) h(n) x ( n ) x(n) x(n)的长度分别为N和M,其L点循环卷积为
    y c ( n ) = [ ∑ m = 0 L − 1 h ( m ) x ( ( n − m ) ) L ] R L ( n ) y_c(n)=\Big[\sum_{m=0}^{L-1}h(m)x\big((n-m)\big)_L\Big]R_L(n) yc(n)=[m=0L1h(m)x((nm))L]RL(n)

    { H ( k ) = D F T [ h ( n ) ] L X ( k ) = D F T [ x ( n ) ] L 0 ≤ k ≤ L − 1 , L ≥ m a x [ 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] {H(k)=DFT[h(n)]LX(k)=DFT[x(n)]L0kL1Lmax[N,M]
    则由DFT的时域循环卷积定理有
    Y c ( k ) = D F T [ y c ( n ) ] L = H ( k ) X ( k ) 0 ≤ k ≤ L − 1 Y_c(k)=DFT[y_c(n)]_L=H(k)X(k) \qquad 0\leq k \leq L-1 Yc(k)=DFT[yc(n)]L=H(k)X(k)0kL1
    由此可见,循环卷积既可以在时域直接计算,也可以按照下面的计算框图在频域计算。
    由于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);
    

    在这里插入图片描述

    展开全文
  • 二、实验条件PC机,MATLAB703、实验内容1)循环卷积的定义两个序列的N点循环卷积定义为010NNMXHNXHK利用MATLAB实现两个序列的循环卷积可以分三个步骤完成1初始化确定循环点数N,测量输入2个序列的长度...
  • 利用MATLAB实现循环卷积

    千次阅读 2021-04-18 10:49:40
    《利用MATLAB实现循环卷积》由会员分享,可在线...二、实验条件PC机,MATLAB7.03、 实验内容1) 循环卷积的定义:两个序列的N点循环卷积定义为: 利用MATLAB实现两个序列的循环卷积可以分三个步骤完成:(1)初始化:...
  • 掌握线性卷积与循环卷积软件实现的方法,理解掌握二者的关系 二、实例分析与计算 实验原理:两个序列的N 点循环卷积定义为)())(()()]()([N n m n x m h n x n h N k NN?∑-=01从定义中可以看出,循环卷积和线性卷积...
  • 循环卷积与线性卷积

    千次阅读 2020-01-09 20:33:37
    直接计算步骤: 序列A与序列B,长度都是N,新的序列C 1、把B倒过来。[翻转] 2、把B向右平移一个元素。最右侧的元素补到左边。 3、计算此时A和B对应元素的积的和。将其加到C的末尾。 4、如果C中还不足N个元素,...
  • 一、卷积计算原理、 二、卷积计算、 1、计算 y(0)、 2、计算 y(1)、 3、计算 y(2)、 三、使用 matlab 计算卷积、 四、使用 C 语言实现卷积计算
  • 本资源时基于matlab的GUI界面多种卷积计算和滤波器等,可以实现手动输入,锯齿、正弦等波形选择,也可以由自己...一步一步的演示卷积计算步骤和结果。包括循环卷积、线性卷积、快速卷积。其次含有卡尔曼滤波等功能。
  • 线性和循环卷积此示例说明如何建立线性卷积和循环卷积之间的等效关系。线性卷积和循环卷积是...了解线性卷积和循环卷积等效的条件,可让您使用 DFT 来高效地计算线性卷积。包含 N 个点的向量 x 和包含 L 个点的向量...
  • 原创循环卷积代码,转载需注明出处线性卷积与循环卷积的比较实验目的和要求掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系。实验内容和步骤1) 已知两序列X(n) = ; h(n)=...
  • 以FFT计算线性卷积

    千次阅读 2021-07-16 12:47:32
    clear;clc; xn = sin(0.4*[1:15]); hn = 0.9.^(1:20); %% %线性卷积 yn = conv(xn,hn); figure(1); subplot(3,1,1); stem(1:15,xn);...%循环卷积定理:有限长序列x(n),h(n)做循环卷积的DFT结果等于x(n)
  • 目录 0 前言: 理论知识 1 RNN模型结构 1.1 RNN结构 1.2 具体图 1.3 计算过程​ 1.4 RNN的总括图 2 RNN的反向传播 3 Tensorflow2.0 RNN循环卷积网络 3.1 LSTM 网络 3.1.1 LSTM网络的简单实现 3.1.2 LSTM 网络的...
  • 线性卷积与圆周卷积计算(杭电) (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!11.90 积分信号、系统与信号处理实验Ⅱ实验报告实验名称:线性卷积与圆周卷积的...
  • 线性卷积与圆周卷积计算.doc

    千次阅读 2021-04-20 05:26:35
    线性卷积与圆周卷积的计算,线性卷积和圆周卷积,圆周卷积线性卷积,圆周卷积计算方法,线性卷积计算方法,线性卷积计算,圆周卷积,圆周卷积怎么算,圆周卷积例题,matlab圆周卷积1.实验目的通过编程,上机调试程序,进一步...
  • 卷积与圆周卷积

    千次阅读 2018-07-25 10:57:30
    关于卷积的两种手算方法见链接 matlab中fft函数是对序列做DFT,第二个参数是采样点的数量,当缺省时,默认为输入信号序列的长度;当大于信号序列的长度时候,对输入序列后面补零计算,频域信号的分辨率因此而变细,...
  • 3、掌握线性卷积与循环卷积软件实现的方法,并验证二者之间的关系。二、实验原理1、线性卷积:线性时不变系统(Linear Time-Invariant System, or L. T. I系统)输入、输出间的关系为:当系统输入序列为,系...
  • 问题:一直不理解一张彩色3通道的图片,经过一个32层的33卷积核后,得到的是32通道...该步骤如下: 首先,每层卷积核分别于输入的各通道进行卷积。 然后,把卷积后的多通道输出进行相加,便得到单通道输出。 最后,剩余
  • 两个序列的N点循环卷积定义为 10[()()]()(())NNNkhnxnhmxnm (0)nN 从定义中可以看到,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环卷积的结果仍为N点序列,而它们的线性卷积的结果的...
  • CNN还按照固定的计算步骤(比如模型中层的数量)来实现这样的输入输出。这样的神经网络没有持久性 RNN优点: RNN 是包含循环的网络,允许信息的持久化。 在自然语言处理(NLP)领域,RNN已经可以做语音识别、机器翻译...
  • Matlab实现长序列卷积和2FFT-DIF

    千次阅读 2021-04-21 01:18:57
    实验要求1.1 令w(n)为一正弦加白噪声信号,长度为500,h(n)是一个低通FIR 滤波器,试用DFT 与叠接相加法计算线性卷积。h(n)使用fir1.m 设计:h=fir1(10,0.3,hanning(11)); %设计低通滤波器,得到h(n);1.2设计一个...
  • 之前,有写了一篇博文,【深度学习入门】——亲手实现图像卷积操作介绍卷积的相应知识,但那篇文章更多的是以滤波器的角度去讲解卷积。但实际上是神经网络中该博文内容并不适应。 之前的文章为了便于演示,针对的是...
  • 傅里叶变换 ~ 利用 DFT 计算线性卷积

    千次阅读 2019-10-19 11:02:54
    文章目录利用 DFT 计算线性卷积1、线性卷积原理2、DFT 计算线性卷积原理3、乘法运算次数比较4、示例 利用 DFT 计算线性卷积 1、线性卷积原理 线性卷积如下: ...利用 DFT 的循环卷积特性,可由 DFT 计...
  • 二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础...
  • 线性卷积与圆周卷积

    万次阅读 多人点赞 2017-09-06 15:51:25
    圆周卷积,也叫循环卷积,两个长度为N的有限场序列x(n)x(n)x(n)和h(n)h(n)h(n)的循环卷积定义为 即循环卷积相当于周期延拓后的序列x˜(n)x~(n)\widetilde{x}(n)和h˜(n)h~(n)\widetilde{h}(n)做周期卷积后再取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,875
精华内容 5,150
热门标签
关键字:

循环卷积的计算步骤