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·

想进一步跟踪本博客动态,欢迎关注我的个人微信订阅号:信号君

信号君:寻求简单之道

技术成长 | 读书笔记 | 认知升级

扫描二维码关注信号君

原文地址:https://www.cnblogs.com/ncdxlxk/p/9220516.html

时间: 2024-10-10 14:01:09

TI C64X+通用库函数使用手册的相关文章

TI DSP FFT库函数

在目录c64plus\dsplib_v210\src\DSP_fft16x16,包含了三个层次的FFT库函数,分别是natural C version, intrinsic C version, serial SA version,最后一个是汇编级.在DSP_fft16x16_d.c中有三个测试用例对比耗时.三个函数用法差不多,例如: void DSP_fft16x16_cn ( const short * ptr_w, int npoints, short * ptr_x, short * p

MariaDB通用二进制部署手册

1. 添加数据库运行时的用户身份 groupadd -r -g 306 mysql useradd -r  -u 306 -g 306 mysql 2. 解压并放到指定位置/usr/local tar -zxvf mariadb-5.5.46-linux-x86_64.tar.gz mv mariadb-5.5.46 && mv mariadb-5.5.46 /usr/local/mysql 修改权限确保安全 chown -R root:mysql /usr/local/mysql 3. 

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

安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo apt-get install manpages-de-dev sudo apt-get install manpages-dev 2.POSIX函数帮助文档 sudo apt-get install manpages-posix sudo apt-get install manpages-posix-dev 3.内核函数

linux中man手册的高级用法

Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux 的man手册共有以下几个章节: 1.Standard commands (标准命令) 2.System calls (系统调用) 3.Library functions (库函数) 4.Special devices (设备说明) 5.File formats (文件格式) 6.Games and toys (游戏和娱乐) 7.Miscellaneous (杂项) 8.Administ

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

最近笔者在调试一个DSP程序时,发现在ad外设初始化时无法正常执行,单步检查,发现当执行到调用 DELAY_US(1000);语句时,就跳入非法. 进一步追查,DELAY_US()是宏定义函数,在笔者的程序中实际调用的是F28x_usDelay(),而这个函数是TI提供的库函数,因为笔者使用了基于FLASH的CMD文件,所以这个函数被分配在FLASH中,但需要复制到RAM中运行. 仔细检查了笔者的程序,发现复制相关函数到ram区的代码部分,即 memcpy(&RamfuncsRunStart,

(转载)Linux man命令的使用方法

Linux man命令的使用方法(整理收集自网络) Linux提供了丰富的帮助手册,使用Linux man命令来查看一些不熟悉的命令的使用方法,还可以用来查询系统库文件中的一些函数定义和使用方法. Linux man中的man就是manual的缩写,用来查看系统中自带的各种参考手册,但是手册页分为好几个部分,如下所示: 1 Executable programs or shell commands 2 System calls (functions provided by the kernel)

计算机电子书 2017 BiliDrive 备份

下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 斯坦福 cs224d 深度学习与自然语言处理讲义.epub (2.87 MB) bdrive://2771ca27aa5f0eb73bcf9591ee127c2d51270617 Matplotlib 用户指南.epub (4.67 MB) bdrive://0376e03bdbf46d1670cd8d955ccde094e226a2f8 OllyD

LTP 第一章 LTP介绍及内部机制

https://blog.csdn.net/yuanlaijike/article/details/78068331 LTP 第一章 LTP介绍及内部机制原创Jitwxs 发布于2017-09-23 03:21:58 阅读数 3993 收藏展开LTP系列链接: 第一章 LTP介绍及内部机制 第二章 开发Shell测试集 第三章 开发系统调用测试集 第四章 开发_exit()测试集 第五章 开发IO操作测试集 第六章 开发IO阻塞测试集 文章目录1.1 LTP介绍1.1.1 功能测试1.1.2 回

运放参数解释及常用运放选型

集成运放的参数较多,其中主要参数分为直流指标和交流指标,外加所有芯片都有极限参数.本文以NE5532为例,分别对各指标作简单解释.下面内容除了图片从NE5532数据手册上截取,其它内容都整理自网络. 极限参数 主要用于确定运放电源供电的设计(提供多少V电压.最大电流不能超过多少),NE5532的极限参数如下: 直流指标 运放主要直流指标有输入失调电压.输入失调电压的温度漂移(简称输入失调电压温漂).输入偏置电流.输入失调电流.输入偏置电流的温度漂移(简称输入失调电流温漂).差模开环直流电压增益.