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