Использование 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
)