TI C64X+通用库函数使用手册
在使用前,当知悉以下几点:
函数进程由手动汇编而成,已充分发挥器件效率。同时TI对外提供C和线性汇编代码
对于个人一些特殊应用,DSPLIB可能会带来额外的cycle消耗
TI DSPLIB依平台和时间变迁均会发生变动,具体使用时应参照手册描述小心使用
使用注意事项
1. 几乎所有的数组访问都要求字/双字对齐,建议均使用双字对齐。
2. TI给出了每个库函数的cycle消耗情况,其假设所有的代码和数据访问都发生在L1 cache中,如果存储访问发生在L2/片外存储器,实际消耗cycle数将增大。
3. 部分函数的输入参数要注意压缩以防止溢出(如FIR和FFT的计算函数)。
4. 库函数进程分为全可中断(Fully-interruptible)、部分可中断(Partially-interruptible)和不可中断(Non-interruptible)三种。但所有的库函数都可用于带中断的系统,也无需在调用它们前去关中断,函数内部会按需进行关中断处理。中断也可以发生在函数处理的任何时候,只不过函数的中断类型决定了中断处理程序将被库函数延迟多长时间处理。
使用方法
1. 包含rts6400.lib(非必须)和dsp64x.lib。
2. 包含对应头文件(不同库函数对应不同头文件)。
库函数概览
1. 自适应滤波器(Adaptive Filtering)
LMS自适应滤波器,每次调用计算一个数据点
long DSP_firlms2(short *h, short *x, short b, int nh)
h[nh]:滤波器系数,调用后被内部更新
x[nh+1]:前nh个数据加一个新数据构成
b:前一次滤波计算的误差项
nh:滤波系数个数,4N
2. 自相关(AutoCorrelation)
void DSP_autocor(short *r, short *x, int nx, int nr)
x[nx+nr]:前nx个数据加nr个新数据构成,双字对齐
r[nr]:nr个自相关输出
nx:相关器长度,8N
nr:相关滑动点数,4N
3. 快速傅里叶变换(FFT)
旋转因子均需调用专门的产生函数
16*16复数FFT,实部和虚部交错存放,实部在偶下标,虚部在奇下标
void DSP_fft16x16(short *w, int nx, short *x, short *y)
w[2nx]:复数旋转因子,Q15,双字对齐
x[2nx]:复数输入,双字对齐
y[2nx]:复数输出,双字对齐
nx:FFT点数,2^N,16 ≤ nx ≤ 65536
与DSP_fft16x16()区别在于虚部和实部交换位置存放,虚部在偶下标,实部在奇下标
void DSP_fft16x16_imre(short *w, int nx, short *x, short *y)
16*16复数前混合基FFT,带取整。用于计算一个混合基数主FFT的子FFT。实部和虚部交错存放,实部在偶下标,虚部在奇下标
void DSP_fft16x16r(int nx, short *x, short *w, short *y, int radix, int offset, int nmax)
w[2nx]:复数旋转因子,Q15,双字对齐
x[2nx]:复数输入,双字对齐,需压缩2^(log2(nx)?ceil[log4(nx)?1])以防止溢出
y[2nx]:复数输出,双字对齐
nx:FFT点数,2^N,16 ≤ nx ≤ 65536
radix:将FFT分解成子FFT的基数
offset:子FFT相对于主FFT起始处的复数下标
nmax:主FFT的复数样点个数
16*32复数FFT,实部和虚部交错存放,实部在偶下标,虚部在奇下标
void DSP_fft16x32(short *w, int nx, int *x, int *y)
w[2nx]:复数旋转因子,Q15,双字对齐
x[2nx]:32bit复数输入,双字对齐,需压缩2^(log2(nx)?ceil[log4(nx)?1])以防止溢出
y[2nx]:32bit复数输出,双字对齐
nx:FFT点数,2^N,16 ≤ nx ≤ 65536
32*32复数FFT,实部和虚部交错存放,实部在偶下标,虚部在奇下标
void DSP_fft32x32(short *w, int nx, int *x, int *y)
w[2nx]:复数旋转因子,Q31,双字对齐,scale factor = 2147483647.5
x[2nx]:32bit复数输入,双字对齐,需压缩2^log2(nx)以防止溢出
y[2nx]:32bit复数输出,双字对齐
nx:FFT点数,2^N,16 ≤ nx ≤ 65536
32*32带压缩的复数FFT,实部和虚部交错存放,实部在偶下标,虚部在奇下标
void DSP_fft32x32s(short *w, int nx, int *x, int *y)
w[2nx]:复数旋转因子,Q31,双字对齐,scale factor = 1073741823.5
x[2nx]:32bit复数输入,双字对齐,需压缩2^(log2(nx)?ceil[log4(nx)?1])以防止溢出
y[2nx]:32bit复数输出,双字对齐
nx:FFT点数,2^N,16 ≤ nx ≤ 65536
16*16复数逆FFT,类似于DSP_fft16x16()。使用DSP_fft16x16()将输入取共轭,再将输出取共轭,可获得DSP_ifft16x16()相同的效果
void DSP_ifft16x16(short *w, int nx, short *x, short *y)
16*32复数逆FFT,类似于DSP_fft16x32(),输入x需压缩2^log2(nx)以防止溢出
void DSP_ifft16x32(short *w, int nx, short *x, short *y)
32*32复数逆FFT,类似于DSP_fft32x32()
void DSP_ifft32x32(short *w, int nx, short *x, short *y)
4. 滤波器和卷积(Filtering and Convolution)
复数FIR滤波器
void DSP_fir_cplx (short *x, short *h, short *r, int nh, int nr)
x[2*(nr+nh-1)]:复数输入,前2*(nh-1)个数据加新的2nr个数据
h[2nh]:滤波器系数,复数
r[2nr]:复数输出,内部用32bit存放临时结果,输出时右移15位
nh:系数个数,2N
nr:输出样点数,4N
复数FIR滤波器,与DSP_fir_cplx()区别在于nh满足4N
void DSP_fir_cplx _hM4X4( (short *x, short *h, short *r, int nh, int nr)
FIR滤波器
void DSP_fir_gen (short *x, short *h, short *r, int nh, int nr)
x[nr+nh-1]:输入,前nh-1个数据加新的nr个数据
h[nh]:滤波器系数
r[nr]:输出,内部用32bit存放临时结果,输出时右移15位
nh:系数个数,nh≥5
nr:输出样点数,4N
FIR滤波器,与DSP_fir_gen()区别在于nr满足8N
void DSP_fir_gen_hM17_rA8X8 (short *x, short *h, short *r, int nh, int nr)
FIR滤波器,与DSP_fir_gen()区别在于nh满足4N,且nh≥8
void DSP_fir_r4 (short *x, short *h, short *r, int nh, int nr)
FIR滤波器,与DSP_fir_gen()区别在于nh满足8N
void DSP_fir_r8 (short *x, short *h, short *r, int nh, int nr)
FIR滤波器,与DSP_fir_gen()区别在于nh满足8N,且nh≥16;nr满足8N
void DSP_fir_r8_hM16_rM8A8X8 (short *x, short *h, short *r, int nh, int nr)
FIR滤波器,只需提供原滤波系数的一半(对称缘故)
void DSP_fir_sym (short *x, short *h, short *r, int nh,int nr, int s)
x[nr+2nh]:输入,前2nh个数据加新的nr个数据
h[nh+1]:滤波器系数,原滤波系数的一半
r[nr]:输出,内部用32bit存放临时结果,输出时右移s位
nh:系数个数,原系数个数为2nh+1,8N
nr:输出样点数,4N
IIR滤波器,输入单个数据,输出单个数据,状态向量b被内部更新,返回滤波结果
short DSP_iir(short x, short *h, int nh, short *b)
x:输入数据
h[nh]:滤波器系数,Q14
nh:系数个数8N
b[nh]:状态向量
全极型IIR格型滤波器,滤波器由nk级格点构成
void DSP_iir_lat(short *x, int nx, short *k, int nk, int *b, short *r)
x[nx]:输入数据
k[nk]:反射系数,Q15
b[nk+1]:前一次调用的延迟线数据,应初始化为0
r[nx]:输出数据
nx:输入长度
nk:反射系数个数,2N,且nk≥4
5. 数学(Math)
向量x和向量y做点乘,将y的平方累加至G并返回
int DSP_dotp_sqr(int G, short *x, short *y, int *r, int nx)
G:y^2累加值
x[nx]:输入数据向量1
y[nx]:输入数据向量2
r[nx]:x和y的点乘结果
nx:数据长度,4N,且N≥12
返回向量x和向量y的点乘和
int DSP_dotprod(short *x, short *y, int nx)
x[nx]:输入数据向量1
y[nx]:输入数据向量2
nx:数据长度,4N
返回向量的最大值
short DSP_maxval (short *x, int nx)
x[nx]:输入数据向量1
nx:数据长度,8N,且N≥32
返回向量的最小值
short DSP_minval (short *x, int nx)
x[nx]:输入数据向量1
nx:数据长度,4N,且N≥8
返回向量的最大值对应的下标
int DSP_maxidx (short *x, int nx)
x[nx]:输入数据向量1
nx:数据长度,16N,且N≥32
32x32数据乘法,输出乘积的高32位,输入应定标为Q31
void DSP_mul32(int *x, int *y, int *r, short nx)
x[nx]:输入数据向量1
y[nx]:输入数据向量2
r[nx]:x和y的乘积结果
nx:数据长度,8N,且N≥16
向量取反
void DSP_neg32(int *x, int * r, short nx)
x[nx]:输入数据向量
r[nx]:输出数据向量,*r = -*x
nx:数据长度,4N,且N≥8
返回数据倒数的小数和指数部分(浮点表示法)
void DSP_recip16(short *x, short *rfrac, short *rexp, short nx)
x[nx]:输入数据向量1
rfrac[nx]:输出小数部分值
rexp[nx]:输出指数部分值
nx:数据长度
返回向量数据的平方和
int DSP_vecsumsq (short *x, int nx)
x[nx]:输入数据向量
nx:数据长度,4N,且N≥8
加权和:*r = m*(*x)>>15 + *y
void DSP_w_vec(short *x, short *y, short m, short *r, short nx)
x[nx]:被加权数据向量1
y[nx]:输入数据向量2
r[nx]:输出数据向量
nx:数据长度,8N,且N≥8
4.6 矩阵(Matrix)
矩阵乘法:r[r1*c2] = x[r1*c1] * y[c1*c2]
void DSP_mat_mul(short *x, int r1, int c1, short *y, int c2, short *r, int qs)
x[r1*c1]:输入矩阵x
r1:矩阵x的行数,1~32767
c1:矩阵x的列数/矩阵y的行数,1~32767
y[c1*c2]:输入矩阵y
c2:矩阵y的列数,1~32767
r[r1*c2]:输出矩阵.
qs:元素结果的右移位数
矩阵转置(行列互换)
void DSP_mat_trans(short *x, short rows, short columns, short *r)
x[rows*columns]:输入矩阵
rows:矩阵的行数,4N
columns:矩阵的列数,4N
r[columns*rows]:输出矩阵
4.7 其它
计算一个向量元素的最小无效位,可用于寻找数据块的缩放因子
short DSP_bexp(const int *x, short nx)
x[nx]:输入数据向量
nx:数据长度,8N
数据终结方式置换(big<->little),16bit
void blk_eswap16(void * restrict x, void * restrict r, int nx)
x[nx]:输入数据向量
r[nx]:输出数据向量,如果指针为空,则数据返回至x
nx:数据长度,8N,且N≥8
同blk_eswap16(),32bit
void blk_eswap32(void * restrict x, void * restrict r, int nx)
同blk_eswap16(),64bit
void blk_eswap64(void * restrict x, void * restrict r, int nx)
数据块搬移
void DSP_blk_move(short * restrict x, short * restrict r, int nx)
x[nx]:输入数据向量
r[nx]:目标数据向量
nx:数据长度,8N,且N≥32
将IEEE浮点数转化为Q15定点数
void DSP_fltoq15(float *x, short *r, short nx)
x[nx]:输入浮点向量,[-1,1)
r[nx]:输出定点向量,Q15
nx:数据长度,2N
Q15定点数转化为IEEE浮点数
void DSP_q15tofl(short * restrict x, float * restrict r, short nx)
x[nx]:输入定点向量,Q15
r[nx]:输出浮点向量
nx:数据长度,2N
参考文献
【1】TMS320C64x+ DSP Little-Endian DSP Library Programmer’s Reference--SPRUEB8B,2008.
·END·
欢迎来我的微信公众号做客:信号君
专注于信号处理知识、高性能计算、现代处理器&计算机体系
技术成长 | 读书笔记 | 认知升级
幸会~
TI C64X+通用库函数使用手册的更多相关文章
- ubuntu 安装 c语言的库函数man手册
安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo apt-get insta ...
- Ubuntu下C/C++man手册安装方法及使用方法
C++在线文档: http://www.cplusplus.com/reference/ https://msdn.microsoft.com/zh-cn/library/aa187916.aspx ...
- Linux的man手册共有以下几个章节
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 1.Standard commands (标准命令) 2. ...
- Linux下C/C++帮助手册安装方法
1. 安装C的帮助手册 如果你使用的Linux发行版, 默认没有安装C语言的库函数MAN手册, 使用下面的方法解决: # sudo apt-get install manpages # sudo a ...
- 关于TI公司DSP工程调用DELAY_US()进入非法中断问题的解决
最近笔者在调试一个DSP程序时,发现在ad外设初始化时无法正常执行,单步检查,发现当执行到调用 DELAY_US(1000);语句时,就跳入非法. 进一步追查,DELAY_US()是宏定义函数,在笔者 ...
- IAR新建MSP430工程
一.在IAR官网下载IAR for MSP430 软件 https://www.iar.com/iar-embedded-workbench/#!?architecture= 选择MSP430,然后 ...
- bootloader 详细介绍
Bootloader 对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程.嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作Bootloader. 6.1.1 Bootloader ...
- ltp 测试流程及测试脚本分析
LTP介绍 (2011-03-25 18:03:53) 转载▼ 标签: ltp linux 压力测试 杂谈 分类: linux测试 LTP介绍 一.LTP介绍1.简介LTP(Linux Test Pr ...
- 计算机电子书 2017 BiliDrive 备份
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 斯坦福 cs224d 深度学习与自然语言处 ...
随机推荐
- personalWebsite_1:历史记录汇总
最开始,根据 https://blog.csdn.net/zbl1146556298/article/details/79714239 进行网站构思设计,根据源码, 1.把gradle项目转为mav ...
- 使用AOP监控用户操作并插入数据库
引入依赖 <!--spring切面aop依赖--> <dependency> <groupId>org.springframework.boot</group ...
- A promise tomorrow is worth a lot less than trying today.
A promise tomorrow is worth a lot less than trying today.明日的承诺远不及今日的行动.
- git学习(一)
提: 远程的主机名(远程仓库服务器名): origin 本地的主分支: master(本地master分支) 远程的主分支: maste(远程仓库的master分支) gi ...
- Node.js | 你的物联网系统,有个管家待认领
很多时候,专业的事情都要交给专业的人来做,才会更放心. 例如买了套房,交房装修完毕,欢天喜地入住后,房子的日常养护和维护之类的事情,都由谁来负责呢? 物业呗~买了房子就自然需要房子所在小区提供的物业服 ...
- Extjs4.1+desktop+SSH2 搭建环境 项目能跑起来
linux开发感觉可能就是日常办公的时候,用别的软件会有问题,java开发还是没什么区别的,换回window开发: push 它: 每次看到右上那红红的叉,我还以为又出错了: 这个项目用resin,下 ...
- python_51_函数返回值1
def test1(): '只执行return以前的' print('test1返回值为0 ') return 0 print('这句不会被执行的') x=test1() print(x)#值为0 d ...
- 小w的糖果
题目连接 : https://ac.nowcoder.com/acm/contest/923/C 算是一道找规律的题了,因为后一个人会比前一个人多,可以理解成后一个人要继承前一个人,sum为当前糖果数 ...
- javaweb基础(25)_jsp标签实例一
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
- 【luogu P5022 旅行】 题解
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...