我有一个复数向量(双精度型)和另一个向量(双精度型),我想用它进行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;
}