如何用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}

有。

卷积/圆周卷积

圆周卷积

线性卷积的延拓

若x1(n)和x2(n)分别为N1与N2的有限长序列,则它们的线性卷积y1(n)的长度为N1+N2-1的有限长序列。而它们以N点做圆周卷积y2(n)则有以下两种情况:

①当N<N1+N2-1时,会发生混叠,即y2(n)是由y1(n)的前N点和后(N1+N2-1-N)点圆周移位后尘晌的叠加而成。

②N> N1+N2-1时,圆周卷积等同于线性卷积,即y2(n)的前N1+N2-1的点刚好是y1(n)的全部非零序列,其中剩下的N-(N1+N2-1)个点上的序列则是补充的零。

同时对于圆周卷积必须考虑点数。

当N>N1+N2-1时,圆周卷积成为线性卷积。

下面比较肆销两种卷积c语言算法裂兄游:

代码1.

int convolution_numberical(double a[10], double b[10],double count1,double count2)

{

double c[10][10]

double sum[19] = { 0 }//不初始化有乱码

for (int i = 0i <count1&&i <count2i++)

{

for (int j = 0j <count1&&j <count2j++)

{

c[j][i] = a[j] * b[i]

for (int k = 0k <19k++)

{

if (j + i == k)

{

//cout <<i <<j<<k<<endl

//cout <<c[j][i] <<k <<endl

sum[k] += c[j][i]

}

cout <<sum[k] <<endl

}

}

}

return 0//子函数不能反馈数组!

}

登录后复制

上例为:通过二维数组对列表法模拟,对十个采样数据的圆周卷积或卷积。同时可以在参数中加入N的点数,实现N点圆周卷积或卷积。

int convolution_defination(double a[10],double b[10],double count1,double count2)

{

double c_in[19] = { 0 }

for (int j = 0j <count1 + count2 - 1j++)

{

for (int k = 0k <count1k++)

{

if ((j - k) >= 0 &&(j - k) <count2)

{

c_in[j] += a[j - k] * b[k]

}

}

cout <<c_in[j] <<endl

}

return 0

}

登录后复制

减少复杂度的优化方法如上例。

下文将给出N圆周卷积的相关算法和对于dft fft的相关方法及代码


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存