c++ - C++ 中复 vector 与实 vector 的二维卷积

标签 c++ vector convolution complex-numbers

我有一个复 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/

相关文章:

c++ - 多重定义和命名空间

python - CMake boost 也需要 -lboost_* 才能工作

c++ - 如何循环遍历特定字符串的 vector

c++ - 如何删除尚未分配给对象的指针

c++ - move 的 vector 总是空的吗?

conv-neural-network - 理解什么是卷积神经网络中的权重共享

c++ - C++ 中的 3d 卷积

c# - 来自非托管内存的 byte[] 数组

c++ - makefile 中提到的依赖项的修改是否未被 make 识别?

Android:快速位图模糊?