---
title: FFT_1D
description: "| 硬件型号 | 支持情况 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/SiP/SIP_API_0029.html
sourcePath: /source/zh/canncommercial/900/API/SiP/SIP_API_0029.html
indexId: 629c2b8c6b077fbb58222b12b0db7042e81bb8fc2d7d38b0c0cd6e10b5c3111655
---
# FFT_1D

#### 产品支持情况

| 硬件型号 | 支持情况 |
| --- | --- |
| Atlas 200I/500 A2 推理产品 | 不支持 |
| Atlas 推理系列产品 | 不支持 |
| Atlas 训练系列产品 | 不支持 |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | 支持 |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | 支持 |
| Ascend 950PR/Ascend 950DT | 仅“asdFftExecC2C”支持 |


#### 功能描述

接口功能

- asdFftMakePlan1D：初始化该句柄对应的FFT配置。
- asdFftExecC2C：执行复数到复数的FFT变换。
- asdFftExecC2R：执行复数到实数的FFT变换。

- asdFftExecR2C：执行实数到复数的FFT变换。
- asdFftExecC2CSeparated：执行复数到复数的FFT变换，支持实部、虚部分开输入和输出。

计算公式

傅里叶变换（Fourier transform）是一种线性积分变换，用于信号在时域和频域之间的变换，在物理学和工程学中有许多应用。对应给定长度为N的信号，其离散形式DFT(Discrete Fourier Transform)表达式如下：


将系数矩阵(N*N)和时域信号(N*1)看做两个Tensor，在NPU上直接使用矩阵乘，可完成DFT，但时间复杂度太高，因此需要快速傅里叶变换。其基本原理是利用三角函数在复数域的旋转对称性，将序列拆分成子序列，通过蝶形运算以降低计算的复杂度：


#### 函数原型

- AspbStatus asdFftMakePlan1D(asdFftHandle handle, int64_t fftSize, asdFftType fftType,asdFftDirection direction, int64_t batchSize,asdFft1dDimType dimType)
- AspbStatus asdFftExecC2C(asdFftHandle handle, const aclTensor *input, const aclTensor *output)
- AspbStatus asdFftExecC2R(asdFftHandle handle, const aclTensor *input, const aclTensor *output)
- AspbStatus asdFftExecR2C(asdFftHandle handle, const aclTensor *input, const aclTensor *output)
- AspbStatus asdFftExecC2CSeparated(asdFftHandle handle, const aclTensor *inputReal, const aclTensor *inputImag,const aclTensor *outputReal, const aclTensor *outputImag)


#### 参数说明

- asdFftMakePlan1D| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| fftSize | Input | int64\_t | 公式中的N，FFT信号长度。 |
| fftType | Input | asdFftType | FFT变换类型，全部如下： \- ASCEND\_FFT\_C2C \- ASCEND\_FFT\_C2R \- ASCEND\_FFT\_R2C |
| direction | Input | asdFftDirection | 选择FFT执行正向变换或反向变换： \- ASCEND\_FFT\_FORWARD \- ASCEND\_FFT\_INVERSE |
| batchSize | Input | int64\_t | FFT变换批处理操作中的数据批次数量。 |
| dimType | Input | asdFft1dDimType | 指定Fft\_1D变换的维度“方向”（是按行做FFT还是按列做FFT）： \- ASCEND\_FFT\_HORIZONTAL ：横向FFT \- ASCEND\_FFT\_VERTICAL ：纵向FFT |


- asdFftExecC2C| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| inData | Input | const aclTensor \* | 公式中的x，Device侧的Tensor，数据类型仅支持COMPELX64，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize，fftSize）。 对纵向FFT，输入的shape为（ fftSize，batchSize）。 |
| outData | Output | aclTensor \* | 公式中的y，Device侧的Tensor，数据类型仅支持COMPELX64，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize，fftSize）。 对纵向FFT，输入的shape为（ fftSize，batchSize）。 |


- asdFftExecC2R| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| inData | Input | const aclTensor \* | 公式中的x，Device侧的Tensor，数据类型仅支持COMPELX64，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize ，fftSize / 2 + 1）。 对纵向FFT，输入的shape为（ fftSize / 2 + 1，batchSize）。 |
| outData | Output | aclTensor \* | 公式中的y，Device侧的Tensor，数据类型仅支持FLOAT32，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize，fftSize）。 对纵向FFT，输入的shape为（ fftSize，batchSize）。 |


- asdFftExecR2C| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| inData | Input | const aclTensor \* | 公式中的x，Device侧的Tensor，数据类型仅支持FLOAT32，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize，fftSize）。 对纵向FFT，输入的shape是（ fftSize，batchSize ）。 |
| outData | Output | aclTensor \* | 公式中的y，Device侧的Tensor，数据类型仅支持COMPELX64，数据格式支持ND。 对横向FFT，输入的shape为（ batchSize ，fftSize / 2 + 1）。 对纵向FFT，输入的shape为（ fftSize / 2 + 1，batchSize）。 |


- asdFftExecC2CSeparated| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| inputReal | Input | const aclTensor \* | 公式中的x的实部，输入的实部，数据类型仅支持FLOAT32，数据格式支持ND，输入的shape为（batchSize，fftSize）。 |
| inputImag | Input | const aclTensor \* | 公式中的x的虚部，输入的虚部，数据类型仅支持FLOAT32，数据格式支持ND，输入的shape为（batchSize，fftSize）。 |
| outputReal | Output | const aclTensor \* | 公式中的y的实部，输出的实部，数据类型仅支持FLOAT32，数据格式支持ND，输入的shape为（batchSize，fftSize）。 |
| outputImag | Output | const aclTensor \* | 公式中的y的虚部，输出的虚部，数据类型仅支持FLOAT32，数据格式支持ND，输入的shape为（batchSize，fftSize）。 |


#### 返回值说明

返回值相关说明参见返回值。


#### 约束说明

FFT_1D均不支持本地更新，即不允许输入tensor和输出tensor是同一个tensor。

- asdFftMakePlan1D

  - 对横向FFT：

    - fftSize需保证不超过2^27且分解质因数后不包含超过199的质因子。
    - batchSize在存储允许范围内应无额外约束。
    - 输入的元素个数理论支持[1，2^30]。
    - 当前功能实现所限，横向FFT输入长度（fftSize）大于等于32768且为2的幂的时候，会修改输入数据，需提前做好备份。
  - 对纵向FFT：

    - fftSize需保证是2的幂且大于等于256、小于等于65536。
    - batchSize需保证是128的整数倍。
    - 输入的元素个数理论支持[1，2^30]。
  - 输入的元素不支持inf、-inf和nan，如果输入中包含这些值, 那么结果为未定义。
- asdFftExecC2C
  无。

- asdFftExecC2R
  无。

- asdFftExecR2C
  无。

- asdFftExecC2CSeparated
  信号长度范围[2, 256]。


#### 调用示例

算子的调用示例参见FFT_1D。
