MKL只会矩阵运算?快来看看它的FFT和IFFT!

2024-02-05 10:38

本文主要是介绍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!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680651

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即

UserWarning: mkl-service package failed to import

安装完成anaconda,并设置了两个环境变量  之后再控制台运行python环境,输入import numpy as np,提示错误 D:\InstallFolder\Anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat