MKL的FFT和IFFT实现
MKL是Intel公司推出的一项数学库,其功能主要是用于加速矩阵运算等。最近的工作中接触到了MKL。
但你以为MKL除了加速处理矩阵就啥也不会了么?
非也!它甚至可以进行快速傅里叶及其逆运算!简直是CS和EE领域的一大福音!
那么它究竟怎么去完成呢?在这里我仿了一个C语言的代码,主要是做了一次FFT,再做一次IFFT,那么它的结果应该和一开始一样的。
值得一提的是Nfft一定要是2的幂次,具体原因详见任意DSP教材(然而我并没有修过辣)。
代码如下:
#include <iostream>
#include "mkl_dfti.h"
#include "mkl.h"
void fft_complex(MKL_Complex8 *datain, MKL_Complex8 *dataout, uint16_t Nfft)
{
DFTI_DESCRIPTOR_HANDLE data_hand_;
MKL_LONG status;
status = DftiCreateDescriptor(&data_hand_, DFTI_SINGLE, DFTI_COMPLEX, 1, Nfft);
status = DftiSetValue(data_hand_, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
status = DftiCommitDescriptor(data_hand_);
status = DftiComputeForward(data_hand_, datain, dataout);
status = DftiFreeDescriptor(&data_hand_);
}
void ifft_complex(MKL_Complex8 *datain, MKL_Complex8 *dataout, uint16_t Nfft)
{
DFTI_DESCRIPTOR_HANDLE data_hand_;
MKL_LONG status;
status = DftiCreateDescriptor(&data_hand_, DFTI_SINGLE, DFTI_COMPLEX, 1, Nfft);
status = DftiSetValue(data_hand_, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
status = DftiSetValue(data_hand_, DFTI_BACKWARD_SCALE, 1.0f / Nfft);
status = DftiCommitDescriptor(data_hand_);
status = DftiComputeBackward(data_hand_, datain, dataout); //计算ifft
status = DftiFreeDescriptor(&data_hand_);
}
int main()
{
MKL_Complex8 *datain = (MKL_Complex8 *)mkl_calloc(1024, sizeof(MKL_Complex8), 64);
for (int i=0;i<1024;i++)
{
datain[i].real = i+1;
datain[i].imag = i+1;
}
MKL_Complex8 *dataout = (MKL_Complex8 *)mkl_calloc(1024, sizeof( MKL_Complex8), 64);
MKL_Complex8 tmp[1024];
uint16_t Nfft= 1024;
fft_complex(datain, tmp, Nfft);
ifft_complex(tmp, dataout, Nfft);//dataout = datain here.
return 0;
}