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

Я работал над кодом vDSP и столкнулся с досадной проблемой. Мой код кроссплатформенный и, следовательно, использует std::complex для хранения своих комплексных значений.

Теперь я предполагал, что смогу настроить БПФ следующим образом:

DSPSplitComplex dspsc;
dspsc.realp = &complexVector.front().real();
dspsc.imagp = &complexVector.front().imag();

А затем используйте шаг 2 в соответствующем вызове vDSP_fft_*.

Однако это просто не похоже на работу. Я могу решить эту проблему с помощью vDSP_ztoc, но для этого требуются временные буферы, которые я действительно не хочу торчать. Есть ли способ использовать функции vDSP_fft_* непосредственно для чередующихся сложных данных? Также кто-нибудь может объяснить, почему я не могу сделать, как я делаю выше, с шагом 2?

Спасибо

Редактировать: Как указал Бо Перссон, функции real и imag фактически не возвращают ссылку.

Однако это все еще не работает, если я делаю следующее вместо

DSPSplitComplex dspsc;
dspsc.realp = ((float*)&complexVector.front()) + 0;
dspsc.imagp = ((float*)&complexVector.front()) + 1;

Так что мой оригинальный вопрос все еще стоит:(

2 ответа

Решение

Std:: комплексные функции real() а также imag() возвращая по значению, они не возвращают ссылку на членов комплекса.

Это означает, что вы не можете получить их адреса таким образом.

Вот как ты это делаешь.

const COMPLEX *in = reinterpret_cast<const COMPLEX*>(std::complex);

Источник: http://www.fftw.org/doc/Complex-numbers.html

РЕДАКТИРОВАТЬ: чтобы уточнить источник; COMPLEX и fftw_complex используют одинаковое расположение данных (хотя fftw_complex использует double и КОМПЛЕКС float)

Другие вопросы по тегам