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); //计算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;
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值