C++中复向量与实向量的二维卷积



我有一个复向量(类型double(和另一个向量(类型double(,我想用它们进行2D卷积。我在网上看到的大多数例子都不是针对复杂向量的,所以我不确定如何实现它

这些是我的矢量:

vector<complex<double> > signal;  // length of 100
vector<double> filter;            // length of 101

我的"信号"矢量是这样的。。。

25 + 0.0000i, -9.04508 + 18.3273i, -3.45492 - 8.388i... and so on

我的"过滤器"矢量是这样的。。。

0, 2.56698e-09, 9.13094e-09, 1.14301e-08... and so on

理想情况下,我希望输出到一个复杂的矢量,键入double,长度与"signal"相同所以我的输出是:

vector<complex<double> > filtered_signal;

我对C++仍然相对缺乏经验,因此任何关于如何执行计算的高级提示/指导都将不胜感激。

卷积公式可以在https://www.mathworks.com/help/matlab/ref/conv.html

正如你所看到的,

w(k(=sum_j(u(j(v(k−j+1((

其中与索引j的和在保持索引在两个向量上有效的范围内。k在0和m+n-1之间,其中m=长度(u(,n=长度(v(

因此,如果u(j(是复的,v(k(是实的,那么乘积是很好定义的。

std::vector<complex<double> > conv(const std::vector<complex<double> > &a, const std::vector<double> &b)
{
std::vector<complex<double> > r(a.size()+b.size()-1);
for (unsigned long i=0; i<r.size(); i++) {
r[i] = 0;
unsigned long s =(i+2-b.size()>0) ? i+2-b.size() : 0;
for (unsigned long j=s ; j<min(a.size(),i+2) ; j++) {
r[i] += a[j] * b[i-j+1];
}
}
return r;
}

最新更新