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#include#include#include#include#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];
}
}
}
}
————————————————
版权声明:本文为博主「amen_yanwang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/amen_yanwang/article/details/127822011
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文题目:C语言实现卷积-创新互联
文章位置:http://cdiso.cn/article/cejocj.html