我有一个复 vector ( double 型)和另一个 vector ( double 型),我想用它们执行二维卷积。我在网上看到的大多数示例都不是针对复杂 vector 的,所以我不确定如何着手实现它。
这些是我的载体:
vector<complex<double> > signal; // length of 100
vector<double> filter; // length of 101
我的“信号” vector 看起来像这样......
25 + 0.0000i, -9.04508 + 18.3273i, -3.45492 - 8.388i... and so on
我的“过滤器” vector 看起来像这样......
0, 2.56698e-09, 9.13094e-09, 1.14301e-08... and so on
理想情况下,我想输出到一个复杂的 vector 中,输入 double 并且长度与“信号”相同 所以我的输出是:
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 的总和在使索引在两个 vector 上有效的范围内。 k 介于 0 和 m+n-1 之间,其中 m = length(u) 和 n = length(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;
}
关于c++ - C++ 中复 vector 与实 vector 的二维卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58958443/