c++ - 实际输入到FFT,然后iFFT返回到一维数组中的实际数据

标签 c++ fft m

我正在尝试使用Intel MKL实现FFT和iFFT。实际输入上的FFT工作正常,我返回的输出数组正确。在将同一个输出数组用于iFFT时,返回的值都将乘以数组的大小,这对于所有大小都成立。我不明白为什么会这样。代码如下:

size_t size;
std::cout << "enter the size of input and output array: ";
std::cin >> size;
float *inp = NULL;
MKL_Complex8 *op = NULL;
MKL_LONG status;

 
// Allocate memory for the arrays.
inp = (float*) mkl_malloc(size*sizeof(float), 64);
op = (MKL_Complex8*) mkl_malloc((size/2+1)*sizeof(MKL_Complex8), 64);
//Initialize values of input
for (size_t i = 0; i < size; i++){
    if(i < 8)
        inp[i] = -std::rand()%10;
    else if(i ==8)
        inp[i] = 0;
    else
        inp[i] = std::rand()%10;
}

std::cout << "The input array is: " << std::endl;
for (size_t i = 0; i < size; i++){
    std::cout << inp[i] << ", ";
}
std::cout << std::endl;

//Specify descriptor values.

DFTI_DESCRIPTOR_HANDLE hand = NULL;

status = DftiCreateDescriptor(&hand, DFTI_SINGLE, DFTI_REAL, 1, (MKL_LONG) size);
status = DftiSetValue(hand, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
status = DftiSetValue(hand, DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX);
status = DftiSetValue(hand, DFTI_PACKED_FORMAT, DFTI_CCE_FORMAT);
status = DftiCommitDescriptor(hand);
status = DftiComputeForward(hand, inp, op);


status = DftiComputeBackward(hand, op, inp);

std::cout << "\nThe output of iFFT is: " << std::endl;
for (size_t i = 0; i < size; i++){
    std::cout << inp[i] << ", ";
}
std::cout << std::endl;

DftiFreeDescriptor(&hand);
free(inp);
free(op);

return 0;
}
粗略的解决方法是将单个数组元素除以iFFT之后的大小,但这无法解释为什么首先发生这种情况。了解实际原因并加以纠正会更好。这是在实际代码之前实现这些转换的尝试,我真的很想了解为什么会这样。谢谢。

最佳答案

FFT / IFFT的定义存在不同的约定,具有不同的归一化因子:在FFT端进行1 / N归一化,在IFFT端进行1 / N归一化,或者在两侧进行1 / sqrt(N)归一化,或者完全不进行归一化。
在没有归一化因子的情况下,在FFT / IFFT之后,您可以有效地乘以FFT大小。
正如克里斯·伦戈(Cris Luengo)在评论中提到的那样,MKL可能选择不提供标准化的构建基块,以免因两次标准化而受到惩罚。
在Intel MKL的上下文中,存在2个参数DFTI_FORWARD_SCALE和DFTI_BACKWARD_SCALE,可以使用DftiSetValue()进行设置。对于一维变换,可以将前向变换比例设为1,将后向变换比例设为1 / n,其中“n”是一维变换的大小。 (有关更多信息,请引用Intel documentation for MKL)

关于c++ - 实际输入到FFT,然后iFFT返回到一维数组中的实际数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63868310/

相关文章:

python - FFT 快速卷积 : How To Apply Window to minimize crackling

java - FFT 实现

excel - PowerQuery - 查找一个短语并返回包含该短语的单词

sql - 如何将具有相同 ID 的行合并到一个列表中

用于高斯函数的 Matlab FFT

powerbi - Power Query Table.TransformRows 不会返回表

c++ - 分配约10GB的 vector -如何加快速度?

c++ - 需要一个简短、复杂的 C++ 代码和一个更长、易于理解的版本

c++ - 加载仅具有 alpha 值的纹理

c++ - 具有 const 参数的函数重载(跟进)