dsplib中文版 TMS32054X 函数库中文用户指南

阅读: 评论:0

2024年2月8日发(作者:)

dsplib中文版 TMS32054X 函数库中文用户指南

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

dsplib中文版 TMS32054X 函数库中文用户指南

本文发布于:2024-02-08 20:04:28,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739386868626.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:向量   输入   长度   输出   进行
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23