[C ++中复杂向量与实向量的2D卷积

问题描述 投票:0回答:1

我有一个复数向量(双精度型)和另一个向量(双精度型),我想用它进行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 ++还是比较缺乏经验,所以对任何有关如何执行计算的高级技巧/指导都表示赞赏。

c++ vector convolution complex-numbers
1个回答
1
投票

卷积公式可以在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;
}
© www.soinside.com 2019 - 2024. All rights reserved.