2024年2月8日发(作者:)
TMS320C54x DSP 函数库
用户指南
TMS32C54X 优化 C 函数库
北京金信诺 科技
June, 1999
目录
第一章 概述..................................................................................................................................3
一、DSP 函数数据类型.............................................................................................................3
二、从 C 程序中调用 DSP 函数...............................................................................................3
三、从汇编程序中调用 DSP 函数............................................................................................5
四、其他说明.............................................................................................................................6
第二章 DSP 数学函数库 .............................................................................................................7
add
sub
mul32
neg
neg32
mmul
mtrans
maxidx
maxval
minidx
minval
atan16
atan2_16
sine
sqrt_16
log_2
log_10
logn
recip16
expn
power
bexp
rand16init
rand16
fltoq15
q15tofl
向量相加 ...............................................................................................................7
向量相减 ...............................................................................................................8
32 位向量相乘......................................................................................................9
向量求反 .............................................................................................................10
双精度向量求反.................................................................................................11
矩阵相乘.............................................................................................................12
矩阵转置.............................................................................................................13
向量最大元素的序号 ........................................................................................14
向量元素的最大值.............................................................................................15
向量最小元素的序号.........................................................................................16
向量的最小元素.................................................................................................17
反正切.................................................................................................................18
反正切 2...........................................................................................................19
三角正弦 ...........................................................................................................20
16 位数的平方根 .............................................................................................21
以 2 为底的对数...............................................................................................22
以 10 为底的对数...........................................................................................23
以 e 为底的对数..............................................................................................24
16 位数的倒数...............................................................................................25
指数.................................................................................................................26
向量的功率.....................................................................................................27
块的幂.............................................................................................................28
初始化随机数生成器....................................................................................29
随机向量生成器.............................................................................................30
浮点数到 Q15 数据转换................................................................................31
Q15 到浮点数转换.........................................................................................32
第三章 FFT 函数库...................................................................................................................33
cbrev
cfft
cifft
rfft
rifft
复数逆序.........................................................................................................33
复数 34
复数逆 36
实数 FFT(替换)...............................................................................................38
逆实数 FFT(替换)...........................................................................................40
第四章 卷积与 FIR 滤波器.......................................................................................................42
convol 卷积.....................................................................................................................42
cfir 复数 FIR 滤波器 .................................................................................................43
fir FIR 滤波器 ..........................................................................................................44
firs 对称 FIR 滤波器 .................................................................................................45
firs2 对称 FIR 滤波器(常用).......................................................................................47
firdec 抽样 FIR 滤波器 ................................................................................................48
firinterp 插值 FIR 滤波器..............................................................................................50
firlat FIR Lattice 滤波 ..............................................................................................51
1
hilb16 Hilbert 变换器 .................................................................................................52
第五章 IIR 滤波器.....................................................................................................................54
iircas4 使用 4 个参数的 IIR 滤波(直接实现形式 II) .................................................54
iircas5 使用 5 个参数的 IIR 滤波(直接实现形式 II) .................................................56
iircas51 使用 5 个参数的 IIR 滤波(直接实现形式 I)..................................................58
iirlat IIR lattice 滤波.................................................................................................59
iir32 双精度 IIR 滤波 ...............................................................................................60
第六章 自适应滤波器................................................................................................................62
dlms 自适应延迟 LMS 滤波...................................................................................62
nblms 标准化的 LMS 块滤波...................................................................................64
ndlms 标准化的延迟 LMS 滤波...............................................................................66
第七章 相关函数库....................................................................................................................68
acorr 自相关.............................................................................................................68
corr 互相关 .............................................................................................................70
2
第一章 概述
一、DSP 函数数据类型
DSP 函数库处理以下的小数数据类型:
Q3.12 : 包含 3 个整数位和 12 个小数位,其各位的定义如下:
位 15 14 13 12 11 10 9 … 0
值 符号 I3 I2 I1 Q11 Q10 Q9 … Q0
它表示的数据范围是(-8,8),最小的小数分辨率为 2−12
= 2.441×10−4
。
Q.15 (DATA) : 一个 Q.15 表示的是 16 位的 short 类型的数据,定义为
DATA,各位的定义如下:
位 15 14 13 12 11 10 9 … 0
值 符号 Q14 Q13 Q12 Q11 Q10 Q9 … Q0
它表示的数据范围是(-1,1),最小的小数分辨率为2−15
= 3.05× 10−5
。
Q.31 (LDATA) : 一个 Q.31 用 long 类型的数据来表示(32 位),定义为
LDATA,各位的定义如下:
低位:
位
值
高位:
位
值
15
Q15
14
Q14
13
Q13
12
Q12
…
… Q3
3
Q2
2
Q1
1
Q0
0
15
符号
14
Q30
13
Q29
12
Q28
…
…
3
Q19
2
Q18
1
Q17
0
Q16
除非特别说明,DSP 函数库中使用的都是 Q.15 类型的数据
二、从 C 程序中调用 DSP 函数
为了正确使用 DSP 函数库中的函数,必须执行以下步骤:
将需要调用的库函数的头文件“.h”包含在“.c”文件中。
使用正确的,反映 C54x 板上内存结构的连接命令文件。
3
将需要调用的库文件“.lib”包含在连接命令文件“.cmd”中。
下面的示例说明了 DSP 函数的调用方法:
/* example.c */
#include c54math.h /* 包含库函数的文件头 */
/* 必要时需指明文件所在目录 */
float xf[3] = { 0.1 , 0.2, 0.3};
float yf[3] = { 0.2 , 0.3, 0.4};
short x[3];
short y[3];
short i;
main() {
for (i=0; i<3; i++) y[i] = x[i] = 0;
fltoq15(xf, x, 3);
fltoq15(yf, y, 3);
add(x, y, x, 3, 1);
q15tofl(x, xf,3);
}
//
-c
-l
-l
-stack 0x200
-heap 0x200
-o
-m
MEMORY
{
PAGE 0:
INT_PM_DRAM:
EXT_PM_RAM:
PAGE 1:
/* 连接时必须包含库函数 */
/* 必要时需指明文件所在目录
/* 输出文件 */
/* 存储器映像文件 */
origin = 0080h, length = 1380h
origin = 1400h, length = 0ec00h
*/
INT_DM_SCRATCH_PAD_DRAM: origin = 0060h, length = 20h
INT_DM_1: origin = 0080h, length = 01380h
4
EXT_DM_RAM:
}
SECTIONS
{
.text
.cinit
.switch
.data
.stack
.bss
.sysmem :
.const
.dout
}
:
:
:
:
:
:
:
:
origin = 1400h, length = 0ec00h
{} > INT_PM_DRAM PAGE 0
{} > INT_PM_DRAM PAGE 0
{} > INT_PM_DRAM PAGE 0
{} > INT_DM_1
{} > INT_DM_1
{} > INT_DM_1
{} > INT_DM_1
{} > INT_DM_1
{} > INT_DM_1
PAGE 1
PAGE 1
PAGE 1
PAGE 1
PAGE 1
PAGE 1
程序中将 xf,yf 都转化成 Q15 格式后相加,并将结果除以 2,存入向量 x 中。
然后将 x 转换成小数形式,存入 xf 中。
三、从汇编程序中调用 DSP 函数
对 DSP 函数库中函数的调用与一般的汇编函数调用类似,但是调用要符合标
准 C 的调用规则,执行的结果与标准 C 计算所得到的结果相同。例如,C 语言
中对加法的调用:
add( x, y, r, 32, 0 ); 可以使用汇编调用为:
stm #0, ar0
pshm ar0
stm #32, ar0 pshm
ar0
pshm arg_r
pshm arg_y
ldm arg_x, A
call _add
; arg_r 为指向向量 r 的指针
; arg_y 为指向向量 y 的指针
; arg_x 为指向向量 x 的指针
popm
popm
popm
popm
arg_y
arg_r
ar0
ar0
5
四、其他说明
一、环形缓冲区
许多算法,例如卷积,相关和 FIR 滤波等,需要在内存中实现环形缓冲。在
这些算法中,环形缓冲区中包含着最近的数据。当新的数据进来时,最旧的数据
被改写。实现环形缓冲区的关键在于环形寻址。
环形缓冲寄存器BK指明环形缓冲区的大小。一个大小为R的环形缓冲区,必
须起始于N位的边界,也就是环形缓冲区基址的最小N位必须为0。其中N是满足
2N
> R的最小整数。R必须放置于BK中。例如,一个31字的环形缓冲区必须起始
于最小五位为0的地址(即XXXX XXXX XXX0 0000
2
),并且必须将数值31放置
于BK中。第二个示例,若一个缓冲区为32字,则起始地址的最小六位必须为0 (即
XXXX XXXX XX00 0000
2
),并且将值32存于BK中。
在本文中,参考“TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节”
处,均指“TMS320C54X DSP Reference Set(Volume 1: CPU and Peripherals)”(1996
年出版,电子版为“”)。
二、库函数位置
库函数分别位于 C54mathinclude,C54fftinclude,C54firinclude,
C54iirinclude,C54lmsinclude 和 C54corrinclude 目录下。
三、编译方法
执行命令:
cl500 test.c –g –k –z
即可以生成当前示例的 .out 文件,然后可以调用 Simulator 进行模拟仿真。 仿真时可以使用文件安装目录下的 文件。
四、其他说明
函数下面小括号中“定义于 ”指的是生成函数的源文件,函数库一 般不附带这些文件。
6
第二章 DSP 数学函数库
add 向量相加
short oflag = add (DATA *x, D ATA *y, D ATA *r, ushort nx, ushort scale)
(定义于 )
参数
x[nx]
y[nx]
r[nx]
nx
scale
指向长度为 nx 的输入向量 1 ( r 可以 = x = y)
指向长度为 nx 的输入向量 2
指向输出向量:
输入输出向量长度 nx >=4
归一化选项
若 scale = 1,将结果除以 2
若 scale = 0,不改变结果
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
oflag
说明
该例程将两个向量元素逐一相加。
算法
for (i=0; i < nx; i++)
z (i) = x (i) + y (i)
溢出处理
进行归一化处理,以防止溢出。
特殊要求
由于采用流水线操作,要求 nx>=4,否则可能会进入死循环。
注释
无。
例程
见 C54mathadd
7
sub 向量相减
short oflag = sub (DATA *x, D ATA *y, D ATA *r, ushort nx, ushort scale)
(定义于 )
参数
x[nx]
y[nx]
r[nx]
nx
scale
指向长度为 nx 的输入向量 1 ( r 可以 = x = y)
指向长度为 nx 的输入向量 2
指向输出向量:
输入输出向量长度 nx >=4
归一化选项
若 scale = 1,将结果除以 2
若 scale = 0,不改变结果
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
oflag
说明
该例程将两个向量元素逐一相减。
算法
for (i=0; i < nx; i++)
z (i) = x (i) - y (i)
溢出处理
进行归一化处理以防止溢出。
特殊要求
由于采用流水线操作,要求 nx>=4,否则可能会进入死循环。
注释
无。
例程
见 C54mathsub
8
mul32 32 位向量相乘
short oflag = mul32(LDATA *x, LDATA *y, LDATA *r, ushort nx)
(定义于 )
参数
x[nx]
y[nx]
r[nx]
nx
oflag
指向长度为 nx 的输入向量 1 (r 可以 = x = y)
指向长度为 nx 的输入向量 2
指向长度为 nx 的输出向量
输入向量、输出向量的长度 nx >=4
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
说明
本例程对两个 32 位的 Q31 向量逐个元素相乘,得到一个 32 位的 Q31 向量。
算法
for (i=0; i < nx; i++)
z (i) = x (i) * y (i)
溢出处理
无。
特殊要求
由于采用流水线操作,要求有 nx>=4,否则可能进入死循环。
注释
无。
例程
见 C54mathmul32
9
neg 向量求反
short oflag = neg (DATA *x, D ATA *r, ushort nx)
(定义于 )
参数
x[nx]
r[nx]
nx
oflag
指向长度为 nx 的输入向量 ( r 可以 = x = y)
指向长度为 nx 的输出向量
特殊情况:
若 x = -1 = 32768 ,则 r = 1 = 321767 且 oflag = 1
输入向量、输出向量长度,nx>=4。
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
说明
本例程对向量的每一个元素求反。
算法
for (i=0; i < nx; i++)
x (i) = -x (i)
溢出处理
对溢出进行饱和处理。
特殊要求
由于采用流水线操作,要求有 nx >= 4 否则可能进入死循环。
注释
无。
例程
见 C54mathneg
10
neg32 双精度向量求反
short oflag = neg32 (LDATA *x, LDATA *r, ushort nx)
(定义于 )
参数
x[nx]
r[nx]
nx
oflag
指向长度为 nx 的输入向量 ( r 可以 = x = y)
指向长度为 nx 的输出向量
特殊情况:
若 x = -1 = 32768*2^16 ,则 r = 1 = 321767*2^16 且 oflag = 1
输入向量、输出向量长度 nx >=4
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
说明
本例程对向量的每一个元素求反。
算法
for (i=0; i < nx; i++)
x (i) = -x (i)
溢出处理
对溢出进行饱和处理。
特殊要求
由于采用流水线操作,要求有 nx>=4 否则可能进入死循环。
注释
无。
例程
见 C54mathneg32
11
mmul 矩阵相乘
short oflag = mmul (DATA *x1,short row1,short col1,DATA *x2,
short row2,short col2,DATA *r)
(定义于 )
指向长度为 row1*col1 的输入矩阵
矩阵 1 的行数 col1
指向长度为 row2*col2 的输入矩阵
其中 row2 = col1
矩阵 2 的行数
矩阵 2 的列数
指向长度为 row1*col2 的输出矩阵
参数
x1[row1*col1]
row1
1 的列数
x2[row2*col2]:
row2
col2
r[row1*col2]
矩阵
说明
矩阵相乘。
算法
使用嵌套循环计算输入矩阵 A(M╳N)乘以 B(N╳P)。
for i = 1 to M
for k = 1 to P {
temp = 0
for j = 1 to N
temp = temp + A(i,j) * B(j,k)
C(i,k) = temp
}
溢出处理
无。
特殊要求
要求输入矩阵大小合法。
注释
无。
例程
见 C54mathmmul
12
mtrans 矩阵转置
short oflag = mtrans(DATA *x, ushort row, ushort col, D ATA *r)
(定义于 )
参数
x[row*col] 指向输入矩阵 row
矩阵的行数 col 矩阵的列数
r[row*col] 指向输出矩阵 ( r 不能等于 x )
说明
本例程对矩阵进行转置。
算法
for i = 1 to M
for j = 1 to N
r(j,i) = x(i,j)
溢出处理
无。
特殊要求
无。
注释
无。
例程
见 C54mathmtrans
13
maxidx 向量最大元素的序号
short r = maxidx (DATA *x, ushort nx)
(定义于 )
参数
x[nx] 指向长度为 nx 的输入向量(nx >= 6)
r 向量最大值的序号 nx 输入向量的长度
说明
返回向量中最大元素的序号。
算法
无。
溢出处理
由于采用流水线操作,要求有 nx>=6,否则可能进入死循环。
特殊要求
无。
注释
无。
例程
见 C54mathmaxidx
14
maxval 向量元素的最大值
D ATA r = maxval (DATA *x, ushort nx)
(定义于 )
参数
x[nx]
r
nx
指向长度为 nx 的输入向量
向量的最大元素值
输入向量的长度
说明
返回向量中最大元素。
算法
无。
溢出处理
无。
特殊要求
无。
注释
无。
例程
见 C54mathmaxval
15
minidx 向量最小元素的序号
short r = minidx (DATA *x, ushort nx)
(定义于 )
参数
x[nx]
r
nx
指向长度为 nx 的输入向量(nx>=6)
向量的最小元素的序号
输入向量的长度
说明
返回向量中最小元素的序号。
算法
无
溢出处理
无。
特殊要求
由于采用流水线操作,要求有 nx>=6,否则可能进入死循环。
注释
无。
例程
见 C54mathminidx
16
minval 向量的最小元素
short r = minval (DATA *x, ushort nx)
(定义于 )
参数
x[nx]
r
nx
指向长度为 nx 的输入向量
向量的最小元素值
输入向量的长度
说明
返回向量的最小元素值。
算法
无。
溢出处理
无。
特殊要求
无。
注释
无。
例程
见 C54mathminval
17
atan16 反正切
short oflag = atan16(DATA *x, DATA *r, ushort nx)
(定义于 )
参数
x[nx]
r[nx]
指向输入向量,长度为 nx
|x|<1
指向输出向量,长度为 nx
得到对应 x 向量元素的反正切值,取值范围[-pi/4, pi/4]
可进行取代操作(可以有 r = x )
e.g. atan(1.0) = 0.7854 or 6478h)
输入向量、输出向量的长度
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
nx
oflag
说明
该函数计算 x 向量中每个元素的反正切值,结果放置于向量 r 中,范围为
[-pi/4,pi/4]。例如:
若 x = [0x7fff, 0x3505, 0x1976, 0x0]
(等价于实数 tan(PI/4), tan(PI/8), tan(PI/16), 0)
执行 atan16( x, r, 4)
则有 r = [0x6494, 0x3245, 0x190e, 0x0]
(等价于 [PI/4, PI/8, PI/16, 0])
算法
for (i=0; i < nx; i++)
r (i) = atan (x(i))
溢出处理
未采用。
特殊要求
连接命令文件:必须指定 “.data” 段(放置求解系数)。
注释
本例程计算|x|<1 时,x 的反正切。若|x|>1,可以表示成两个数的比值,
使用函数 atan2_16 进行计算。
例程
见 C54mathatant
18
atan2_16 反正切 2
short oflag = atan2_16(DATA *x, DATA *y, DATA *r, ushort nx)
(定义于 )
参数
x[nx]
y[nx]
r[nx]
nx
oflag
指向输入向量 1,长度为 nx,使用 Q15 格式
指向输入向量 2,长度为 nx,使用 Q15 格式
指向输出向量,长度为 nx,使用 Q15 格式
允许进行替代操作(r 可以等于 x)
输入向量、输出向量的长度
溢出标志
若 oflag = 1, 则运算中产生 32 位溢出
若 oflag = 0, 运算中未产生 32 位溢出
说明
该例程计算 y/x 值的反正切,这里 -1 <= atan2_16(y/x) <= 1,代表 -PI =<
atan2_16(y/x) <= PI,输出放置于输出向量 r 中,归一化系数为 PI。
例如若 y = [0x1999, 0x1999, 0x0, 0xe667 0x1999]
(等价于实数 [0.2, 0.2, 0 , -0.2 0.2] )
x = [0x1999, 0x3dcc, 0x7ffff, 0x3dcc c234]
(等价于实数 [0.2, 0.4828, 1, 0.4828 –0.4828] )
执行 atan2_16(x, y, r, 4)
结果为 r = [0x2000, 0x1000, 0x0, 0xf000, 0x7000]
(等价于实数 [0.25, 0.125, 0, –0.125, 0.875]*pi )
算法
for (j=0; j r[j] = atan2_16(y(j)/x(j)) 溢出处理 未采用。 特殊要求 连接命令文件:必须指定“.data”段(放置计算系数)。 注释 无 例程 见 C54matharct2 19 sine 三角正弦 void sine (DATA *x, DATA *r, ushort nx) (定义于 ) 参数 x[nx] 指向长度为 nx 的输入向量。x 中包含着将[-pi, pi]归一化到 [-1,1]范围的角度数据。使用 q15 格式记录。 x = xrad /pi 例如: 45o = pi/4 等价于 x = 1/4 = 0.25 = 0x2000(使用 Q15 格式) 指向输出向量(使用 Q15 格式) 输入输出向量长度( nx >=4 ) r[nx] nx 说明 使用 Taylor 展开计算角度 x 的正弦。 算法 for (i=0; i y(i)= sin(x(i)) 其中:x(I) = xrad/pi 溢出处理 无。 特殊要求 必须指定“.data”段。 注释 使用以下的 Taylor 展开计算向量的正弦: sin(x) = c1*x + c2*x^2 + c3*x^3 + c4*x^4 + c5*x^5 c1 = 3.140625x c2 = 0.02026367 c3 = - 5.3251 c4 = 0.5446778 c5 = 1.800293 例程 见 C54mathsine 20 sqrt_16 16 位数的平方根 short oflag = sqrt_16 (DATA *x, DATA *r, short nx) (定义于 ) 参数 x[nx] r[nx] nx oflag 指向长度为 nx 的输入向量 指向长度为 nx 的输出向量 输入输出向量长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 计算向量 x 中每个元素的平方根,结果存于向量 r 中。 算法 for (i=0; i r[i] = sqrt(x(i)) 溢出处理 无。 特殊要求 必须指定“.data”段。 注释 无。 例程 见 C54mathsqrtv 21 log_2 以 2 为底的对数 short oflag = log_2 (DATA *x, LDATA *r, ushort nx) (定义于 log_) 参数 x[nx] r[nx] nx oflag 指向长度为 nx 的输入向量(Q15 格式) (要求 0.5 指向长度为 nx 的输入向量(Q31 格式) 输入向量、输出向量长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 使用 Taylor 展开,计算以 2 为底的对数。 算法 for (i=0; i 无。 其中 0.5 < x(i) < 1 溢出处理 特殊要求 必须指定“.data”段。 注释 对于 x < 0.5 的情况,可以先进行归一化处理,使 1 > x > 0.5。 例程 见 C54mathlog_2 22 log_10 以 10 为底的对数 short oflag = log_10 (DATA *x, LDATA *r, ushort nx) (定义于 log_) 参数 x[nx] r[nx] nx oflag 指向长度为 nx 的输入向量(Q15 格式) (要求 0.1 指向长度为 nx 的输入向量(Q31 格式) 输入向量、输出向量长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 使用 Taylor 展开,计算以 10 为底的对数。 算法 for (i=0; i 无。 其中 0.1 < x(i) < 1 溢出处理 特殊要求 必须指定“.data”段。 注释 对于 x < 0.1 的情况,可以先进行归一化处理,使 1 > x > 0.1。 例程 见 C54mathlog_10 23 logn 以 e 为底的对数 short oflag = logn (DATA *x, LDATA *r, ushort nx) (定义于 ) 参数 x[nx] r[nx] nx oflag 指向长度为 nx 的输入向量(Q15 格式) (要求 0.1 指向长度为 nx 的输入向量(Q31 格式) 输入向量、输出向量长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 使用 Taylor 展开,计算以 e 为底的对数。 算法 for (i=0; i 无。 其中 1/e < x(i) < 1 溢出处理 特殊要求 必须指定“.data”段。 注释 对于 x < 1/e 的情况,可以先进行归一化处理,使 1 > x > 1/e。 例程 见 C54mathlogn 24 recip16 16 位数的倒数 void recip16 (DATA *x, D ATA *r, ushort *rexp, ushort nx) (定义于 ) 参数 x[nx] r[nx] rexp[nx] nx 指向长度为 nx 的输入向量 指向输出数据缓冲区 指向输出数据的幂缓冲区。这些幂使用无符号整数格式 输入输出向量的长度。 说明 该例程返回 Q15 格式数据倒数的整数和小数部分。因为倒数总是大于 0,所 以采用两部分表示。正确的结果是: r[i] * rexp[i] 算法 无。 溢出处理 无。 特殊要求 无。 注释 无。 例程 见 C54math recip16 25 expn 指数 short oflag = expn (DATA *x, D ATA *r, ushort nx) (定义于 ) 参数 x[nx] r[nx] nx oflag 指向输入向量,长度为 nx。使用 Q15 数据格式 指向输出向量,长度为 nx。使用 Q3.12 数据格式。 r 可以等于 x 输入向量、输出向量长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 使用 Taylor 展开计算向量 x 的指数。 算法 for (i=0; i 未采用。 y(i)= ex(i) 其中 -1 <= x < 1 溢出处理 特殊要求 必须指定“.data”段。 注释 使用以下的 Taylor 系列,计算向量 x 各元素的指数: exp(x) = c1 * x + c2 * x^2 + c3 * x^3 + c4 * x^4 + c5 * x^5 其中: c1 = 0.0139 c2 = 0.0348 c3 = 0.1705 c4 = 0.4990 c5 = 1.0001 例程 见 C54mathexpn 26 power 向量的功率 short oflag = power (DATA *x, LDATA *r, ushort nx) (定义于 ) 参数 x[nx] r[1] nx oflag 指向长度为 nx 的输入向量 (r 可以 = x) 指向输出向量,使用 Q31 格式。 输入向量长度 nx >=4 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 该例程计算向量的功率。 算法 Power = 0 for (i=0; i < nx; i++) power += x (i) *x(i) 溢出处理 无。 特殊要求 由于采用流水线操作,要求有 nx>=4 否则可能进入死循环。 注释 无。 例程 见 C54mathpower 27 bexp 块的幂 short maxexp = bexp(DATA *x, ushort nx) (定义于 ) 参数 maxexp x[nx] nx oflag 绝对值最大数的幂,可用于归一化处理中 指向输入向量,长度为 nx 输入向量的长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 计算输入向量中所有值的幂,并返回最小的幂(冗余的符号位)。在对一块数 据进行归一化时,可使用该功能来决定最大的位移值。 算法 for (short j=0; j temp = exp(x[j]); if (temp < maxexp) maxexp = temp; } return maxexp; 溢出处理 未采用。 特殊要求 无。 注释 无。 例程 见 C54mathbexp 28 rand16init 初始化随机数生成器 void rand16init(void) (定义于 ) 参数 无。 说明 初始化 16 位随机数生成器例程的种子。 算法 无。 溢出处理 无。 特殊要求 必须指定“.bss”段。 注释 该函数对产生 16 位随机变量的例程(rand16)进行初始化。程 见 C54mathrand 例29 rand16 随机向量生成器 short oflag = rand16(DATA *x, ushort nx) (定义于 ) 参数 x[nx] nx oflag 指向长度为 nx 的输入向量 输入向量、输出向量的长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 计算 16 位的随机向量。 算法 线性余数法。 溢出处理 无。 特殊要求 无。 注释 无。 例程 见 C54mathrand 30 fltoq15 浮点数到 Q15 数据转换 short errorcode = fltoq15 (float *x, D ATA *r, ushort nx) (定义于 ) 参数 x[nx] r[nx] nx errorcode 指向长度为 nx 的浮点输入向量。X 应为归一化后的浮点数, 取值范围(-1,1)。如果没有归一化,errorcode 将返回错误信 息。 指向长度为 nx 的输出向量。 输入向量、输出向量的长度 如果出错,例程将返回以下错误值: 1 — 如果有元素太大而不能用 Q15 格式表示出来; 2 — 如果有元素太大而不能用 Q15 格式表示出来; 3 — 如果有元素太大而且有元素太小,用 Q15 格式表 示不出来; 说明 将存储于向量 x 中的 IEEE 浮点数转化后存储于向量 r 中。如果有元素用 Q15 格式不能表示出来,errorcode 返回错误信息。 所有大于 1 的数都被置成 1,小于-1 的数都被置成-1,用 Q15 格式不能表示 出来的数被置成 0。 算法 无。 溢出处理 对溢出进行饱和处理。 特殊要求 无。 注释 无。 例程 见 C54mathfltoq15 31 q15tofl Q15 到浮点数转换 short q15tofl (DATA *x, float *r, ushort nx) (定义于 ) 参数 x[nx] r[nx] nx 指向长度为 nx 的 Q15 输入向量。 指向长度为 nx 的浮点输出向量。 输入向量、输出向量的长度 说明 将存储于向量 x 中的 Q15 数据转化成 IEEE 浮点数,转化后存储于向量 r 中。 算法 无。 溢出处理 对溢出进行饱和处理。 特殊要求 无。 注释 无。 例程 见 C54mathq15tofl 32 第三章 FFT 函数库 cbrev 复数逆序 void cbrev(DATA *x, D ATA *r, ushort n) (定义于 ) 参数 x[2*nx] 指向输入向量,长度为 2*nx r[2*nx] 指向输出向量,长度为 2*nx nx 输入向量、输出向量的长度,nx 为复数的数据长度 若是复数序列的逆序,nx 应为为复数 FFT 的长度。 若是实数序列的逆序,nx 应为为实数 FFT 的长度的一半。 说明 该例程将复数向量进行逆序操作,将输入向量 x 的逆序结果存入输出向量 r 中,可进行替代操作。使用该例程可以为 FFT 例程提供逆序后的数据。 算法 按位逆序。 溢出处理 未采用。 特殊要求 无。 注释 替代逆序(r = x)与非替代操作(r != x)相比较,将耗费更多的时间。但是 在空间上要小一半。 例程 见 C54fftcbrev。 33 cfft 复数 FFT 原始形式: void cfft#(DATA x, short scale) (定义于 cfft#.asm,其中 # = nx,nx = 8,16,32,64,128,256,512,1024) 常用形式: void cfft(DATA x ,#,short scale) 其中 # = nx,nx = 8,16,32,64,128,256,512,1024 参数 x[2*nx] 指向输入复数向量,该向量已经经过逆序处理。每一个元素 都按实部-虚部排列。 对应缓冲区的最小 k 位必须为 0。k 为大于 log2(2*nx)的整 数,具体解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 归一化标志: 若 (scale == 1) 归一化因素为 nx; 否则 归一化因素为 1; scale 说明 计算经过逆序复数系列的 FFT。计算中,原始的数据被破坏。 计算结果按顺序放置在向量 x 中。 算法(DFT) y[k] = 1/(scale factor) * ∑x[i]* (cos(2 * i=0 nx−1 pi *i *k / nx) + jsin(2 * pi *i *k / nx)) 溢出处理 采用归一化操作以防止溢出。 特殊要求 该例程基于执行速度进行优化,因而空间消耗量大。在连接命令文 件中必须指定“.sintab”段,大小如下: FFT 数据长度 8 11 32 81 128 256 512 1024 数据长度(字) .sintab 段 0 16 34 64 176 367 750 1517 34 认为所有数据都在双存取 RAM 中,读取数据列表与指令存取不冲 突。(连接命令文件反映了这些条件)。 注释 每个中间 FFT 阶段,进行除以 2 的操作以防止溢出(可选)。 编译该函数源代码时,自动包含两个文件“”,“sintab.q15”。 例程 见 C54fftcfft 35 cifft 复数逆 FFT 原始形式: void cifft#(DATA x, short scale) (定义于 cifft#.asm,其中 #=nx,nx = 8,16,32,64,128,256,512,1024) 常用形式: void cifft(DATA x ,#,short scale) 其中 #=nx,nx = 8,16,32,64,128,256,512,1024 参数 x[2*nx] 指向输入复数向量,该向量已经经过逆序处理。每一个元素 都按实部-虚部排列。 对应缓冲区的最小 k 位必须为 0。k 为大于 log2(2*nx)的整 数,具体解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 归一化标志: 若 (scale == 1) 归一化因素为 nx; 否则 归一化因素为 1; Scale 说明 计算经过逆序复数系列的逆 FFT。计算中,原始的数据被破坏。 计算结果按顺序放置在向量 x 中。 算法(IDFT) y[k] = 1/(scale factor) * ∑x[i]* (cos(2 * i=0 nx−1 pi *i *k / nx) + jsin(2 * pi *i *k / nx)) 溢出处理 采用归一化操作。 特殊要求 该例程基于执行速度进行优化,因而空间消耗量大。在连接命令文 件中必须指定“.sintab”段,大小如下: FFT 数据长度 8 11 32 81 128 256 512 1024 数据长度(字) .sintab 段 0 16 34 64 176 367 750 1517 36 编译连接源代码过程中“”,“sintab.q15”被自动包含。 注释 每个中间 FFT 阶段,进行除以 2 的操作以防止溢出(可选)。 例程 见 C54fftcfft 37 rfft 实数 FFT(替换) 原始形式: void rfft# (DATA *x, short scale) (定义于 rfft#.asm,其中# = 16,32,64,128,256,512,1024) 常用形式: void rfft (DATA *x,#,short scale) 其中# = 16,32,64,128,256,512,1024 参数 x [nx] 指向输入向量,该向量包含了以逆序排列的 nx 个实数元 素。输出时,向量 x 包含 FFT 输出的前 nx/2 个元素。实数 FFT 的结果是关于 Nyquist 点对称的,因此只需要给定 FFT 结果的 一半元素。 输出时,x 将以如下格式得到结果: y(0)Re y(nx/2)Im -> 直流和 Nyquist 点 y(1)Re y(1)Im y(2)Re y(2)Im …… y(nx/2-1)Re y(nx/2-1)Im 复数以 Re-Im 的格式存储。 内存对齐:x 必须起始于 k 位边界上(就是说起始地址的 k 个 LSB 位必须为 0)。其中 k 为大于 log2(nx)的整数,具体 解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 归一化标志: 若 (scale == 1) 归一化因素为 nx; 否则 归一化因素为 1; scale 说明 计算以逆序方式存储于向量 x 中的 nx 个实元素的 FFT。原有数据在计算中 被破坏。变换结果的前 nx/2 个复数以正常顺序存储于向量 x 中。 pi *i *k / nx) + jsin(2 * pi *i *k / nx)) 算法(DFT) y[k] = 1/(scale factor) * ∑ nx−1 x[i]* (cos(2 * i=0 溢出处理 为防止溢出,进行归一化处理。 特殊要求 连接命令文件:必须指定“.sintab”段。该段的大小与 cfft 中“.sintab” 38 段的大小一致 该函数自动包含“”、“sintabr.q15”和“”三个文 件。 注释 计算 nx/2 个元素的 FFT,然后执行 unpack 程序段得到实数 FFT 结果。 注意一般情况下 N 个实数序列的 FFT 产生 N 个复数(2*N 个实数),这将 不可能放置于输入序列中,为将结果保存下来而不需要额外的内存,在 结果中只保存实数 FFT 运算的一半,因为实数序列的 FFT 是对称的。 当 scale = 1 时,每个中间执行阶段和 unpack 阶段都进行除以 2 的操作。 例程 见 C54fftrfft。 39 rifft 逆实数 FFT(替换) 原始形式: void rifft# (DATA *x, short scale) (定义于 rifft#.asm 其中# = 16,32,64,128,256,512,1024) 常用形式: void rifft (DATA *x,#,short scale) 其中# = 16,32,64,128,256,512,1024 参数 x [nx] 指向输入向量,该向量以顺序存储的方式包含 nx 个实元 素。例如: y(0)Re y(nx/2)Im -> 直流和 Nyquist 点 y(1)Re y(1)Im y(2)Re y(2)Im …… y(nx/2-1)Re y(nx/2-1)Im 其中 y = fft(x) 在输出中,向量 x 包含有 nx 个复数元素,由于虚数部分 为 0,所以按顺序给出的是 nx 个复数的实数部分。 内存对齐:x 必须起始于 k 位边界上(就是说起始地址的 k 个 LSB 位必须为 0)。其中 k 为大于 log2(nx)的整数, 具体解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 Scale 归一化标志: 若 (scale == 0) 归一化因素为 nx; 否则 归一化因素为 1; 说明 计算 nx/2 个复数的逆 FFT,这些复数以顺序排列。在计算中,向量 x 的原始 值被破坏。 (w) * (cos(2 * pi *i *k / nx) − jsin(2 * pi *i *k / nx)) 算法(IDFT) y[k] =1/(scale factor) * ∑ nx−1 X i=0 溢出处理 为防止溢出进行归一化处理。 特殊要求 连接命令文件:必须包含“.sintab”段,大小与 cfft 中的对应段一致。 40 本例程在汇编时,自动包含文件“”、“sintabr.q15”、 “”。 本例程的逆序操作被包含在程序执行过程中,因而在.map 文件中可以看 到,程序使用了“”文件。 注释 本例程使用到 cifft#的全部操作,因而对该函数的要求同样适用于本例 程。 注意到,实数系列的 FFT 产生的结果是关于 Nyquist 点对称的,因而原 始数据只需要提供前一半即可。这样也能得到原始的实数序列。 当 scale = 1 时,本例程为防止溢出,在每个中间阶段和 unpack 阶段都除 以 2 进行归一化处理。 例程 见 C54fftrfft。 41 第四章 卷积与 FIR 滤波器 convol 卷积 oflag = short convol (DATA *x, D ATA *h, D ATA *r, ushort nh, ushort nr) (定义于 ) 参数 x[nr+ nh-1] 指向输入向量,长度为 nr+nh-1 h[nh] 指向系数向量,长度为 nh r[nr] 指向输出向量,长度为 nr nr 输出向量长度 nh 系数向量长度 oflag 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 计算两个向量的卷积,结果放在输出向量 r 中,卷积的长度为 nr。典型地用 于块卷积操作,也可以用于逐个数据进行卷积(nr = 1)。 算法 nh r[j] = ∑ k=0 h[k]x[ j − k] 0 <=j <=nr 溢出处理 未采用。 特殊要求 无。 注释 无。 例程 见 C54firconvol 42 cfir 复数 FIR 滤波器 short oflag = cfir (DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nh, ushort nx) (定义于 ) 指向输入向量,长度为 2*nx(按实部-虚部的顺序排列) 指向系数向量,长度为 2*nh(按实部-虚部的顺序排列) 例如:若 nh=3: 则:H = b0re, b0im, b1re,b1im,b2re,b2im。 内存对齐:这是一个环行缓冲区,必须起始于 k 位边界上 (就是说起始地址的 k 个 LSB 位必须为 0)。其中 k 为大于 log2(2*nh)的整数,具体解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 指向输出向量,长度为 2*nx(按实部-虚部的顺序排列) 允许进行替代操作(r = x) 延迟缓冲区 在多重缓冲区方法中,该向量在进行第一次块操作时应该 初始化为 0;在后面的块操作中,延迟缓冲区保存着计算 r 所必须的输入值。 内存对齐:与 h 向量一致。 输入向量的长度,nx 为复数的数据长度 系数向量的长度,nh 为复数的数据长度 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 参数 x[2*nx] h[2*nh] r[2*nx] dbuffer [2*nh] nx nh oflag 说明 使用系数向量 h,计算复数的 FIR 滤波(直接实现形式)。输入数据存于向量 x 中。该例程使用一个缓冲内存 d 来保存前一次的输入值。可以进行块滤波操作, 或者单个数据滤波(nx=1) 算法 nh r[j] = ∑ h[k]x[ j − k] 0 <=j <=nx k=0 溢出处理 未采用。 特殊要求 无。 注释 无。 例程 见 C54fircfir 43 fir FIR 滤波器 short oflag = fir (DATA *x, DATA *h, DATA *r, DATA **dbuffer, ushort nh, ushort nx) (定义于 ) 指向输入向量,长度为 nx 指向系数向量,长度为 nx 例如:若 nh=3: 则:H = b0, b1, b2。 内存对齐:这是一个环行缓冲区,必须起始于 k 位边界 上(就是说起始地址的 k 个 LSB 位必须为 0)。其中 k 为 大于 log2(nh)的整数,具体解释见 TMS320C54X DSP Reference Set 第 5-15 页 5.5.3.4 小节。 指向输出向量,长度为 nx 延迟缓冲区 参数 x[nx] h[nh] r[nx] Dbuffer[nh ] 在多重缓冲区方法中,该向量在进行第一次块操作时应 该初始化为 0;在后面的块操作中,延迟缓冲区保存着 计算 r 所必须的输入值。 内存对齐:与 h 向量一致。 Nx 输入向量的长度 Nh 系数向量的长度 Oflag 溢出标志 若 oflag = 1, 则运算中产生 32 位溢出 若 oflag = 0, 运算中未产生 32 位溢出 说明 使用系数向量 h,计算实数的 FIR 滤波。输入数据存于向量 x 中。该例程使 用一个缓冲内存 d,来保存前一次的输入值。可以进行块滤波操作,或者单个数 据滤波(nx=1)。 算法 nh r[j] = ∑ h[k]x[ j − k] 0 <=j <=nx k=0 溢出处理 未采用。 特殊要求 无。 注释 无。 例程 见 C54firfir 44
本文发布于:2024-02-08 20:04:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739386868626.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |