【问题标题】:2D Convolution of complex vector with real vector in C++C++中复数向量与实数向量的二维卷积
【发布时间】:2019-11-20 15:53:12
【问题描述】:

我有一个复数向量(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

理想情况下,我想输出一个复数向量,输入双精度并与“信号”长度相同 所以我的输出是:

vector<complex<double> > filtered_signal;

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

【问题讨论】:

    标签: c++ vector convolution complex-numbers


    【解决方案1】:

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

    如你所见,

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

    其中索引为 j 的 sum 在使索引在两个向量上保持有效的范围内。 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;
    }
    

    【讨论】:

    • 谢谢,这很有帮助。但这是针对全卷积情况的,我想输出与输入信号相同的大小。
    • 另外,这适用于一维卷积,在我的情况下,因为我有具有实部和虚部的复向量,我假设我需要二维卷积?
    • @Alex 抱歉,但我不明白你所说的 2D 相关性是什么意思。我的回答是针对您最初未经编辑的问题。你有数学参考吗?根据uk.mathworks.com/help/signal/ref/xcorr2.html 2d 相关性在矩阵之间。因此,如果您有向量,则不适用。
    • 抱歉,我很困惑是否需要相关性或卷积。我可以确认我需要uk.mathworks.com/help/matlab/ref/conv2.html?s_tid=doc_ta 所述的 2D 卷积
    • 但是因为我有复向量,所以这是分裂的(实数,图像)
    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 2013-07-19
    • 2010-09-19
    • 2011-01-20
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多