MICROCHIP dsPIC Technical data

dsPIC
®
语言工具库
2005 Microchip Technology Inc. DS51456B_CN
请注意以下有关 Microchip 器件代码保护功能的要点:
Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。
Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。
目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。
Microchip 愿与那些注重代码完整性的客户合作。
Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。
代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的 软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。
提供本文档的中文版本仅为了便于理解。Microchip Technology Inc. 及其分公司和相关公司、各级主管与员工及 事务代理机构对译文中可能存在的任何差错不承担任何责任。
本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范, 是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不 限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而 引起的后果不承担任何责任。未经 Microchip 书面批准,不得 将 Microchip 的产品用作生命维持系统中的关键组件。在 Microchip 知识产权保护下,不得暗中或以其他方式转让任何 许可证。
商标
Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron dsPIC、 K
EELOQ、 microID、 MPLAB、 PIC、 PICmicro、
PICSTARTPRO MATEPowerSmart、 rfPIC 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国
家或地区的注册商标。
AmpLabFilterLabMigratable MemoryMXDEV MXLABPICMASTERSEEVALSmartSensor The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标。
Analog-for-the-Digital AgeApplication Maestro dsPICDEMdsPICDEM.netdsPICworksECAN ECONOMONITORFanSenseFlexROMfuzzyLAB In-Circuit Serial Programming、 ICSP、 ICEPIC、 Linear
Active Thermistor、 MPASM、 MPLIB、 MPLINK、 MPSIM、 PICkitPICDEMPICDEM.netPICLABPICtail
PowerCalPowerInfoPowerMatePowerToolrfLAB rfPICDEMSelect ModeSmart SerialSmartTelTot a l
Endurance WiperLock 均为 Microchip Technology Inc.在
美国和其他国家或地区的商标。 SQTP Microchip Technology Inc. 在美国的服务标记。
在此提及的所有其他商标均为各持有公司所有。 © 2005, Microchip Technology Inc.版权所有。
Microchip
10
位单片机、 性存储器和模拟产品方面的质量体系流程均符合
16949:2002
系也已通过了
位于美国亚利桑那州
Mountain View
月通过了
ISO/TS-16949:2002
KEELOQ
。此外,
ISO 9001:2000
的全球总部、设计中心和晶圆生产厂均于
®
跳码器件、串行
Microchip
Chandler和Tem p e
质量体系认证。公司在
EEPROM
在开发系统的设计和生产方面的质量体
认证。
及位于加利福尼亚
、单片机 外设、非易失
ISO/TS-
2003
PICmicro
®
DS51456B_CN ii 2005 Microchip Technology Inc.
8
dsPIC®语言工具库
目录
前言 ................................................................................................................................. 1
1 章 库的概述
1.1 引言 ................................................................................................................ 7
1.2 特定于 OMF 的库 / 启动模块 .......................................................................... 7
1.3 启动代码 ......................................................................................................... 8
1.4 DSP 函数库 .................................................................................................... 8
1.5 dsPIC 外设函数库 ........................................................................................... 8
1.6 标准 C 语言库 (包含数学函数) .................................................................... 8
1.7 MPLAB C30 内建函数 .................................................................................... 8
2 DSP 函数库
2.1 简介 ................................................................................................................ 9
2.2 DSP 函数库的使用 ....................................................................................... 10
2.3 矢量函数 ....................................................................................................... 13
2.4 窗函数 ........................................................................................................... 26
2.5 矩阵函数 ....................................................................................................... 31
2.6 滤波函数 ....................................................................................................... 38
2.7 变换函数 ....................................................................................................... 58
3 dsPIC 外设函数库
3.1 简介 .............................................................................................................. 73
3.2 使用 dsPIC 外设函数库 ................................................................................. 74
3.3 外部 LCD 函数 .............................................................................................. 74
3.4 CAN 函数 ...................................................................................................... 81
3.5 ADC12 函数 .................................................................................................. 95
3.6 ADC10 函数 ................................................................................................ 102
3.7 定时器函数 ................................................................................................. 109
3.8 复位 / 控制函数 ........................................................................................... 117
3.9 I/O 端口函数 ............................................................................................... 120
3.10 输入捕捉函数 ............................................................................................ 125
3.11 输出比较函数 ............................................................................................ 131
3.12 UART 函数 ................................................................................................ 141
3.13 DCI 函数 ................................................................................................... 150
3.14 SPI 函数 .................................................................................................... 158
3.15 QEI 函数 ................................................................................................... 166
3.16 PWM 函数 ................................................................................................. 171
3.17 I2C 函数 .................................................................................................... 183
2005 Microchip Technology Inc. DS51456B_CN 第 iii
dsPIC® 语言工具库
4 章 标准 C 函数库和数学函数
4.1 简介 ............................................................................................................ 193
4.2 使用标准 C 函数库 ...................................................................................... 194
4.3 <assert.h> 诊断 .......................................................................................... 195
4.4 <ctype.h> 字符处理 .................................................................................... 196
4.5 <errno.h> 错误 ............................................................................................ 205
4.6 <float.h> 浮点特征 ...................................................................................... 206
4.7 <limits.h> 实现定义的限制 ( implementation-defined limits) ..................... 211
4.8 <locale.h> 语言环境 ................................................................................... 213
4.9 <setjmp.h> 与语言环境无关的跳转 ............................................................. 214
4.10 <signal.h> 信号处理 ................................................................................. 215
4.11 <stdarg.h> 可变参数列表 .......................................................................... 221
4.12 <stddef.h> 公共定义 ................................................................................. 223
4.13 <stdio.h> 输入和输出 ................................................................................ 225
4.14 <stdlib.h> 实用函数 .................................................................................. 270
4.15 <string.h> 字符串函数 .............................................................................. 294
4.16 <time.h> 日期和时间函数 ......................................................................... 317
4.17 <math.h> 数学函数 ................................................................................... 325
4.18 pic30 函数库 ............................................................................................. 366
5 MPLAB C30 内建函数
5.1 简介 ............................................................................................................ 375
5.2 内建函数列表 .............................................................................................. 376
5.3 内建函数错误消息 ...................................................................................... 379
附录 A ASCII 字符集 ....................................................................................................381
索引 .............................................................................................................................383
全球销售及服务网点 ....................................................................................................400
DS51456B_CN iv 2005 Microchip Technology Inc.
dsPIC®语言工具库
前言
客户须知
所有文档均会更新,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此 实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站
www.microchip.com)获取最新文档。
文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为
DSXXXXXA”,其中 “XXXXX”为文档编号,“A”为文档版本。
欲了解开发工具的最新信息,请参考 MPLAB
(主题),打开现有在线帮助文件列表。
简介
本文档的目的是对使用 Microchip dsPIC 语言工具时用到的库进行定义和说明,这 些语言工具是基于 GNU 编译器集 (GNU Compiler CollectionGCC)技术的。相关 的语言工具有:
®
• MPLAB
• MPLAB C30 C 编译器
• MPLAB LINK30 链接器
• MPLAB LIB30 归档程序 / 库管理器
其他使用工具
本章讨论的内容包括:
关于本指南
推荐读物
疑难解答
• Microchip 网站
开发系统变更通知客户服务
客户支持
ASM30 汇编器
®
IDE 在线帮助。从 Help (帮助)菜单选择 Topics
2005 Microchip Technology Inc. DS51456B_CN 1
dsPIC®语言工具库
关于本指南
文档内容编排
本文档介绍了如何使用 GNU 语言工具为 dsPIC® 单片机应用编写代码。文档内容编排 如下:
库的概述—提供对库的概述。
DSP 函数库—列出了 DSP 操作的库函数。
dsPIC 外设函数库—列出了 dsPIC 芯片的软件和硬件外设操作的库函数与宏。
标准 C 数学函数库—列出了标准 C 操作的库函数与宏。
MPLAB C30 内建函数—列出了 C 编译器 MPLAB C30 的内建函数。
DS51456B_CN 第 2 页 2005 Microchip Technology Inc.
前言
本指南中使用的约定
本手册采用以下文档约定:
文档约定
说明 涵义 示例
Arial 字体: 斜体字 参考书目
需强调的文字 ...
首字母大写 窗口 Output 窗口
对话框 Settings 对话框
菜单选项 选择 Enable Programmer 引用 窗口或对话框中的字段名 Save project before build” 带右尖括号且有下划线的斜体文字菜单路径
粗体字 对话框按钮 单击 OK
选项卡 单击 Power 选项卡
‘bnnnn 尖括号 < > 括起的文字 键盘上的按键 <Enter> <F1>
Courier 字体: 常规 Courier 源代码示例
斜体 Courier 变量参数 file.o 其中 file可以是任
0xnnnn
方括号 [ ] 可选参数
花括号和竖线: { | } 选择互斥参数; “或”选择 省略号 ... 代替重复文字
二进制数, n 是其中一位
文件名
文件路径
关键字
命令行选项
位值
常数 0xFF, ‘A’
十六进制数, n 是其中一位 0xFFFF0x007A
表示由用户提供的代码
MPLAB
File>Save
‘b00100, ‘b10
#define START
autoexec.bat
c:\mcc18\h
_asm, _endasm, static
-Opa+, -Opa-
0, 1
一有效文件名
mcc18 [options] file [options]
errorlevel {0|1}
var_name [, var_name...]
void main (void) { ... }
®
IDE User's Guide
仅有
的编译器 ...
2005 Microchip Technology Inc. DS51456B_CN 3
dsPIC®语言工具库
推荐读物
本文档介绍了 dsPIC 的库函数和宏。更多关于 dsPIC 语言工具和其他工具的使用信 息,可以从下面的推荐读物中获得:
README 文件 关于 Microchip 工具的最新信息,请阅读软件附带的 README 文件 (ASCII 文本文
件)。 Getting Started with dsPIC Language Tools DS51316) 关于安装和使用 Microchip dsPIC 数字信号控制器 (digital signal controller, DSC
语言工具 (MPLAB ASM30MPLAB LINK30 MPLAB C30)的指南。同时提供了 使用 dsPIC 仿真器和 MPLAB SIM30 的示例。
MPLAB
指导如何使用 dsPIC DSC 汇编器 MPLAB ASM30dsPIC DSC 链接器 MPLAB LINK30 和各种 dsPIC DSC 实用程序,包括 MPLAB LIB30 归档程序 / 库管理器。
MPLAB
使用 dsPIC DSC C 编译器的指南。 MPLAB LINK30 与这个工具配合使用。 GNU HTML 文档 在语言工具的光盘中提供了这个文档。它介绍了标准 GNU 开发工具, dsPIC DSC
语言工具就是以此为基础的。 dsPIC30F Family Overview DS70043) 关于 dsPIC30F 系列芯片和架构的概述。 dsPIC30F Programmer’s Reference Manual DS70030dsPIC30F 编程人员的指南。包括编程模型和指令集。 Microchip 网站 Microchip 的网站 (http://www.microchip.com)提供了丰富的文档资料,可以方便地
下载各个数据手册、应用笔记、教程和用户指南。所有文档都采用 Adobe Acrobat
pdf)格式。
®
ASM30, MPLAB LINK30 and Utilities User's Guide DS51317
®
C30 C 编译器用户指南 (DS51284C_CN
疑难解答
本文档中没有提到的常见问题信息可查阅 README 文件。
DS51456B_CN 4 2005 Microchip Technology Inc.
MICROCHIP 网站
Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便 地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息:
产品支持——数据手册和勘误表、应用笔记和样本程序、设计资源、用户指南以及 硬件支持文档、最新的软件版本以及归档软件
一般技术支持——常见问题 (FAQ)、技术支持请求、在线讨论组以及 Microchip 顾问计划成员名单
Microchip 业务——产品选型和订购指南、最新 Microchip 新闻稿、研讨会和活动安 排表、 Microchip 销售办事处、代理商以及工厂代表列表
开发系统变更通知客户服务
Microchip 的客户通知服务有助于客户了解 Microchip 产品的最新信息。注册客户可在 他们感兴趣的某个产品系列或开发工具发生变更、更新、发布新版本或勘误表时,收 到电子邮件通知。
欲注册,请登录 Microchip 网站 www.microchip.com,点击 “变更通知客户
Customer Change Notification)”服务并按照注册说明完成注册。
开发系统产品的分类如下:
编译器——Microchip C 编译器及其他语言工具的最新信息,包括 MPLAB C18 MPLAB C30 C 编译器、 MPASM MPLAB LINK30 目标链接器,以及 MPLIB
仿真器——Microchip 在线仿真器的最新信息,包括 MPLAB ICE 2000 MPLAB ICE 4000
在线调试器——Microchip 在线调试器 MPLAB ICD 2 的最新信息。
MPLAB IDE 的最新信息,主要针对 MPLAB IDEMPLAB SIM 模拟器、MPLAB IDE 项目
管理器以及一般编辑和调试功能。
编程器——Microchip 编程器的最新信息,包括 MPLAB PM3 和PRO MATE 编程器以及 PICSTART
®
前言
TM
MPLAB ASM30 汇编器、 MPLINKTM和
TM
MPLAB LIB30 目标库管理器。
IDE——用于开发系统工具的Windows®集成开发环境Microchip MPLAB
®
®
Plus 和 PICkit® 1 开发编程器。
II 器件
2005 Microchip Technology Inc. DS51456B_CN 第 5
dsPIC®语言工具库
客户支持
Microchip 产品的用户可通过以下渠道获得帮助:
代理商或代表
当地销售办事处
应用工程师 (FAE
技术支持
开发系统信息热线
客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为 客户提供帮助。本文档后附有销售办事处的联系方式。
也可通过 http://support.microchip.com 获得网上技术支持。
DS51456B_CN 6 2005 Microchip Technology Inc.

1.1 引言

dsPIC® 语言工具库

1 章 库的概述

所谓库就是将一些常用的函数集合在一起,这样用户可以方便地引用和链接。请查阅 MPLAB ASM30, MPLAB LINK30 and Utilities User's Guide 获得有关创建和使用库的更 多信息。
1.1.1 汇编代码的应用
可以从 Microchip 网站下载 dsPIC 语言工具库的免费版本。提供了 DSP 函数库和 dsPIC 外设函数库的目标文件和源代码。仅提供了数学库的目标文件,数学库包含标 准 C 语言头文件 <math.h> 中的函数。其完整的标准 C 语言库随 MPLAB C30 C 编译 器提供。
1.1.2 C 代码的应用
dsPIC 语言工具库存放在 c:\pic30_tools\lib 目录下,其中, c:\pic30_toolsMPLAB C30 C 编译器的安装目录。可以通过 MPLAB LINK30 将这些库直接链接到 应用程序中。
1.1.3 本章内容
本章包括以下内容:
特定于 OMF 的库 / 启动模块
启动代码
•DSP函数库
•dsPIC外设函数库
标准 C 语言库 (包含数学函数)
• MPLAB C30 内建函数

1.2 特定于 OMF 的库 / 启动模块

库文件和启动模块是特定于目标模块格式 (Object Module FormatOMF)的。 OMF 可以为以下格式之一:
• COFF — 默认格式。
•ELF — 用于 ELF 目标文件的调试格式是 DWARF 2.0。
选择 OMF 的方法有两种:
1. 为所有工具设定一个名为 PIC30_OMF 的环境变量。
2. 当调用工具时在命令行中选择 OMF,如:-omf=omf -momf=omf
当我们创建应用程序时, dsPIC 工具先搜索一般的库文件 (非 OMF 格式)。如果没有 找到, dsPIC 工具搜索 OMF 规范的库文件,并确定使用哪个库文件。
例如,如果没有找到 libdsp.a,并且没有设定任何环境变量或命令行选项,默认情 况下将会使用文件 libdsp-coff.a
2005 Microchip Technology Inc. DS51456B_CN 7
dsPIC® 语言工具库

1.3 启动代码

为初始化数据存储器中的变量,链接器创建一个数据初始化模板。这个模板必须在应 用程序获得控制权之前,在启动时处理。对于 C 程序,这个函数是由 libpic30-coff.a 中的启动模块(crt0.o crt1.o),或 libpic30-elf.a 中的 启动模块 (crt0.eocrt1.eo)来完成的。汇编语言程序可以通过与需要的启动 模块文件链接直接来利用这些模块。启动模块的源代码在相应的 .s 文件中。
主启动模块 (crt0)对所有变量 (持久数据段中的变量除外)进行初始化 (根据 ANSI 标准的要求,未初始化的变量设置为 0)。备用启动模块 (crt1)不会进行数据 初始化。
关于启动代码的更多信息,请参阅 MPLAB ASM30, MPLAB LINK30 and Utilities User's Guide。对于 C 语言应用程序,可参阅

1.4 DSP 函数库

DSP 函数库 (libdsp-omf.a)为将在 dsPIC30F 数字信号控制器 (DSC)中执行 的程序提供了一套数字信号处理函数。 DSP 函数库共支持 49 个函数。

1.5 dsPIC 外设函数库

dsPIC (软件和硬件)外设函数库为设置和控制 dsPIC30F DSC 外设提供了函数和 宏。本书的相关章节中有相应的使用示例。
这些库是特定于处理器的,形式为 libpDevice-omf.a,其中, Device dsPIC 器件的编号 (如: libp30F6014-coff.a 是特定于 dsPIC30F6014 器件的)。
MPLAB C30 C
编译器用户指南》

1.6 标准 C 语言库 (包含数学函数)

提供了一整套符合 ANSI-89 的库。标准的 C 语言库文件是 libc-omf.a (由业界领 先的 Dinkumware 公司编写)和 libm-omf.a (由 Microchip 公司编写的数学函 数)。
另外,一些在使用 dsPIC 器件时必须进行修改的 dsPIC 标准 C 语言库辅助函数和标准 函数包含在 libpic30-omf.a
一个典型的 C 应用程序必须包含全部三个库。

1.7 MPLAB C30 内建函数

对于开发人员来说, MPLAB C30 C 编译器包含的内建函数与库函数工作方式相同。
DS51456B_CN 8 2005 Microchip Technology Inc.

2.1 简介

dsPIC® 语言工具库

2 DSP 函数库

DSP 函数库为将在 dsPIC30F 数字信号控制器 (DSC)中执行的程序提供了一系列数 字信号处理函数。 DSP 函数库旨在为 C 软件开发人员提供大部分通用信号处理函数的 高效实现。 DSP 函数库共支持 49 个函数。
函数库的主要目的是最大限度地缩短每个函数的执行时间。为了达到这个目的, DSP 函数库主要由优化的汇编语言编写。与 ANSI C 相比,在代码大小相同的情况下,应用 DSP 函数库可以大大地提高执行速度。另外,由于 DSP 函数库己经过严格的测试, 应用 DSP 函数库将缩短应用程序的开发时间。
2.1.1 汇编代码应用程序
可以从 Microchip 网站获得该库以及相关头文件的免费版本,其中包括源代码。
2.1.2 C 代码应用程序
MPLAB C30 C 编译器安装目录 (c:\pic30_tools)包含以下与库有关的子目录:
libDSP 函数库 / 归档文件。
src\dsp—库函数的源代码以及用于重建库的批处理文件。
support\hDSP 函数库的头文件。
2.1.3 本章内容
本章的内容包括:
•DSP函数库的使用
矢量函数
窗函数
矩阵函数
滤波函数
变换函数
2005 Microchip Technology Inc. DS51456B_CN 第 9
dsPIC® 语言工具库

2.2 DSP 函数库的使用

2.2.1 利用 DSP 函数库构建应用程序
利用 DSP 函数库构建应用程序只需要两个文件:dsp.hlibdsp-omf.adsp.h 是提供函数库中所有函数的原型以及 #define typedef 的头文件。
libdsp-omf.a 是一个归档库文件,它包含所有库函数的目标文件。(更多特定于 OMF 的库的信息,请参阅第 1.2 节 “特定于 OMF 的库 / 启动模块”。)
当编译应用程序时,调用 DSP 库中函数或者使用其符号或 typedef 的所有源文件必 须都 (使用 #include)引用 dsp.h。当链接应用程序时, libdsp-omf.a 必须作 为链接器的一个输入 (使用 --library-l 链接器开关),以便将应用程序使用的 函数链接到应用程序。
链接器将 DSP 库的函数存放到一个名为 .libdsp 的特殊文本段中。这可以通过查看 链接器生成的映射文件看到。
2.2.2 存储模型
DSP 函数库是使用 “小代码”和 “小数据”存储模型创建的,以尽可能生成最小的 库。因为一些 DSP 库函数是用 C 语言编写的,并且使用编译器的浮点库,因此 MPLAB C30 链接描述文件将 .libm .libdsp 文本段相邻存放。这保证了 DSP 数库可以安全地使用 RCALL 指令来调用浮点库中所需的浮点函数。
2.2.3 DSP 库函数的调用约定
DSP 函数库中的所有目标模块都遵循 dsPIC30F DSC C 语言兼容性原则,以及
MPLAB C30 C
8 个工作寄存器 (W0 W7)作为函数参数。任何其他函数参数都通过堆栈传递。 W0 W7 工作寄存器作为暂存存储器,函数调用后,其中的值不能保存。另一方面,
如果函数使用 W8 W13 中地任何一个工作寄存器,工作寄存器的内容先被保存起 来,然后该寄存器,函数返回时恢复其原来的值。函数 (非 void 函数)的返回值可以 保存在 W0 (也称为 WREG)中。当需要时,可以按照
指南》
中描述的 C 语言系统堆栈规则,使用运行时软件堆栈。根据这些规则, DSP
数库的目标模块可以链接到 C 程序、汇编程序或者混合使用这两种语言编写的程序。
编译器用户指南》
中陈述的函数调用约定。特别地,函数可以使用前
MPLAB C30 C
编译器用户
2.2.4 数据类型
DSP 函数库提供的运算利用了 DSP 指令系统和 dsPIC30F DSC 的架构特点。从这种 意义上来讲,大部分运算都是小数计算。
DSP 函数库利用整型定义了小数类型:
#ifndef fractional typedef int fractional; #endif
fractional
义的数据通常被称为 “1.15”数据。
数据类型用来表示带有 1 位符号位和 15 位小数位的数据。使用这种格式定
DS51456B_CN 10 2005 Microchip Technology Inc.
DSP 函数库
对于使用乘法器的函数,结果的计算要使用 40 位的累加器,并利用 “9.31”算法。 这种数据格式带有 9 位符号 / 指数位, 31 位小数位,它提供了更大的计算空间,比
1.15”类型提供的范围 (-1.00 +1.00)大得多。当这些函数计算出结果时,它们
自然会还原为 “1.15”格式的数据类型。 使用小数运算时,要对特定函数的允许输入值集合施加某些约束。如果保证了这些约
束, DSP 函数库提供的运算通常会产生精确到 14 位的数字结果。然而,一些函数会 对输入数据和 / 或输出结果进行隐含的定标,这样会使得输出结果的精度下降 (与浮 点运算相比)。
DSP 函数库中的某些运算需要更高级别的数据精度,要采用浮点算法运算。然而,这 些运算的结果会被转换为小数值以与整个应用程序统一。唯一例外的是 MatrixInvert 函数,它以浮点型算法计算浮点型矩阵的逆矩阵,而提供浮点型格式 的结果。
2.2.5 数据存储器的使用
DSP 函数库不对 RAM 进行分配,这个任务留给用户自己完成。如果您没有分配适当 的存储空间并正确地对齐数据,当函数运行时会出现非期望结果。另外,为了最大限 度地缩短执行时间, DSP 函数库并不会检查提供的函数参数 (包括指向数据存储器的 指针),来判断这些参数是否合法。
大部分函数都接受数据指针作为函数的参数,函数参数包含要操作的数据,通常情况 下还包含存放结果的存储单元。为方便起见, DSP 函数库中的大部分函数期望将其输 入参数分配到默认的 RAM 存储空间 (X 数据空间或 Y 数据空间),而将输出存放回默 认的 RAM 存储空间。然而,计算密集型的函数要求将一些操作数存放到 X 数据空间 和 Y 数据空间 (或是程序存储器和 Y 数据空间)中,这样运算能够利用 dsPIC30F 架 构的取双数据功能。
2.2.6 CORCON 寄存器的使用
DSP 函数库中的很多函数通过修改 CORCON 寄存器来使 dsPIC30F 器件工作在特定 的运算模式。在这些函数的入口, CORCON 寄存器被压入堆栈。接着,它被修改以正 确地执行期望的运算,最后 CORCON 寄存器从堆栈中弹出以恢复它原来的值。这种 机制允许库的执行尽可能正确,而不破坏 CORCON 的设定值。
当修改 CORCON 寄存器时,一般情况下它会被设置为 0x00F0。这使得 dsPIC30F 器 件工作在以下运算模式:
•DSP乘法被设定为有符号的小数运算
使能累加器 A 和累加器 B 的饱和模式
饱和模式设定为 “9.31”饱和 (超饱和)模式
使能数据空间写饱和 (Data Space Write Saturation
禁止程序空间可视性 (Program Space Visibility, PSV)
使能收敛 (无偏的)舍入法
关于 CORCON 寄存器及其影响的详细信息,可参阅
dsPIC30F
系列参考手册》
2005 Microchip Technology Inc. DS51456B_CN 11
dsPIC® 语言工具库
2.2.7 溢出和饱和处理
DSP 函数库使用 “9.31”饱和进行大多数计算,但是必须以 “1.15”格式存储输出结 果。如果在运算过程中,使用的累加器发生饱和(超过 0x7F FFFF FFFF 或低于 0x80 0000 0000),状态寄存器中的相应饱和位 (SA SB)就会被置位。这个位将一直保 持置位直到被清零。这样允许您在执行函数后检查 SA SB 位,以确定是否应该对函 数的输入数据进行定标。
同样地,如果一个计算导致累加器溢出(累加器值超过 0x00 7FFF FFFF 或低于 0xFF 8000 0000),状态寄存器中相应的溢出位(OA OB)就会被置位。与 SA SB 位不 同, OA OB 位不会一直保持置位到被清零。每次执行使用累加器的运算时都会更新 这些位。如果超出这个指定的范围,这是很重要的事件,建议要通过 INTCON1 寄存 器中的 OVATE 位和 OVBTE 位来使能累加器溢出陷阱。这使得一旦发生溢出就会产生 算术错误陷阱,这样您就可以进行需要的操作。
2.2.8 集成到利用中断和 RTOS 的应用程序中
DSP 函数库可以很容易地集成到利用中断和 RTOS 的应用程序中,但要遵循某些规 则。为了最大限度地缩短执行时间, DSP 函数库利用了 DO 循环、 REPEAT 循环,模 寻址和位反转寻址等。这些都是 dsPIC30F DSC 中的有限硬件资源,当中断 DSP 库 函数的执行时,后台代码必须考虑每个资源的使用。
当与 DSP 函数库集成时,必须检查下文中每个函数描述中的 “资源使用情况”,以确 定使用哪些资源。如果库函数将被中断,要自己保存和恢复函数用到的所有寄存器的 内容,包括 DOREPEAT 和特殊寻址硬件的状态。这当然也包括存储和恢复 CORCON 寄存器和状态寄存器的内容。
2.2.9 重建 DSP 函数库
提供了名为 makedsplib.bat 的批处理文件来重建 DSP 函数库。 MPLAB C30 编译 器需要重建 DSP 函数库,批处理文件假定编译器安装在默认的目录 c:\pic30_tools 下。如果您的语言工具安装在不同的目录下,您必须修改批处理文 件中的目录以符合语言工具的实际位置。
DS51456B_CN 12 2005 Microchip Technology Inc.

2.3 矢量函数

DSP 函数库
本节将讨论 DSP 函数库的小数矢量的概念,并描述执行矢量操作的各个函数。
2.3.1 小数矢量运算
小数矢量是矢量元素和相应的元素编号组成的集合,在存储器中连续分配,其中第一 个元素位于最低的存储地址。存储单元的一个字 (两个字节)用于存储一个元素的 值,且这个量必须解释为用 “1.15”数据格式表示的小数。
指向矢量第一个元素的指针用作访问每个矢量值的句柄。第一个元素的地址称为矢量 的基地址。因为矢量的每个元素都是 16 位的,基地址必须对齐到偶数地址。
一维矢量的配置与器件的存储器存储模型相适应,所以对于一个具有 N 个元素的矢 量,其第 n 个元素可以用如下方法通过矢量的基地址 BA 访问:
BA + 2(n-1),其中 1 n N
dsPIC30F 器件的字节寻址能力,故系数选择为 2。 在 DSP 函数库中,实现了一元和二元的小数矢量运算。一元运算中的操作数矢量称为
源矢量。在二元运算中,第一个操作数称为第一源矢量,第二个操作数称为第二源矢 量。每个运算都对一个或几个源矢量元素进行计算。某些运算的结果是标量值 (同样 会被表示为 “1.15”类型的小数),而另外一些运算的结果是矢量。当结果也是矢量 时,也称为为目标矢量。
某些计算结果是矢量的运算允许 “原址”计算。即运算的结果被重新存放到源矢量中
(或者是二元运算中的第一源矢量)。在这种情况下,目标矢量被认为会 (在物理上)
替代 (第一)源矢量。如果一个运算可以 “原址”计算,那么下文中函数描述的 “说 明”中会指出这一点。
对于某些二元运算,(在物理上)两个操作数可以有相同的源矢量,这表示对源矢量和 其本身进行运算。如果一个给定的运算可以进行这种类型的计算,那么下文中函数描 述的 “说明”中会指出这一点。
某些运算既可以对源矢量和其本身进行计算,又可以 “原址”计算。 DSP 函数库中的所有小数矢量运算都将操作数矢量的基数 (元素数目)作为参数。基
于这个参数的值,作了以下假设: a) 一个特定运算所涉及到的所有矢量总共占用的存储空间在目标器件的可用数据存
储空间范围内。
b) 在二元运算情况下,两个操作数矢量的基数都
参阅 VectorConvolve VectorCorrelate 函数的 “说明”)。
c) 目标矢量
必须
足够大以接受运算的结果。
必须
符合矢量代数规则 (具体请
2005 Microchip Technology Inc. DS51456B_CN 13
dsPIC® 语言工具库
2.3.2 用户需要注意的事项
a) 不对这些函数执行边界检查。基数超出范围 (包括零长度的矢量)以及二元运
算中源矢量大小不一致都可能产生预想不到的结果。
b) 如果源矢量中相应元素的运算结果大于 1-2
导致饱和。同样地,如果运算结果大于 1-2 也会导致饱和。
c) 建议在每个函数调用结束后检查状态寄存器 (Status registerSR)。尤其是,
用户可以在函数返回后检查 SASB SAB 标志,以判断是否发生了饱和。
d) 所有函数都设计为对分配到默认 RAM 存储空间 (X 数据空间或 Y 数据空间)中
的小数矢量进行运算。
e) 返回一个目标矢量的运算可以是嵌套的,例如,如果:
a = Op1 (b, c),且 b = Op2 (d)c = Op3 (e, f),则
a = Op1 (Op2 (d), Op3 (e, f))
2.3.3 附加说明
函数的描述将其范围限制在了这些运算的正常使用范围内。然而,由于这些函数的计 算过程中不进行边界检查,因此可根据特定需要自由地解释运算及其结果。
例如,当计算函数 VectorMax 时,源矢量的长度可能会超过 numElems。这种情况 下,可以使用这个函数
再如,您可能对用位于 M M+numElems-1 之间的源矢量的 numElems 个元素来替 换位于 NN+numElems-1 之间的目标矢量的 numElems 个元素感兴趣。可以用以 下方法使用 VectorCopy 函数:
fractional* dstV[DST_ELEMS] = {...}; fractional* srcV[SRC_ELEMS] = {...}; int n = NUM_ELEMS; int N = N_PLACE; /* NUM_ELEMS+N int M = M_PLACE; /* NUM_ELEMS+M fractional* dstVector = dstV+N; fractional* srcVector = srcV+M;
-15
或者小于 -1.0,矢量的加减运算会
-15
或小于 -1.0,矢量的点积和幂运算
仅仅
在源矢量的前 numElems 个元素中查找最大值。
DST_ELEMS */ SRC_ELEMS */
dstVector = VectorCopy (n, dstVector, srcVector);
dstVector = VectorCopy (n, dstVector, srcVector);
在这个例子中, VectorZeroPad 函数可以 “原址”运算,现在 dstV = srcV,其 中, numElems 为要保存的源矢量开头的元素数目, numZeros 为要设置为零的矢量 末尾的元素数目。
另外,可以利用不执行边界检查开发出更多的功能。
DS51456B_CN 14 2005 Microchip Technology Inc.
DSP 函数库
2.3.4 各个函数
下面将说明实现矢量运算的各函数。
VectorAdd
描述: VectorAdd 函数将第一源矢量中每个元素的值与第二源矢量中对应元
素的值相加,并将结果存放在目标矢量中。 头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件: 资源使用情况: 系统资源的使用:
dsp.h
extern fractional* VectorAdd (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中的元素数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
如果 rcV1[n] + srcV2[n] 的绝对值大于 1-2
元素饱和。
该函数可 “原址”计算。
该函数可以对源矢量和其本身进行计算。
vadd.asm
W0..W4 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
-15
,运算会导致第 n 个
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数调用和返回开销):
17 + 3(numElems
2005 Microchip Technology Inc. DS51456B_CN 15
dsPIC® 语言工具库
VectorConvolve
描述: VectorConvolve 函数计算两个源矢量的卷积,并且将结果存储在目
头文件: 源文件:
参数:
返回值: 指向目标矢量基地址的指针 说明: 第二源矢量中的元素数目
源文件:
标矢量中。结果用以下公式计算:
n
yn() xk()hn k()
=
k0=
n
=
yn() xk()hn k()
yn() xk()hn k()
式中, x(k) 为大小为 N 的第一源矢量, h(k) 为大小为 M 的第二源矢量
M N)。
dsp.h
extern fractional* VectorConvolve ( int numElems1, int numElems2, fractional* dstV, fractional* srcV1, fractional* srcV2 );
numElems1 第一源矢量中的元素数目 numElems2 第二源矢量中的元素数目 dstV 指向目标矢量的指针 srcV1 指向第一源矢量的指针 srcV2 指向第二源矢量的指针
knM 1+=
N1
=
knM 1+=
其中 0
必须
目标矢量必须已经存在,且元素数目应为 numElems1+numElems2-1。
该函数可以对源矢量和其本身进行计算。
vcon.asm
n < M
,其中 M
,其中 N
小于或等于第一源矢量中的元素数目。
n < N
n < N+M-1
DS51456B_CN 16 2005 Microchip Technology Inc.
VectorConvolve (续)
DSP 函数库
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W10 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
58
周期数 (包括 C 函数调用和返回开销)
对于 N = numElems1M = numElems2
M
28 13M 6 m
++
28 13M 6 m
m1=
M
m1=
NM()73M+()++ +
,其中 M = N
VectorCopy
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorCopy 函数将源矢量的元素复制到目标矢量 (已经存在)的开
头,使得:
dstV[n] = srcV[n]0
dsp.h
extern fractional* VectorCopy (
int numElems,
fractional* dstV,
fractional* srcV
);
numElems 源矢量中的元素数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
必须
目标矢量
多)。
函数可以 “原址”计算。关于这种运算模式的更多信息,可参阅本章的
“附加说明”部分。
vcopy.asm
W0..W3 使用,不恢复
已经存在,并且必须至少有 numElems 个元素 (可以更
n < numElems
,其中 M < N
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
6
周期数 (包括 C 函数的调用与返回开销):
12 + numElems
2005 Microchip Technology Inc. DS51456B_CN 第 17
dsPIC® 语言工具库
VectorCorrelate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明: 第二源矢量中的元素数目
源文件: 资源使用情况: 系统资源的使用:
VectorCorrelate 函数计算两个源矢量的相关,并且将结果存储在目 标矢量中。其结果可以通过下式计算:
N1
rn() xk()yk n+()
=
k0=
式中, x(k) 为大小为 N 的第一源矢量 y(k) 为大小为 M 的第二源矢量,其中 (M N)。
dsp.h
extern fractional* VectorCorrelate ( int numElems1, int numElems2, fractional* dstV, fractional* srcV1, fractional* srcV2 );
numElems1 第一源矢量中的元素数目 numElems2 第二源矢量中的元素数目 dstV 指向目标矢量的指针 srcV1 指向第一源矢量的指针 srcV2 指向第二源矢量的指针
,其中 0
必须
目标矢量 numElems1+numElems2-1。
该函数可以对源矢量和其本身进行计算。
该函数使用 VectorConvolve 函数。
vcor.asm
必须
已经存在,其元素数目应为
W0..W7 使用,不恢复, 以及 VectorConvolve 使用的资源
n < N+M-1
小于或等于第一源矢量中的元素数目。
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令 以及 VectorConvolve DO/REPEAT 指令。
程序字 (24 位指令):
14, 加上 VectorConvolve 的程序字。
周期数 (包括 C 函数的调用与返回开销):
19 + floor(M/2)*3,其中 M = numElems2, 加上 VectorConvolve 的周期。
注:在 VectorConvolve 的描述中,周期数包括 4 个周期的 C 函数调 用开销。因此, VectorCorrelate 中因 VectorConvolve 而增加 的实际周期数比单独的 VectorConvolve 所用的周期数少 4 个周期。
DS51456B_CN 18 2005 Microchip Technology Inc.
VectorDotProduct
描述:
头文件: 函数原型:
参数:
返回值: 乘积的和。 说明:
函数原型: 资源使用情况: 系统资源的使用:
VectorDotProduct 函数计算第一源矢量和第一源矢量中相应元素乘
积的和 (矢量点积)。
dsp.h
extern fractional VectorDotProduct (
int numElems,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中的元素数目
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
如果乘积之和的绝对值大于 1-2
该函数可以对源矢量和其本身进行计算。
vdot.asm
W0..W2 使用,不恢复 W4..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
-15
,该运算将导致饱和。
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
17 + 3(numElems)
.
VectorMax
描述:
头文件: 函数原型:
参数:
返回值: 矢量中的最大值。 说明:
源文件:
VectorMax 函数在源矢量中查找值大于或等于前面任何一个矢量元素
的最后一个元素。然后,它输出最大值以及最大值元素的下标。
dsp.h
extern fractional VectorMax (
int numElems,
fractional* srcV,
int* maxIndex
);
numElems 源矢量中的元素数目
srcV 指向源矢量的指针
maxIndex 指向保存 (最后一个)最大元素的下标的存储单元的指
如果 srcV[i] = srcV[j] = maxVal,且 i < j,则
*maxIndex = j
vmax.asm
2005 Microchip Technology Inc. DS51456B_CN 19
dsPIC® 语言工具库
VectorMax (续)
资源使用情况: 系统资源的使用:
VectorMin
描述:
头文件: 函数原型:
参数:
返回值: 矢量中的最小值。 说明:
源文件: 资源使用情况: 系统资源的使用:
W0..W5 使用,不恢复
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
14 如果 numElems = 1 20 + 8(numElems-2) 如果 srcV[n] 19 + 7(numElems-2) 如果 srcV[n] > srcV[n+1], 0
VectorMin 函数在源矢量中查找值小于或等于前面任何一个矢量元素 的最后一个元素。然后,它输出最小值以及最小值元素的下标。
dsp.h
extern fractional VectorMin ( int numElems, fractional* srcV, int* minIndex );
numElems 源矢量中的元素数目 srcV 指向源矢量的指针 minIndex 指向保存 (最后一个)最小元素下标的存储单元的指针
如果 srcV[i] = srcV[j] = minVal,且 i < j,则 *minIndex = j
vmin.asm
W0..W5 使用,不恢复
srcV[n+1]0 ≤ n < numElems-1
n < numElems-1
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
14 如果 numElems = 1 20 + 8(numElems-2) 如果 srcV[n] srcV[n+1], 0 19 + 7(numElems-2) 如果 srcV[n] < srcV[n+1], 0
DS51456B_CN 20 2005 Microchip Technology Inc.
n < numElems-1
n < numElems-1
VectorMultiply
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorMultiply 函数将第一源矢量中每个元素的值与第二源矢量中
对应元素的值相乘,并将结果存放在目标矢量相应的元素中。
dsp.h
extern fractional* VectorMultiply (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
该运算也可看作是矢量中逐个元素相乘。
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
vmul.asm
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
17 + 4(numElems)
VectorNegate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件:
VectorNegate 函数对源矢量中元素的值取反 (改变其符号),并将结
果存放在目标矢量中。
dsp.h
extern fractional* VectorNeg (
int numElems,
fractional* dstV,
fractional* srcV
);
numElems 源矢量中的元素的数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
0x8000 取反的值设置为 0x7FFF
该函数可以 “原址”计算。
vneg.asm
2005 Microchip Technology Inc. DS51456B_CN 21
dsPIC® 语言工具库
VectorNegate (续)
资源使用情况: 系统资源的使用:
VectorPower
描述: 头文件: 函数原型:
参数:
返回值: 矢量幂 (元素平方和)的值。 说明:
源文件: 资源使用情况: 系统资源的使用:
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
16
周期数 (包括 C 函数的调用和返回开销):
19 + 4(numElems)
VectorPower 函数计算源矢量元素的平方和。
dsp.h
extern fractional VectorPower ( int numElems, fractional* srcV );
numElems 源矢量中元素的数目 srcV 指向源矢量的指针
-15
如果元素平方和的绝对值大于 1-2 该函数可以对源矢量和其本身进行计算。
vpow.asm
W0..W2 使用,不恢复 W4 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
,该运算将导致饱和。
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
12
周期数 (包括 C 函数的调用和返回开销):
16 + 2(numElems)
DS51456B_CN 22 2005 Microchip Technology Inc.
VectorScale
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorScale 函数用一个定标值对源矢量中所有元素的值进行换算
(乘以定标值),并将结果存放在目标矢量中。
dsp.h
extern fractional* VectorScale (
int numElems,
fractional* dstV,
fractional* srcV,
fractional sclVal
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
sclVal 换算矢量元素的定标值
sclVal 必须是 “1.15 “格式的小数。
该函数可以 “原址”计算。
vscl.asm
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
18 + 3(numElems)
VectorSubtract
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
VectorSubtract 函数将第一源矢量中每个元素的值减去第二源矢量
中对应元素的值,并将结果存放在目标矢量中。
dsp.h
extern fractional* VectorSubtract (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量 (被减数)的指针
srcV2 指向第二源矢量 (减数)的指针
如果 rcV1[n] - srcV2[n] 结果的绝对值大于 1-2
n 个元素饱和。
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
-15
,该运算会导致
2005 Microchip Technology Inc. DS51456B_CN 23
dsPIC® 语言工具库
VectorSubtract (续)
源文件: 资源使用情况: 系统资源的使用:
VectorZeroPad
vsub.asm
W0..W4 使用,不恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销)
17 + 4(numElems)
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件:
VectorZeroPad 函数将源矢量复制到已经存在的目标矢量的开头,并 对目标矢量中剩余的 numZeros 个元素填充零:
dstV[n] = srcV[n]0 dstV[n] = 0numElems
dsp.h
extern fractional* VectorZeroPad ( int numElems, int numZeros, fractional* dstV, fractional* srcV );
numElems 源矢量中元素的数目 numZeros 目标矢量末端被填充零的元素数目 dstV 指向目标矢量的指针 srcV 指向源矢量的指针
必须
目标矢量 该函数可以 “原址”计算。关于这种运算模式的更多信息,可参阅本章
的 “附加说明”部分。 该函数使用了 VectorCopy 函数。
vzpad.asm
已经存在,并且元素数目为 numElems+numZeros
n < numElems
n<numElems+numZeros
DS51456B_CN 24 2005 Microchip Technology Inc.
VectorZeroPad (续)
资源使用情况: 系统资源的使用:
W0..W6 使用,不恢复 以及 VectorCopy 使用的资源。
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令 以及 VectorCopy 使用的 DO/REPEAT 指令
程序字:
13 加上 VectorCopy 的程序字
周期数 (包括 C 函数的调用和返回开销):
18 + numZeros 加上 VectorCopy 函数的周期数。
注:在对 VectorCopy 的描述中,周期数包括 C 函数调用开销的 3
周期。因此, VectorZeroPad 中因 VectorCopy 而增加的实际周期
数比单独的 VectorCopy 函数所用的周期数少 3 个周期。
DSP 函数库
2005 Microchip Technology Inc. DS51456B_CN 25
dsPIC® 语言工具库

2.4 窗函数

窗是在其定义域 (0 n < numElems)内具有特定值分布的矢量。特定的值分布取决 于窗生成时的特性。
对矢量加窗可改变其值分布。在这种情况下,窗 元素。
对矢量加窗之前,必须先创建窗。窗初始化操作将生成窗元素的值。为获得更高的精 度,这些值是以浮点型算法计算的,其结果以 “1.15”小数格式存储。
当应用窗操作时,为了避免过多的开销,在程序的执行过程中只生成一次特定的窗, 但多次使用生成的窗。因此,建议将任何初始化操作返回的窗存储在持久 (静态)矢 量中。
2.4.1 用户需要注意的事项
a) 所有窗初始化函数都设计为将生成的窗矢量存放到默认的 RAM 存储空间 (X
据空间或 Y 数据空间)中。
b) 窗函数设计为对存放在默认 RAM 存储空间 (X 数据空间或 Y 数据空间)中的矢
量进行操作。
c) 建议在每个函数调用结束后,对状态寄存器 (SR)进行检查。 d) 由于窗初始化函数是用 C 语言实现的,关于周期数的最新信息,可参考最新发
布的有关电子文档。
必须
与修改后的矢量具有相同数目的
2.4.2 各个函数
下面将描述实现窗操作的各函数。
BartlettInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件:
BartlettInit 函数初始化一个长度为 numElems 的三角形(Barlett 窗。
dsp.h
extern fractional* BartlettInit ( int numElems, fractional* window );
numElems 窗中元素的数目 window 指向要被初始化的窗的指针
必须
window 矢量
initbart.c
已经存在,且其元素数目应为 numElems
DS51456B_CN 26 2005 Microchip Technology Inc.
Loading...
+ 373 hidden pages