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

#### 产品支持情况

| 硬件型号 | 支持情况 |
| --- | --- |
| Atlas 200I/500 A2 推理产品 | 不支持 |
| Atlas 推理系列产品 | 不支持 |
| Atlas 训练系列产品 | 不支持 |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | 支持 |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | 不支持 |


#### 功能描述

接口功能

- asdFftIstftMakePlan：初始化该句柄对应的istft配置。

- asdFftExecIstft：执行逆短时傅里叶变换。

计算公式

istft函数用于进行逆短时傅里叶变换，它的目标是将stft得到的频域数据转换回时域信号，是stft的逆运算。短时距傅里叶变换是可逆的，也就是说原本的信号可以借由反短时距傅里叶变换将短时距傅里叶变换后的信号还原。其中最广为接受的反短时距傅里叶变换方法是重叠-相加之卷积法。

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


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


而重叠-相加之卷积法( Overlap-add method ) 是一种区块卷积 ( block convolution, sectioned convolution )，可以有效的计算一个很长的信号 x[n]和一个FIR滤波器h[n]的离散卷积。


其中h[m]在 [1, M]之外为零。


#### 函数原型

- AspbStatus asdFftIstftMakePlan(asdFftHandle handle, const aclTensor *input, const int64_t nFft,const int64_t hopLengthOpt, const int64_t winLengthOpt,const bool center, const bool normalized, const bool onesidedOpt,const int64_t lengthOpt, const bool returnComplex)

- AspbStatus asdFftExecIstft(asdFftHandle handle, const aclTensor *input, const aclTensor *windowOpt, const aclTensor *output)


#### 参数说明

- asdFftIstftMakePlan| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| input | Input | aclTensor \* | 公式中的x，Device侧的Tensor，数据格式支持ND，格式预期与stft输出相同。 数据类型：仅支持COMPELX64 shape：(B, N, T) 其中， B 是批处理维度 N 是频率样本的数量，对于 onesided为true， 输入为 (n\_fft // 2) + 1，否则为 n\_fft。 T 是帧的数量，对于中心填充的 stft 为 1 + length // hop\_length，否则为 1 + (length \- n\_fft) // hop\_length。 |
| nFft | Input | int64\_t | 傅里叶变换的大小 |
| hopLengthOpt | Input | int64\_t | 相邻滑动窗口帧之间的距离，0 < hopLengthOpt <= nFft |
| winLengthOpt | Input | int64\_t | 窗口帧长度，winLengthOpt = nFft |
| center | Input | bool | 表示是否对input的两侧进行了填充，默认等于true，当前版本只支持true |
| normalized | Input | bool | 表示STFT是否已标准化，默认等于false，当前版本只支持false |
| onesidedOpt | Input | bool | 表示STFT是否为onesided，默认等于false，当前版本只支持false |
| lengthOpt | Input | int64\_t | 信号将被修剪的量（即原始信号长度），对于中心填充的stft，默认为 (T \- 1) \* hop\_length，否则为 n\_fft + (T \- 1) \* hop\_length，其中 T 是输入帧的数量。 当前版本不支持该参数，默认为0 |
| returnComplex | Input | bool | 输出是否应为复数，默认为True，当前版本只支持True |


- asdFftExecIstft| 参数名称 | Input/Output | 类型 | 描述 |
| --- | --- | --- | --- |
| handle | Input | asdFftHandle | FFT算子的句柄，需要手动申请创建asdFftHandle对象。 |
| input | Input | aclTensor \* | 公式中的x，Device侧的Tensor，数据格式支持ND，格式预期与stft输出相同。 数据类型：仅支持COMPELX64 shape：(B, N, T) 其中， B 是批处理维度 N 是频率样本的数量，对于 onesided为true， 输入为 (n\_fft // 2) + 1，否则为 n\_fft。 T 是帧的数量，对于中心填充的 stft 为 1 + length // hop\_length，否则为 1 + (length \- n\_fft) // hop\_length |
| windowOpt | Input | aclTensor \* | 公式中的w，Device侧的Tensor，数据格式支持ND shape：[win\_length] 数据类型：仅支持float |
| output | Output | aclTensor \* | Device侧的Tensor，数据格式支持ND。 shape：支持2维，（B, length） 数据类型：仅支持COMPLEX64 |


#### 返回值说明

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


#### 约束说明

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

▪ 为了使istft能够正确地重构信号，n_fft、hop_length、win_length、window、center和normalized这些参数必须与之前进行stft变换时使用的参数保持一致。

▪ 输入的元素不支持inf、-inf和nan，如果输入中包含这些值, 那么结果为未定义。

- asdFftIstftMakePlan
  ▪ nFft需保证不超过1500且分解质因数后不包含超过199的质因子。

  ▪ 当前功能实现所限，nFft大于等于32768且为2的幂的时候，会修改输入数据，需提前做好备份。

  ▪ hopLengthOpt <= 1500

- asdFftExecIstft
  ▪ windowOpt tensor数值不能有接近零的最小值，否则结果未定义。


#### 调用示例

算子的调用示例参见Istft。
