rsInterpolationBySinc
功能描述
计算公式
- 计算公式:
,其中n为实信号索引,x[n]为原实信号序列,sinc(d-n)是插值系数,在本算子中需要作为参数传入。
- 示例:
[ 1 + i , 2 + i ]
输入“sincTab”为:(intp_num = 2, quant_num = 2)
[ [ 1 , 0 ], [ 0.5 , 0.5 ], [ 0 , 1 ] ]
原始“pos”为:
[ 0.2 , 1.6 ]
转为输入“posFloor”为: floor(Pos)
[ 0 , 1 ]
转为输入“posToTabIndex”为:round((Pos -posFloor) *quant_num)
[ 0 , 1 ]
其中,tab大小为2 * 3。由于pos[0] = 0.2,取inputTensor[0]及后面一个元素inputTensor[1]共2个元素,与sincTab[posToTabIndex[0]]进行向量点乘,得到outputTensor[0],依次计算后续元素。计算
pos[0] = 0.3 → outputTensor[0] = [1 + i , 2 + i] · [ 1 , 0 ] = 1 + i pos[1] = 1.6 → outputTensor[1] = [2 + i , 2 + i] · [ 0.5 , 0.5 ] = 2 + i
调用“rsInterpolationBySinc”算子后,
输出“outputTensor”为:
[ 1 + i , 2 + i ]
接口原型
- AspbStatus rsInterpolationBySincGetWorkspaceSize(const aclTensor *inputTensor, const aclTensor *sincTab,const aclTensor *posFloor, const aclTensor *posToTabIndex,aclTensor *outputTensor, int interpNum, int quantNum, int length,size_t *workspaceSize)
- AspbStatus rsInterpolationBySinc(const aclTensor *inputTensor, const aclTensor *sincTab,const aclTensor *posFloor, const aclTensor *posToTabIndex,aclTensor *outputTensor, int interpNum, int quantNum, int interpLength,void *stream, void *workSpace = nullptr)
参数列表
- rsInterpolationBySincGetWorkspaceSize
参数名称
Input/Output
类型
描述
inputTensor
Input
const aclTensor *
原始信号,Device侧的Tensor,数据类型支持COMPLEX64,数据格式支持ND,shape为[batch, signalLength]
sincTab
Input
const aclTensor *
插值系数矩阵,Device侧的Tensor,数据类型支持FLOAT32,数据格式支持ND,shape为[ 4, ((quantNum + 1) * 2) * (interpNum * 2 + 8)] 。
posFloor
Input
const aclTensor *
插值点坐标向下取整后的值,Device侧的Tensor,数据类型支持INT32,数据格式支持ND,shape为[batch, length]。
posToTabIndex
Input
const aclTensor *
插值点坐标通过round((Pos -posFloor) *quantNum)计算出对应插值系数矩阵的行号,Device侧的Tensor,数据类型支持INT16_T,数据格式支持ND,shape为[batch, length]。
outputTensor
Output
aclTensor *
插值结果,Device侧的Tensor,数据类型支持COMPLEX64,数据格式支持ND,shape为[batch, length]。
interpNum
Input
int
插值点数。
quantNum
Input
int
量化点数。
length
Input
int
插值长度。
workspaceSize
Output
size_t *
rsInterpolationBySinc算子所需要的workspace。
-
参数名称
Input/Output
类型
描述
inputTensor
Input
const aclTensor *
原始信号,Device侧的Tensor,数据类型支持COMPLEX64,数据格式支持ND,shape为[batch, signalLength]
sincTab
Input
const aclTensor *
插值系数矩阵,Device侧的Tensor,数据类型支持FLOAT32,数据格式支持ND,shape为[ 4, ((quantNum + 1) * 2) * (interpNum * 2 + 8)] 。
posFloor
Input
const aclTensor *
插值点坐标向下取整后的值,Device侧的Tensor,数据类型支持INT32,数据格式支持ND,shape为[batch, length]。
posToTabIndex
Input
const aclTensor *
插值点坐标通过round((Pos -posFloor) *quantNum)计算出对应插值系数矩阵的行号,Device侧的Tensor,数据类型支持INT16,数据格式支持ND,shape为[batch, length]。
outputTensor
Output
aclTensor *
插值结果,Device侧的Tensor,数据类型支持COMPLEX64,数据格式支持ND,shape为[batch, length]。
interpNum
Input
int
插值点数。
quantNum
Input
int
量化点数。
length
Input
int
插值长度。
stream
Input
void *
npu执行流。
workSpace
Input
void *
workspace的地址
规格约束
- rsInterpolationBySincGetWorkspaceSize
- rsInterpolationBySinc
- 输入的元素个数理论支持[1,3.93e+09];
- 算子输入shape为[batch, signalLength]、[ 4, ((quantNum + 1) * 2) * (interpNum * 2 + 8)] 、[batch, length]、[batch, length],输出shape为[batch, length];
- 算子实际计算时,不支持ND高维度运算(不支持维度≥3的运算);
- interpNum只支持偶数,通常使用 [8 ,12 ,16] ,当前版本最大支持16;
- quantNum为2的幂,最大32;
- inputTensor、posFloor、posToTabIndex第0维是相同的batch数,outTensors长度和posFloor、posToTabIndex一致。
- sincTab:为了将复数点乘转化为实数点乘以及更亲和NPU和需要进行预处理,需要扩充成[ ((quantNum + 1) * 2) * (interpNum * 2 + 8) * 4] ,具体算法参考rsInterpolationBySinc示例源码中预处理内容。