vDSP_ztoc дает странные результаты - PullRequest
5 голосов
/ 24 сентября 2011

Я пытаюсь выяснить функции vDSP, и результаты, которые я получаю, очень странные.

Это относится к этому вопросу:

Использование std :: complex с функциями vDSP iPhone

В основном я пытаюсь понять смысл vDSP_vdist, поскольку я начинаю с вектора std :: complex . Теперь AFAIK я должен быть в состоянии рассчитать величину, просто выполнив:

// 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 разных буфера, он имеет прямую memcpy'd половину вектора std :: complex в dspsc.realp. то есть 2 с плавающей точкой в ​​std :: complex [0], затем 2 с плавающей точкой в ​​std :: complex [1] и так далее. dspsc.imagp - почти то же самое. dspsc.imagp [1] = pIn [1] .real ().

Это просто не имеет смысла. Может кто-нибудь объяснить, где на земле я не понимаю, что происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...