C语言实现卷积

一、介绍
1、首先自定义给出两个函数x(i)、h(i)。

函数一:x(i)  = i [0,1]  (变量i的取值区间,下同)

函数二:h(i)  = 1 [0,1]

2、对上两函数离散化

离散化:取样区间为[0,1],取样间隔自定义为dt = 0.002。

得到:

离散化序列一:x[m]  [0,M](M = (1-0)/0.002 = 500,下同)

离散化序列二:h[m]  [0,M]

3、对上面两个离散化序列卷积

序列一长度为M,序列二长度为M。

卷积结果就是y[n]  [0,L]。

且(L = M+M-1)

二、C程序实现
 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#define M 8
#define N 16
#define dt 0.125
void conl(double x[M+1],int m,double h[M+1],int n,double y[N+1],int l);
int main(void)
{
	FILE *fp1;
	int i,j,k;
	double x[M+1]={0},h[M+1]={0},y[N+1]={0};

	//打开文件
	if((fp1=fopen("juanji.xls","wb"))==NULL)
	printf("can not open file convosion_array");
 
	//初始化被卷积函数
	for(i=0;i<=M;i++)
	{
		//这里乘以dt是因为我们的数值就是从0到实际数值!!!
		x[i] = i*dt;
		h[i] = 1;
	}

	//调用卷积函数
	conl(x,M,h,M,y,N);
	//写入文件
	for(i=0;i<=N;i++)
	{
		fprintf(fp1,"%lf	%lf\n",i*dt,y[i]*dt);
	}
	//释放文件
	fclose(fp1);
	return 0;
}
void conl(double x[M+1],int m,double h[M+1],int n,double y[N+1],int l)
{
 
	int k,i;
	//l=m+n-1  这个为什么是这样求详细明白的解答??
	for(k=0;k<=l;k++)
	{
		//初始化卷积结果
		y[k]=0.0;
		//积分限为0-m(可取).m不是序列长度.而是取样区间除以取样间隔.序列长度为m+1.如果用序列长度,则符号‘<=’均改为‘<’.
		for(i=0;i<=m;i++)
		{
			//这里k-i的取值范围就是h[]矩阵的取值范围[0,n],很容易理解了就。
			if(k-i>=0 && k-i<=n)
			{
				y[k] += x[i]*h[k-i];
			}
		}
	}			
}


————————————————
版权声明:本文为CSDN博主「amen_yanwang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/amen_yanwang/article/details/127822011

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值