1

我一直在研究一些 vDSP 代码,但遇到了一个烦人的问题。我的代码是跨平台的,因此使用 std::complex 来存储其复杂值。

现在我假设我可以按如下方式设置 FFT:

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

然后在适当的 vDSP_fft_* 调用中使用 2 的步幅。

然而,这似乎不起作用。我可以通过做一个 vDSP_ztoc 来解决这个问题,但这需要我真的不想闲逛的临时缓冲区。有没有办法直接在交错的复杂数据上使用 vDSP_fft_* 函数?也有人可以解释为什么我不能像上面那样以 2 的步幅做吗?

谢谢

编辑:正如 Bo Persson 所指出的那样, real 和 imag 函数实际上并没有返回引用。

但是,如果我改为执行以下操作,它仍然不起作用

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

所以我原来的问题仍然存在:(

4

2 回答 2

4

std::complex 函数real()并按imag()值返回,它们不返回对 complex 成员的引用。

这意味着您无法通过这种方式获取他们的地址。

于 2011-09-24T10:48:21.500 回答
-1

这就是你的做法。

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

资料来源:http ://www.fftw.org/doc/Complex-numbers.html

编辑:澄清来源;COMPLEX 和 fftw_complex 使用相同的数据布局(尽管 fftw_complex 使用double和 COMPLEX float

于 2015-07-18T11:02:37.453 回答