【数字信号处理】卷积编程实现 ( 卷积计算原理 | 卷积公式计算 | 使用 matlab 计算卷积 | 使用 C 语言实现卷积计算 )





一、卷积计算原理



对于 线性时不变系统 ( LTI - Linear time-invariant ) 来说 ,

假设 x ( n ) x(n) x(n) 是 LTI 系统的 " 输入序列 " , y ( n ) y(n) y(n) 是 " 输出序列 " ,

则有 :

y ( n ) = ∑ m = − ∞ + ∞ x ( m ) h ( n − m ) = x ( n ) ∗ h ( n ) y(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) = x(n) * h(n) y(n)=m=+x(m)h(nm)=x(n)h(n)


线性时不变系统 ( LTI - Linear time-invariant ) 的

" 输出序列 "

等于

" 输入序列 "" 系统单位脉冲响应 "线性卷积 ;


输出序列 的元素个数 : 输 出 序 列 元 素 个 数 = 输 入 序 列 元 素 个 数 + 单 位 脉 冲 响 应 序 列 元 素 个 数 − 1 输出序列元素个数 = 输入序列元素个数 + 单位脉冲响应序列元素个数 - 1 =+1





二、卷积计算



给定 输入序列 :

x ( n ) = { 1 , 2 } [ 0 , 1 ] x(n) = \{1,2\}_{[0, 1]} x(n)={1,2}[0,1]

单位脉冲响应 :

h ( n ) = { 1 , 2 } [ 0 , 1 ] h(n) = \{1,2\}_{[0, 1]} h(n)={1,2}[0,1]

计算卷积 : x ( n ) ∗ h ( n ) x(n) * h(n) x(n)h(n) ;


卷积结果序列对应的元素个数是 2 + 2 − 1 = 3 2 + 2 - 1 = 3 2+21=3


根据如下 卷积 公式 :

y ( n ) = ∑ m = − ∞ + ∞ x ( m ) h ( n − m ) = x ( n ) ∗ h ( n ) y(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) = x(n) * h(n) y(n)=m=+x(m)h(nm)=x(n)h(n)

x ( n ) ∗ h ( n ) = ∑ m = − ∞ + ∞ x ( m ) h ( n − m ) x(n) * h(n) = \sum^{+\infty}_{m = -\infty} x(m) h(n-m) x(n)h(n)=m=+x(m)h(nm)


1、计算 y(0)


计算 y ( 0 ) y(0) y(0) :

∑ m = − ∞ + ∞ x ( m ) h ( 0 − m ) \sum^{+\infty}_{m = -\infty} x(m) h(0-m) m=+x(m)h(0m)

m m m 取值 [ − ∞ , + ∞ ] [-\infty, +\infty] [,+]

m < 0 m < 0 m<0 时 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m) h(n-m) = 0 x(m)h(nm)=0 , 累加没有意义 ;

m = 0 m = 0 m=0 时 , 有 x ( 0 ) h ( 0 − 0 ) = x ( 0 ) h ( 0 ) = 1 × 1 = 1 x(0)h(0 - 0) = x(0)h(0) = 1 \times 1 = 1 x(0)h(00)=x(0)h(0)=1×1=1

m ≥ 1 m \geq 1 m1 时 , 有 h ( n − m ) = h ( 0 − m ) = 0 h(n - m) = h(0 - m) = 0 h(nm)=h(0m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m)h(n - m) = 0 x(m)h(nm)=0 , 累加没有意义 ;

最终 :

y ( 0 ) = x ( 0 ) h ( 0 ) = 1 × 1 = 1 y(0) = x(0)h(0)= 1 \times 1 = 1 y(0)=x(0)h(0)=1×1=1


2、计算 y(1)


计算 y ( 1 ) y(1) y(1) :

∑ m = − ∞ + ∞ x ( m ) h ( 1 − m ) \sum^{+\infty}_{m = -\infty} x(m) h(1-m) m=+x(m)h(1m)

m m m 取值 [ − ∞ , + ∞ ] [-\infty, +\infty] [,+]

m < 0 m < 0 m<0 时 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m) h(n-m) = 0 x(m)h(nm)=0 , 累加没有意义 ;

m = 0 m = 0 m=0 时 , 有 x ( m ) h ( n − m ) = x ( 0 ) h ( 1 − 0 ) = x ( 0 ) h ( 1 ) = 1 × 2 = 2 x(m) h(n-m) = x(0)h(1 - 0) = x(0)h(1) = 1 \times 2 = 2 x(m)h(nm)=x(0)h(10)=x(0)h(1)=1×2=2

m = 1 m = 1 m=1 时 , 有 x ( m ) h ( n − m ) = x ( 1 ) h ( 1 − 1 ) = x ( 1 ) h ( 0 ) = 2 × 1 = 2 x(m) h(n-m) = x(1)h(1 - 1) = x(1)h(0) = 2 \times 1 = 2 x(m)h(nm)=x(1)h(11)=x(1)h(0)=2×1=2

m ≥ 2 m \geq 2 m2 时 , 有 h ( n − m ) = h ( 2 − m ) = 0 h(n - m) = h(2 - m) = 0 h(nm)=h(2m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m)h(n - m) = 0 x(m)h(nm)=0 , 累加没有意义 ;

最终 :

y ( 1 ) = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) = 2 + 2 = 4 y(1) = x(0)h(1)+x(1)h(0) = 2 + 2 = 4 y(1)=x(0)h(1)+x(1)h(0)=2+2=4


3、计算 y(2)


计算 y ( 2 ) y(2) y(2) :

∑ m = − ∞ + ∞ x ( m ) h ( 2 − m ) \sum^{+\infty}_{m = -\infty} x(m) h(2-m) m=+x(m)h(2m)

m m m 取值 [ − ∞ , + ∞ ] [-\infty, +\infty] [,+]

m < 0 m < 0 m<0 时 , 有 x ( m ) = 0 x(m) = 0 x(m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m) h(n-m) = 0 x(m)h(nm)=0 , 累加没有意义 ;

m = 0 m = 0 m=0 时 , 有 x ( m ) h ( n − m ) = x ( 0 ) h ( 2 − 0 ) = x ( 0 ) h ( 2 ) = 1 × 0 = 0 x(m) h(n-m) = x(0)h(2 - 0) = x(0)h(2) = 1 \times 0 = 0 x(m)h(nm)=x(0)h(20)=x(0)h(2)=1×0=0 , h h h 仅在 0 , 1 0,1 0,1 索引有值 , 2 2 2 索引值为 0 ;

m = 1 m = 1 m=1 时 , 有 x ( m ) h ( n − m ) = x ( 1 ) h ( 2 − 1 ) = x ( 1 ) h ( 1 ) = 2 × 2 = 4 x(m) h(n-m) = x(1)h(2 - 1) = x(1)h(1) = 2 \times 2 = 4 x(m)h(nm)=x(1)h(21)=x(1)h(1)=2×2=4

m ≥ 2 m \geq 2 m2 时 , 有 h ( n − m ) = h ( 2 − m ) = 0 h(n - m) = h(2 - m) = 0 h(nm)=h(2m)=0 , 则 x ( m ) h ( n − m ) = 0 x(m)h(n - m) = 0 x(m)h(nm)=0 , 累加没有意义 , h h h 仅在 0 , 1 0,1 0,1 索引有值 , 小于 0 0 0 的索引值为 0 ;

最终 :

y ( 1 ) = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) = 0 + 4 = 4 y(1) = x(0)h(1)+x(1)h(0) = 0 + 4 = 4 y(1)=x(0)h(1)+x(1)h(0)=0+4=4





三、使用 matlab 计算卷积



matlab 源码 :

x = [1, 2];
h = [1, 2];

y = conv(x, h);

最终计算结果 : y ( n ) = { 1 , 4 , 4 } [ 0 , 2 ] y(n) = \{1,4,4\}_{[0,2]} y(n)={1,4,4}[0,2]

在这里插入图片描述





四、使用 C 语言实现卷积计算



从百度百科找了个源码 : convolution 是卷积计算的函数 , 仅做参考 ;

void convolution(double *input1, double *input2, double *output, int mm, int nn)
{
    double *xx = new double[mm + nn - 1];
    // do convolution 
    for (int i = 0; i < mm + nn - 1; i++)
    {
        xx[i] = 0.0;
        for (int j = 0; j < mm; j++)
        {
            if (i - j >= 0 && i - j < nn)
                xx[i] += input1[j] * input2[i - j];
        }
    }
    // set value to the output array 
    for (int i = 0; i < mm + nn - 1; i++)
        output[i] = xx[i];
    delete[] xx;
}

源码参考 https://baike.baidu.com/item/卷积 百度百科 ;

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值