TI为它的DSP各系列芯片提供了高效实现的库函数,囊括通用领域和一些专用领域。本文集中介绍TI C64X+平台的通用库函数,包括其类别,具体功能以及使用注意事项等。

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

  • 函数进程由手动汇编而成,已充分发挥器件效率。同时TI对外提供C和线性汇编代码
  • 对于个人一些特殊应用,DSPLIB可能会带来额外的cycle消耗
  • TI DSPLIB依平台和时间变迁均会发生变动,具体使用时应参照手册描述小心使用

使用注意事项

  • 几乎所有的数组访问都要求字/双字对齐,建议均使用双字对齐。
  • TI给出了每个库函数的cycle消耗情况,其假设所有的代码和数据访问都发生在L1 cache中,如果存储访问发生在L2/片外存储器,实际消耗cycle数将增大。
  • 部分函数的输入参数要注意压缩以防止溢出(如FIR和FFT的计算函数)。
  • 库函数进程分为全可中断(Fully-interruptible)、部分可中断(Partially-interruptible)和不可中断(Non-interruptible)三种。但所有的库函数都可用于带中断的系统,也无需在调用它们前去关中断,函数内部会按需进行关中断处理。中断也可以发生在函数处理的任何时候,只不过函数的中断类型决定了中断处理程序将被库函数延迟多长时间处理。
  • 大部分函数对输入数组参数的大小有特殊要求(内部优化的需要),使用时需特别注意,使用不当将可能会引起输出错误。文中在描述数据长度要求时,使用xN表示数据长度应为x的倍数。
使用方法

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·

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

郑重·专业·有料

在公众号会话窗口中回复下列数字,访问对应的往期技术文章:

1. CORDIC算法(1):圆周旋转模式下计算三角函数和模值
2. 嵌入式编程中,你应该知道的定点化知识
3. TI C6000优化手册——让代码看起来像钉子
4. TI C6000 数据存储处理与性能优化

TI C64X+通用库函数使用手册相关推荐

  1. Honeywell EPKS通用中文操作手册

    Document Name Honeywell EPKS通用中文操作手册 Version 0_01 Status Approved Date March 21, 2022 Subject Techni ...

  2. Honeywell EPKS通用中文操作手册 (续)

    Document Name     Honeywell EPKS通用中文操作手册 Version                    0_01 Status                      ...

  3. 基于TI C64X DSP高清视频编、×××软硬件技术概要

    1 技术参数一览 Items Encoder Decoder 备注 硬件参数 CPU TMS320DM642(720MHz) 兼容C64X 视频D/A(A/D) ADV7401(74.25MHz) A ...

  4. C语言正函数nosign,C语言标准库函数查询手册.docx

    球锣宜软瘠旱塾3 abort 功能异常终止程序 头文件StdIib.h 语法 VOid abort(void); abs 功能整数的绝对值 头文件StdIib.h 语法 int abs(int: j) ...

  5. rhinopython python编辑器、按钮编辑器、debug、rhinoscriptsyntax库函数使用手册

    0.python编辑器 1.按钮编辑器 !-_EditPythonScript ( print('123') )#RunPythonScript和EditPythonScript一样功能,没有区别(大 ...

  6. TI C64X DSP中断向量表的配置(硬件中断)-- 转自新浪博客

    1. 编写中断服务例程 在.c源文件中编写ISR函数c_intXX,用于中断处理,如: interrupt void c_intXX (void) { -; } 注:对于硬件中断而言,XX = 00~ ...

  7. MSP430使用库函数上手

    暑假回东北参加了全国大学生智能汽车竞赛,可是学校不能住,只能回学校的实验室拿东西.于是就借了块MSP430F5529LP的开发板回来耍一耍,顺便准备一下电赛(去年也参加了,不过软件部分不是我负责的哈哈 ...

  8. TI Cotex M3/4单片机关于寄存器操作详解

    TI Cotex M3/4单片机关于寄存器操作详解 前备知识 寄存器与偏移量 位带操作.位带区 TI单片机寄存器操作详解 快速在TI的手册里面确认某外设某寄存器的确切地址 寄存器操作介绍 本文参考 前 ...

  9. 路由器配置与管理完全手册(Cisco篇)学习感想

    下面是转发自一位非常好,在电信工作的朋友对我的<路由器配置与管理完全手册--Cisco篇>一书所写的读后感,非常感谢!!他是位非常出色的电信工程师,而且非常所年轻(只能告诉大家,远没到30 ...

  10. ubuntu man手册完善

    ubuntu man手册完善 Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. sudo apt-get install manpages-dev s ...

最新文章

  1. 鲲鹏服务器拦截系统调用,鲲鹏服务器unicfg工具适配OpenEuler 20.03问题
  2. android运用 sqlite 实现简单的通讯录_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...
  3. springboot配置文件加载位置
  4. vc6.0打开工程出现程序崩了的原因
  5. CSS 魔法系列:纯 CSS 绘制基本图形(圆、椭圆等)
  6. python3多进程 queue 取值_【整理】python多进程之间共享queue | 勤奋的小青蛙
  7. MSF(二):msf外部/内部常用命令
  8. html表格美化代码,分享:记录一次使用纯CSS美化table表格的代码
  9. python列表有固定大小吗,使用python自己写了一个固定长度的list
  10. 去掉viewstate保持在页面中的一大串字符的方法
  11. 使用Fiddler对iPhone手机进行数据抓包分析
  12. python实现查询mac号对应的OUI厂商信息
  13. 后疫情时代,初创企业生存之策
  14. 文字处理技术:新布局思路验证成功
  15. Android全面屏如何做适配
  16. Bootstrap-1
  17. numpy 全部笔记的思维导图精简记忆版
  18. Adobe系列软件-快捷键(PS-Photoshop、PR-Premiere Pro、AE-After Effects)
  19. 在开发IE插件时,遇到的各种问题记录
  20. PLSQL 官方下载及安装

热门文章

  1. 上海财经应用统计考python_20上财应用统计415分经验帖(初试第一)
  2. 关于如何将多个Cpp文件关联起来
  3. GB2312编码的字符串如何转换为ISO-8859-1编码?
  4. libcef-框架架构中概念介绍-网络层(请求)-请求处理-请求拦截-代理解析(六)
  5. MLCC电容的直流偏压特性 贴片电容
  6. 中国第一代技术网红,阿里云P10技术专家褚霸:我只是一个程序员 。
  7. 1月15日云栖精选夜读 | 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来...
  8. 微信小程序多音频场景处理
  9. 【MyBatis笔记-09】MyBatis-Plus的使用
  10. Linux服务篇之SSH服务