如何用C语言实现数组的卷积过程~~~

如何用C语言实现数组的卷积过程~~~,第1张

积分为线性卷积,和圆形卷积。而题目是线性卷积,然后是所求的结果个数是上面两个数组 个数的和减去1

比如上面h数组里面单元是5 而x数组 是4

所以肯定一点是结果是等于8个数的

result[(sizeof(h) + sizeof(x)) / sizeof(double) - 1]这个就可以说明了

第二个知识点是卷积是怎么求的。第一步肯定是判断两个数组 那个长度长

conv(x, h, sizeof(x) / sizeof(x[0]), sizeof(h) / sizeof(h[0]), result) 就是实现这个目标的。

然后是长度长的放前面

好吧 我换个 数字来就把

x【】=

h【】=

然后卷积 一个是 x0*h0=1;实现语句 是第一个

for (int i = 0i <lenHi++)

{

for (int j = 0j <= ij++)

result[i] += x[j] * h[i - j]

}

此时 已经要转入第二步骤了:

for (int m = lenHm <lenXm++){

for (int j = 0j <lenHj++)

result[m] += x[m - j] * h[j]

}

第二部 应该是 x*h+x1*h(1-1)= 这里得h1 用0代替 但程序里 不是这样 而是 用x*h=

好吧 我可能设置的h数组不够长 加入 h有两个。x有

那么 结果 应该是x2*y1+x1*y0;

然后是第三部

是说 在要求的 结果 最后几个数字时候 比如原题里面 应该是有8个的。但到第二个循环才求到X得长度5个。

所以 后面应该是resual记住 数组下标 比实际小1. 所以

是这样的

用 for (int n = lenXn <lenX + lenH - 1n++){

for (int j = i - lenX + 1j <lenHj++)

result[n] += x[n - j] * h[j]

}里面的i 要改成n

for (int n = lenXn <lenX + lenH - 1n++){

for (int j = n - lenX + 1j <lenHj++)

result[n] += x[n - j] * h[j]

}

然后 是这样分析的

结果等于=x(0)h(5-0)+x(1)h(5-1)+x(2)h(5-2)+x(3)h(5-3)=x(0)h(5)+x(1)h(4)+x(2)h(3)+x(3)h(2) 记住 数组不够的地方 用0代替

copy(result, &result[8], ostream_iterator<double>(cout, " ")) 这个函数 就不想说了 自己去看stl 算法吧

另外,虚机团上产品团购,超级便宜

卷积在工程和数学上都有很多应用:

统计学中,加权的滑动平均是一种卷积。概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。物理学中,任何一个线性系统(符合叠加原理)都存在卷积。

介绍一个实际的概率学应用例子。假设需求到位时间的到达率为poisson(λ)分布,需求的大小的分布函数为D(.),则单位时间的需求量的分布函数为 F(x):

其中 D(k)(x)为k阶卷积。

卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。castlman的书对卷积讲得很详细。

高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到:

for(i=0i<Ni++)

{

for(j=0j<Nj++)

{

g[i*N+j]=exp(-((i-(N-1)/2)^2+(j-(N-1)/2)^2))/(2*delta^2))

sum += g[i*N+j]

}

}

再除以 sum 得到归一化算子

N是滤波器的大小,delta自选

首先,在提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。

信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入 输出 和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。

因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。

卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。

C++语言代码: void convolution(float *input1, float *input2, float *output, int mm, int nn){ float *xx = new float[mm+nn-1]// do convolution for (int i = 0i <mm+nn-1i++){ xx[i] = 0.0 for (int j = 0j <mmj++) { if (i-j >0 &&i-j <nn)xx[i] += input1[j] * input2[i-j]} } // set value to the output array for (int i = 0i <mmi++) output[i] = xx[i + (nn-1) / 2]delete[] xx}

卷积 需要 有两个 函数 才好计算。

卷积 是 两个函数中的一个函数翻转并平移后 与 另一个函数的乘积的积分。

离散域函数卷积:(f*g)[m] = SUM (f[n] g[m-n]) (累加n=0,1,2,。。)

#include "stdio.h"

#include "math.h"

FILE *fin, *fout

float g(int mn)

{

float result=0.5

// insert function calculation

return result

}

void main()

{

char namein[60]="m1.dat",nameout[60]="m2.dat"

float x[500][5],sum // 数组大小须根据数的多少作修改。

int i,j,k,NN

if ((fin=fopen(namein,"r") )==NULL){

printf("open %s error\n",namein)exit(0)

}

if ((fout=fopen(nameout,"w") )==NULL){

printf("open %s error\n",nameout)exit(0)

}

NN=0

while(1){

for (i=0i<5i++) if (fscanf(fin,"%f ",&x[NN][i])==EOF) goto Lab

NN++

}

Lab: fclose(fin)

for(j=0j<NNj++){

sum=0.0

for(i=0i<NNi++){

sum = sum + x[i][4]*g(j-i)

}

fprintf(fout,"%f %f %f %f %f\n",x[j][0],x[j][1],x[j][2],x[j][3],sum)

}

fclose(fout)

printf("output in %s\n",nameout)

exit(0)

}

==========

输出5列float

如果你要求前4列一模一样,可以修改为 读入4个字符串,1个float 输出4个字符串,1个float。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8135691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存