我想我有一个锯齿问题。 我正在使用fftw-library,它支持就地FFT。这意味着,我称之为fftw-function,其界面类似于:
void fftwFunction(double* input, fftw_complex* output);
其中fftw_complex
为double[2]
。 "就地"表示input
和output
数组可以指向同一个物理数组。 (注意:提供更好的性能。)
现在,我正在使用它:
class fftwClass
{
public:
void AllocateMemory(size_t numBytes)
{
void* allocatedMemory = fftw_malloc(numBytes); // Aligned malloc
mRealValues = reinterpret_cast<double*>(allocatedMemory);
mFourierValues = reinterpret_cast< std::complex<double>* >(allocatedMemory);
}
void DoForwardFFT()
{
// Transformation from the real to the fourier-space.
fftwFunction(mRealValues, mFourierValues);
}
void DoSomethingReal()
{
// Read and modify mRealValues
// E.g.:
mRealValues[0] = 5;
}
void DoSomethingFourier()
{
// Read and modify mFourierValues
// E.g.:
mFourierValues[0] = 5;
}
private:
double* mRealValues;
std::complex<double>* mFourierValues;
};
通话顺序可以是:AllocateMemory()
,DoSomethingReal()
,DoForwardFFT()
,DoSomethingFourier()
。
我的问题:
mRealValues
和mFourierValues
指向同一个数组,但具有不同的类型。因此,我在DoSomethingReal()
和DoSomethingFourier()
中遇到了别名/类型惩罚问题,我还没有?-Wall -Wextra
),英特尔和微软的编译器到目前为止都没有对任何别名问题发出警告,并且该程序运行正常:可能会出现一个无声问题混叠对于gcc,以下编译没有警告,但这是否解决了这个问题?
__attribute__((__may_alias__)) double* mRealValues;
__attribute__((__may_alias__)) std::complex<double>* mFourierValues;
关于转换为std::complex
的注意事项:fftw推荐它,据我所知,这是C ++ 11中定义的行为。在任何情况下,我都有一个static_assert
来检查大小是否匹配,这不是我的问题
在任何情况下,实际代码看起来都不同,因为fftw的使用更复杂(当然我清理已分配的内存)。
另请注意,我知道this帖子,但它没有回答我的问题。