Я пытаюсь выяснить функции 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 ().
Это просто не имеет смысла. Может кто-нибудь объяснить, где на земле я не понимаю, что происходит?