比如上面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的相关方法及代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)