第1章 数字信号处理简介 1
1.1 何谓数字信号处理 1
1.2 DSP的优势 2
1.3 DSP系统 2
1.3.1 模数转换 3
1.3.2 奈奎斯特准则 4
1.3.3 数模转换 6
1.4 DSP的应用 6
1.5 低功耗DSP应用 8
1.6 总结 9
第2章 实时系统与嵌入式系统概述 11
2.1 实时系统 11
2.1.1 软实时和硬实时系统 11
2.1.2 实时系统和分时系统的区别 11
2.1.3 DSP系统是硬实时系统 12
2.1.4 实时事件特征 13
2.2 高效运行和运行环境 14
2.3 实时系统设计的挑战 14
2.3.1 响应时间 15
2.3.2 从故障中恢复 15
2.4 分布式和多处理器构架 16
2.4.1 系统初始化 16
2.4.2 处理器接口 16
2.4.3 负载分配 16
2.4.4 集中的资源分配和管理 16
2.5 嵌入式系统 17
2.6 总结 18
第3章 嵌入式DSP系统开发生命周期概述 20
3.1 嵌入式系统 20
3.2 嵌入式DSP系统的生命周期 20
3.2.1 步骤1:研究系统的整体需求 20
3.2.2 步骤2:选择系统所需的硬件组件 21
3.2.3 硬件门电路 22
3.2.4 软件可编程 22
3.2.5 通用处理器 22
3.2.6 微控制器 23
3.3 FPGA解决方案 23
3.4 一个通用的信号处理解决方案 27
3.5 DSP加速决策 28
3.6 DSP处理的模型 32
3.6.1 输入/输出选择 33
3.6.2 计算DSP性能 34
3.6.3 DSP软件 36
3.7 代码的调整和优化 37
3.8 典型的DSP开发流程 38
3.9 总结 43
第4章 可编程DSP体系结构 44
4.1 可编程DSP体系结构的共性 44
4.2 内存体系结构 48
4.2.1 内存访问宽度 49
4.2.2 对齐问题 49
4.3 数据操作 49
第5章 FPGA在无线通信中的应用 51
5.1 概述 51
5.1.1 空间复用的MIMO系统 52
5.1.2 Flex-Sphere检测器 53
5.1.3 改良实数分解排序 55
5.1.4 软件无线电手机可配置检测器的FPGA设计 56
5.1.5 改良实值分解 58
5.1.6 MT=3的Xilinx FPGA实现结果 58
5.1.7 MT=4的Xilinx.FPGA实现结果 59
5.1.8 仿真结果 59
5.2 针对WiMAX的波束成形 61
5.2.1 在宽带系统中的波束成形 61
5.2.2 波束成形系统的计算要求和性能 63
5.2.3 使用WARPLab的波束成形实验 65
5.2.4 实验设置及结果 67
5.3 总结 69
参考文献 69
第6章 DSP软硬件协同 72
6.1 概述 72
6.2 嵌入式设计中的FPGA 72
6.3 ASIC与FPGA 74
6.4 软件可编程数字信号处理 75
6.5 通用型嵌入式内核 76
6.6 总结 76
6.6.1 架构 76
6.6.2 以应用为导向的设计 77
参考文献 77
第7章 DSP算法概述 78
7.1 DSP应用 78
7.2 信号与系统 78
7.2.1 DSP系统 79
7.2.2 混叠 79
7.3 基本的DSP系统 80
7.4 频率分析 81
7.4.1 卷积 81
7.4.2 相关性 82
7.4.3 FIR滤波器设计 82
7.4.4 加窗 83
7.5 算法实现:DSP架构 85
7.5.1 数字格式 86
7.5.2 溢出和饱和 86
7.6 FIR滤波器的实现 86
7.6.1 利用片上RAM 88
7.6.2 特别的乘积累加指令 88
7.6.3 块滤波 88
7.6.4 分离的程序和数据总线 88
7.6.5 零开销循环 89
7.6.6 循环缓冲器 89
7.7 系统问题 90
7.8 总结 90
第8章 复杂DSP应用的高层次设计工具 91
8.1 高层次综合设计方法 91
8.2 高层次设计工具 92
8.3 Catapult C 92
8.3.1 PICO 94
8.3.2 System Generator 95
8.4 案例分析 96
8.5 使用PICO的LDPC译码器设计案例 96
8.6 使用Catapult C的矩阵乘法器设计案例 99
8.7 使用System Generator的QR分解设计实例 101
8.8 总结 104
参考文献 104
第9章 DSP软件优化:DSP系统的基准测试和性能分析 107
9.1 概述 107
9.2 编写测试框架 107
9.3 隔离DSP内核函数 110
9.3.1 提防激进的编译工具 110
9.3.2 灵活放置代码 111
9.4 真实系统行为的建模 111
9.4.1 缓存带来的影响 111
9.4.2 内存延迟带来的影响 112
9.5 系统方面的影响 112
9.6 多核/多设备环境下的执行情况 112
9.7 分析测试方法带来的额外开销 113
9.7.1 排除无关事项 114
9.7.2 中断 114
9.7.3 基准测试中运行的库函数 114
9.7.4 使用仿真工具测试 114
9.7.5 基于硬件模块的测试 115
9.7.6 性能分析结果 116
9.7.7 如何解读获取的测试结果 116
第10章 DSP软件优化:高级语言和编程模型 117
10.1 汇编语言 117
10.2 带内联函数和编译指示的C编程语言 118
10.2.1 C语言编写的FIR滤波器 119
10.2.2 内联函数 119
10.2.3 编译指令 121
10.3 嵌入式C语言 122
10.4 C++语言在嵌入式系统中的应用 122
10.5 自动矢量化编译技术 123
10.5.1 MATLAB、Labview和类FFT-W的生成器套件 124
10.5.2 MATLAB和本地编译的代码 124
10.5.3 本地代码到MATLAB和硅片上的仿真 125
第11章 优化DSP软件:代码优化 126
11.1 优化过程 126
11.2 使用开发工具 126
11.2.1 编译器优化 126
11.2.2 编译器基本配置 127
11.2.3 启用优化 127
11.2.4 其他的优化配置 128
11.2.5 使用分析器 128
11.2.6 分析生成的汇编代码 129
11.3 背景知识:理解DSP架构 129
11.4 基本C语言优化技巧 130
11.5 用内联函数发挥DSP特性 131
11.6 指针和内存访问 135
11.6.1 确保对齐方式 135
11.6.2 restrict和指针别名 136
11.7 循环 137
11.8 硬件循环 138
11.9 其他的提示和技巧 139
11.9.1 内存争用 139
11.9.2 使用未对齐访问 139
11.9.3 访问缓存 139
11.9.4 嵌入小函数 139
11.9.5 使用供应商DSP库 139
11.10 一般的循环转换 139
11.11 循环展开 140
11.11.1 背景知识 140
11.11.2 实现 140
11.12 多重采样 140
11.12.1 背景知识 140
11.12.2 实现过程 141
11.12.3 实现 141
11.13 部分求和 141
11.13.1 背景知识 141
11.13.2 实现过程 142
11.13.3 实现 142
11.14 软件流水化 143
11.14.1 背景知识 143
11.14.2 实现 143
11.15 优化技巧的应用示例:互相关 144
11.15.1 创建 144
11.15.2 原始实现方案 144
11.15.3 步骤1:用内联函数执行小数计算并指定循环计数 145
11.15.4 步骤2:指定数据对齐方式并修改成多重采样 146
11.15.5 步骤3:汇编语言优化 148
第12章 DSP优化:内存优化 151
12.1 概述 151
12.2 代码量优化 151
12.2.1 编译器标记和标记挖掘 151
12.2.2 针对ISA的代码量与性能权衡 152
12.2.3 针对代码量优化调整ABI 153
12.2.4 告诫购买者:编译器优化与代码量互不相关 160
12.3 内存布局优化 161
12.3.1 内存优化概述 161
12.3.2 集中优化工作 162
12.3.3 向量化和动态代码计算比例 162
12.3.4 数据结构、数据结构数组及其混合 164
12.3.5 针对内存性能的循环优化 166
12.3.6 数据对齐方式的连锁效应 166
12.3.7 选择合适的数据类型会获得丰厚回报 166
第13章 针对功耗的软件优化 168
13.1 概述 168
13.2 了解功耗 168
13.3 测量功耗 171
13.3.1 使用电表测量功率 171
13.3.2 使用霍尔传感器型IC测量功率 171
13.3.3 稳压器模块电源IC 172
13.4 分析应用程序的功耗 173
13.5 降低功耗 174
13.6 时钟和电压控制 177
13.7 优化数据流 182
13.7.1 优化内存访问以降低功耗 182
13.7.2 DDR概述 183
13.7.3 通过优化DDR数据流来降低功率 185
13.8 外设/通信的使用 193
13.8.1 数据的DMA和CPU的对比 195
13.8.2 算法优化 197
13.8.3 递归消除 200
13.9 总结 202
参考文献 203
第14章 DSP操作系统 204
14.1 概述 204
14.2 DSP操作系统基础 204
14.3 实时性 205
14.4 多核 208
14.5 内存管理 213
14.5.1 内存分配 213
14.5.2 虚拟内存和内存保护 213
14.6 网络 214
14.6.1 处理器间通信 214
14.6.2 网络互联 216
14.7 调度 217
14.7.1 参考模型 217
14.7.2 抢占式调度与非抢占式调度 218
14.7.3 阻塞作业与非阻塞作业 218
14.7.4 协作式调度 218
14.7.5 调度类型 219
14.7.6 调度时的多核考虑 219
14.7.7 离线调度及其可能的实现 219
14.7.8 在线调度(基于优先级的调度) 224
14.7.9 静态优先级调度 224
14.7.10 动态优先级调度 226
14.7.11 离线调度与在线调度的比较 227
14.7.12 优先级反转 227
14.8 DSP OS辅助工具 229
14.9 总结 231
参考文献 232
第15章 DSP软件开发管理 234
15.1 概述 234
15.2 开发DSP应用面对的挑战 234
15.3 DSP开发流程 235
15.3.1 概念和规范定义阶段 235
15.3.2 DSP算法标准和指导原则 236
15.3.3 高级系统设计和工程性能 237
15.3.4 软件开发 238
15.3.5 系统创建、集成和测试 238
15.3.6 工厂和现场测试 238
15.4 DSP系统的设计挑战 238
15.5 DSP高级设计工具 239
15.6 DSP工具箱 239
15.7 DSP的主机开发工具 240
15.8 通用数据流实例 242
15.9 代码调整及优化 246
15.9.1 典型DSP开发流程 246
15.9.2 新手入门 248
15.10 总结 248
第16章 DSP多核软件开发 251
16.1 概述 251
16.2 多核编程模型 252
16.2.1 多个单核系统 252
16.2.2 真正的多核系统 254
16.3 移植向导 255
16.3.1 设计上的考虑 255
16.3.2 MJPEG案例分析 256
16.3.3 实现细节 259
16.4 总结 262
第17章 DSP应用程序的开发与调试 263
17.1 集成开发环境概述 263
17.2 新建项目 263
17.3 多核DSP环境下进行编译与链接 267
17.3.1 DSP SDOS操作系统 267
17.3.2 应用程序内存映射 268
17.3.3 应用程序的编译器配置 270
17.3.4 应用程序的链接器配置 274
17.4 在多核DSP上执行和调试应用程序 277
17.4.1 创建新连接 277
17.4.2 建立运行配置 279
17.4.3 调试器使用 280
17.5 使用软件和硬件专用资源跟踪与剖析多核应用程序 285
17.5.1 软件分析设置 286
17.5.2 跟踪 287
17.5.3 重要的代码 288
17.5.4 代码覆盖 289
17.5.5 性能 290
案例分析 294
案例分析1 LTE基带软件设计 294
案例分析2 DSP在医疗器械上的应用 346
案例分析3 VoIP DSP软件系统 365
案例分析4 嵌入式DSP应用系统软件性能 401
案例分析5 定义嵌入式系统的行为 412
案例分析6 DSP在软件无线电领域的应用 421