在使用前,当知悉以下几点:

  • 函数进程由手动汇编而成,已充分发挥器件效率。同时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+通用库函数使用手册的更多相关文章

  1. ubuntu 安装 c语言的库函数man手册

    安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo apt-get insta ...

  2. Ubuntu下C/C++man手册安装方法及使用方法

    C++在线文档: http://www.cplusplus.com/reference/ https://msdn.microsoft.com/zh-cn/library/aa187916.aspx  ...

  3. Linux的man手册共有以下几个章节

    Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 1.Standard commands (标准命令) 2. ...

  4. Linux下C/C++帮助手册安装方法

    1.  安装C的帮助手册 如果你使用的Linux发行版, 默认没有安装C语言的库函数MAN手册, 使用下面的方法解决: # sudo apt-get install manpages # sudo a ...

  5. 关于TI公司DSP工程调用DELAY_US()进入非法中断问题的解决

    最近笔者在调试一个DSP程序时,发现在ad外设初始化时无法正常执行,单步检查,发现当执行到调用 DELAY_US(1000);语句时,就跳入非法. 进一步追查,DELAY_US()是宏定义函数,在笔者 ...

  6. IAR新建MSP430工程

    一.在IAR官网下载IAR for MSP430 软件 https://www.iar.com/iar-embedded-workbench/#!?architecture= 选择MSP430,然后 ...

  7. bootloader 详细介绍

    Bootloader 对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程.嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作Bootloader. 6.1.1  Bootloader ...

  8. ltp 测试流程及测试脚本分析

    LTP介绍 (2011-03-25 18:03:53) 转载▼ 标签: ltp linux 压力测试 杂谈 分类: linux测试 LTP介绍 一.LTP介绍1.简介LTP(Linux Test Pr ...

  9. 计算机电子书 2017 BiliDrive 备份

    下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 斯坦福 cs224d 深度学习与自然语言处 ...

随机推荐

  1. 性能测试学习第二天_性能测试工具概述Loadrunner介绍

    性能测试工具概述Loadrunner介绍 http://www.51testing.com/html/42/n-6542.html 其中,T直接影响用户体验时间 性能测试的原理: 记录一个访问过程的通 ...

  2. Chapter 18 MySQL NDB Cluster 7.3 and NDB Cluster 7.4渣翻

    Table of Contents 18.1 NDB Cluster Overview      18.2 NDB Cluster Installation      18.3 Configurati ...

  3. elasticsearch.yml基本配置说明

    一.基本配置 elasticsearch的config文件夹里面有两个配置文 件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是 ...

  4. 30分钟学会React Hook, Memo, Lazy

    我们来学习React 16.8里的新特性. 1. 自行配置好React的环境,推荐你使用Create React APP, 你也可以下载本文档Zip解压到本地直接运行. https://github. ...

  5. jquery--实现类似淘宝星星评分功能

    -   不正之处,欢迎指正.^-^.好绕的话 贴码.html <body> <div id="div"> <ul> <li>☆< ...

  6. echarts使用中的那些事儿(一)

    近来由于有几个小项目要用到echarts里的一些图,不得不使用,可是要完全按照自己的意愿来,要对它有些了解,要翻阅资料,遂有以下小结: 1.最开始第一步是把数据调出来就行,能在图上显示就成,以下是最开 ...

  7. 零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出

    1 多字节字符 ASCII码表:0 ~ 2^7-1 扩展ASCII码表:2^7 ~ 2^8-1 什么是GB2312:1980年,两个字节存储一个汉字:不通用,别国会有乱码. UCICODE:只有一个字 ...

  8. JavaScript_HTML DEMO_1_概念

    HTML DOM - 文档对象模型 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). 1. 通过可编程的对象模型,JavaScript获得了足够的能力来创 ...

  9. C++ list类详解

    转自:http://blog.csdn.net/whz_zb/article/details/6831817 双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素 ...

  10. 那些年,被我蠢哭了的php代码小错误~~~

    首先,我爱敲代码!!!而且我很喜欢修改bug,在看到那些bug的时候,我是兴奋的,毕竟当你解决这个bug之后感觉是很爽的. 在学习的过程中,看到无数的bug,有一些错误是很微小的,一般在PHP中都能通 ...