C语言实现离散信号的卷积计算

        在学习信号与系统的过程中,卷积这个概念几乎伴随着学习的全过程,利用定义式求解两个离散数据的卷积往往比较繁琐,人们通常采用Z变换的方式进行,但是我们可以利用计算机编程来简化这一计算过程。

        首先是离散信号的卷积计算公式

y[n]=\sum_{i=-\infty }^{i=+\infty }f[i]*h[n-i]

        根据信号的基本卷积运算,可以将跨越在正负区间的信号统一挪移到正区间,以此来方便数组的运算。由此得到如下关于离散信号的公式。

y[n]=\sum_{i=0 }^{i=n }f[i]*h[n-i]

        下面是编程的思路,即将公式展开,用for循环实现对循环求解。

1)首先是数组的定义和补充操作

【注释】需要对初始数组进行补零操作,因为C语言中数组的越界,数据会出现错误,需要我们提前对输入信号数组和系统响应数组进行补零操作,以防止超出原数组的限制。那为什么会超出数组的界限呢?原因是线性卷积的长度是输入的两数组长度之和减一,明显大于原始数组的长度。

    int a[N1]={1,2,3};
    int b[N2]={1,2,3};
    int c[N3]={0};
    int i=0;
    int t_a[N3]={0};
    int t_b[N3]={0};
    for(i=0;i<N3;i++)
    {
        if(i<N1){
            t_a[i]=a[i];
        }
        else{
            t_a[i]=0;
        }
        if(i<N2){
            t_b[i]=b[i];
        }
        else{
            t_b[i]=0;
        }   
    }

  2)卷积代码的实现

【注释】这里可以采用简单的数组调用相乘,也可以采用加入指针的方式实现。

①简单的相乘

for(i=0;i<N;i++)
{
    for(j=0;j<=i;j++)
    {
        sum[i]+=a[j]*b[i-j];
    }
    printf("%d\n",sum[i]);
}

②利用指针,加上定义函数来实现

函数的定义及声明

void conv(int *p0,int *p1,int *p2)//定义卷积函数,事先声明
{
    int n;
    for(n=0;n<N3;n++)
    {   int i;
        for(i=0;i<=n;i++)
        {
            p0[n]+=p1[i]*p2[n-i];
        }
    }
}

 函数的调用及结果的显示

    conv(c,t_b,t_a);
    for(i=0;i<N3;i++)
    {
          printf("%d\n",c[i]); 
    }

3)仿真结果展示

初始两信号为 a[3]={1,2,3},b[3]=[1,2,3];输出结果

和不进位乘法的结果相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫落于尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值