Istft
产品支持情况
|
硬件型号 |
支持情况 |
|---|---|
|
|
不支持 |
|
|
不支持 |
|
|
不支持 |
|
|
支持 |
|
|
不支持 |
功能描述
接口功能
- asdFftIstftMakePlan:
- 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 *
Device侧的Tensor,数据格式支持ND
shape:[win_length]
数据类型:仅支持COMPELX64
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,如果输入中包含这些值, 那么结果为未定义。
调用示例
算子的调用示例参见Istft。