我试图弄清楚 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()。
这没有任何意义。有人可以解释我到底在哪里无法理解发生了什么吗?