卷积的C语言实现

卷积定义

由于计算机只能进行离散计算,所以用在计算机上的卷积也就该是离散形式,长这样:
在这里插入图片描述

卷积性质

卷积和傅里叶变换有很大的瓜葛,怎么瓜葛上的我不清楚,但就是有很大的瓜葛(确信)。

而瓜葛之后的性质却很好用:把用来卷积的两个函数1和函数2进行傅里叶变换之后再乘起来得到一个函数3,再把函数3傅里叶反变换得到函数4,最后得到的函数4就是函数1和函数2的卷积结果。

卷积C代码

#include
#include

//函数声明
void convolution_fun( int length1, int length2,float *fun1, float *fun2, float *fun3);
int min( int a, int b);

//主函数
void main()
{
	//定义变量
	int length1 = 20;
	int length2 = 200;
	float *fun1;
	float *fun2;
	float *fun3;
	int i;
	
	//分配内存
	fun1 = (float *)malloc(sizeof(float)*length1);//fun1和fun2就是卷积
	fun2 = (float *)malloc(sizeof(float)*length2);//的两个函数,需要自
	fun3 = (float *)malloc(sizeof(float)*length2);//己赋值或计算。
	
	//定义文件
	FILE *fun3fp;
	fun3fp = fopen("fun3.txt","w");
	
	//调用函数
	convolution_fun( length1, length2, fun1, fun2, fun3);
	
	//输出
	for(i = 0; i < length2; i++ )
	{
		fprintf(fun3fp, "%f\n", fun3[i]);
	}
}

//卷积函数
void convolution_fun( int length1, int length2,float *fun1, float *fun2, float *fun3)
{
	int n;
	int L;
	for(n = 0; n < length1; n++)
	{	
		fun3[n] = 0;
		for(L = 0; L < min( n, length2); L++)
		{	
			fun3[n] += (fun2[n-L]*fun1[L]);
		}
	}
}

//最小值函数
int min( int a, int b)
{
	return a < b? a : b;
}

你可能感兴趣的:(算法,卷积,c语言)