5

我试图弄清楚 vDSP 功能,我得到的结果很奇怪。

这与这个问题有关:

将 std::complex 与 iPhone 的 vDSP 功能一起使用

基本上,当我从 std::complex<float> 的向量开始时​​,我试图理解 vDSP_vdist。现在,我应该能够通过简单地执行以下操作来计算幅度:

// std::abs of a complex does sqrtf( r^2 + i^2 ).
pOut[idx]   = std::abs( pIn[idx] );

但是,当我这样做时,我会看到在矢量中点周围反射的光谱。这很奇怪。

然而,奇怪的是,如果我使用 vDSP_ztoc 后跟 vDSP_vdist,我会得到我期望的结果。所以我写了一些代码来尝试理解出了什么问题。

bool VecMagnitude( float* pOut, const std::complex< float >* pIn, unsigned int num )
{
    std::vector< float > realTemp( num );
    std::vector< float > imagTemp( num );

    DSPSplitComplex dspsc;
    dspsc.realp = &realTemp.front();
    dspsc.imagp = &imagTemp.front();

    vDSP_ctoz( (DSPComplex*)pIn, 1, &dspsc, 1, num );

    int idx = 0;
    while( idx < num )
    {           
        if ( fabsf( dspsc.realp[idx] - pIn[idx].real() ) > 0.0001f ||
             fabsf( dspsc.imagp[idx] - pIn[idx].imag() ) > 0.0001f )
        {
            char temp[256];
            sprintf( temp, "%f, %f - %f, %f", dspsc.realp[idx], dspsc.imagp[idx], pIn[idx].real(), pIn[idx].imag() );
            fprintf( stderr, temp );
        }
    }
    return true;
}

现在奇怪的是,上面的代码在 idx = 1 时开始失败并一直持续到最后。原因是 dspsc.realp[1] == pIn[0].imag()。就像它没有将其拆分为 2 个不同的缓冲区,而是将 std::complexes 的一半向量直接 memcpy 放入 dspsc.realp。即 2 浮动在 std::complex[0] 然后 2 浮动在 std::complex[1] 等等。dspsc.imagp 大致相同。dspsc.imagp[1] = pIn[1].real()。

这没有任何意义。有人可以解释我到底在哪里无法理解发生了什么吗?

4

0 回答 0