本文主要是介绍MKL只会矩阵运算?快来看看它的FFT和IFFT!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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); //计算ifftstatus = 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;
}
这篇关于MKL只会矩阵运算?快来看看它的FFT和IFFT!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!