描述
开 本: 32开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302458968丛书名: 清华开发者书库
目录
第1章实时数字信号处理概述
1.1实时DSP系统的基本组成
1.2模拟接口
1.2.1采样
1.2.2量化和编码
1.2.3平滑滤波器
1.2.4数据转换器
1.3DSP硬件
1.3.1DSP硬件备选
1.3.2数字信号处理器
1.3.3定点和浮点处理器
1.3.4实时约束
1.4DSP系统设计
1.4.1算法开发
1.4.2DSP硬件的选择
1.4.3软件开发
1.4.4软件开发工具
1.5实验和程序实例
1.5.1CCS和eZdsp开始
1.5.2C文件I/O函数
1.5.3eZdsp的用户界面
1.5.4采用eZdsp的音频回放
1.5.5采用eZdsp的音频回送
习题
参考文献
第2章DSP基础及实现要点
2.1数字信号和系统
2.1.1基本数字信号
2.1.2数字系统的框图表示
2.2系统概念
2.2.1LTI系统
2.2.2z变换
2.2.3传递函数
2.2.4极点和零点
2.2.5频率响应
2.2.6离散傅里叶变换
2.3随机变量简介
2.3.1随机变量的回顾
2.3.2随机变量的运算
2.4定点表示和量化效应
2.4.1定点格式
2.4.2量化误差
2.4.3信号量化
2.4.4系数量化
2.4.5舍入噪声
2.4.6定点工具箱
2.5溢出及解决方案
2.5.1饱和运算
2.5.2溢出处理
2.5.3信号缩放
2.5.4保护位
2.6实验和程序实例
2.6.1溢出和饱和运算
2.6.2函数逼近
2.6.3采用eZdsp的实时信号产生
习题
参考文献
第3章FIR滤波器设计与实现
3.1FIR滤波器简介
3.1.1滤波器特性
3.1.2滤波器类型
3.1.3滤波器规范
3.1.4线性相位FIR滤波器
3.1.5FIR滤波器的实现
3.2FIR滤波器设计
3.2.1傅里叶级数方法
3.2.2吉布斯现象
3.2.3窗函数
3.2.4采用MATLAB的FIR滤波器设计
3.2.5采用FDATool的FIR滤波器设计
3.3实现考虑
3.3.1FIR滤波器中量化效应
3.3.2MATLAB实现
3.3.3浮点C实现
3.3.4定点C实现
3.4应用: 插值和抽取滤波器
3.4.1插值
3.4.2抽取
3.4.3采样率转换
3.4.4MATLAB实现
3.5实验和程序实例
3.5.1采用定点C的FIR滤波
3.5.2采用C55xx汇编程序的FIR滤波
3.5.3采用C55xx汇编程序的对称FIR滤波
3.5.4采用DualMAC结构的优化
3.5.5实时FIR滤波
3.5.6采用C和汇编程序的抽取
3.5.7采用定点C的插值
3.5.8采样率转换
3.5.9实时采样率转换
习题
参考文献
第4章IIR滤波器设计与实现
4.1简介
4.1.1模拟系统
4.1.2映射属性
4.1.3模拟滤波器的特性
4.1.4频率变换
4.2IIR滤波器的设计
4.2.1双线性变换
4.2.2采用双线性变换的滤波器设计
4.3IIR滤波器的实现
4.3.1直接型
4.3.2级联实现
4.3.3并行实现
4.3.4采用MATLAB的IIR滤波器实现
4.4采用MATLAB的IIR滤波器设计
4.4.1采用MATLAB的滤波器设计
4.4.2采用MATLAB的频率转换
4.4.3采用FDATool的滤波器设计与实现
4.5实现考虑
4.5.1稳定性
4.5.2有限精度效应和解决方案
4.5.3IIR滤波器的MATLAB实现
4.6实际应用
4.6.1递归谐振器
4.6.2递归正交振荡器
4.6.3参数均衡器
4.7实验和程序实例
4.7.1采用浮点C的直接Ⅰ型IIR滤波器
4.7.2采用定点C的直接Ⅰ型IIR滤波器
4.7.3采用定点C的级联IIR滤波器
4.7.4采用内在函数的级联IIR滤波器
4.7.5采用汇编程序的级联IIR滤波器
4.7.6实时IIR滤波
4.7.7采用定点C的参数均衡器
4.7.8实时参数均衡器
习题
参考文献
第5章频率分析和离散傅里叶变换
5.1傅里叶级数和傅里叶变换
5.1.1傅里叶级数
5.1.2傅里叶变换
5.2离散傅里叶变换
5.2.1离散时间傅里叶变换
5.2.2离散傅里叶变换方法
5.2.3重要性质
5.3快速傅里叶变换
5.3.1时域抽取
5.3.2频域抽取
5.3.3快速傅里叶逆变换
5.4实现考虑
5.4.1计算的问题
5.4.2有限精度效应
5.4.3MATLAB实现
5.4.4采用MATLAB的定点实现
5.5实际应用
5.5.1频谱分析
5.5.2频谱泄露和分辨率
5.5.3功率谱密度
5.5.4卷积
5.6实验和程序实例
5.6.1采用浮点C的DFT
5.6.2采用C55xx汇编程序的DFT
5.6.3采用浮点C的FFT
5.6.4采用具有内在函数定点C的FFT
5.6.5FFT和IFFT的实验
5.6.6采用C55xx硬件加速器的FFT
5.6.7采用C55xx硬件加速器的实时FFT
5.6.8采用重叠相加技术的快速卷积
5.6.9实时快速卷积
习题
参考文献
第6章自适应滤波
6.1随机过程简介
6.2自适应滤波器
6.2.1自适应滤波简介
6.2.2性能函数
6.2.3速下降法
6.2.4LMS算法
6.2.5改进LMS算法
6.3性能分析
6.3.1稳定性约束
6.3.2收敛速度
6.3.3过量均方误差
6.3.4归一化LMS算法
6.4实现考虑
6.4.1计算的问题
6.4.2有限精度效应
6.4.3MATLAB实现
6.5实际应用
6.5.1自适应系统识别
6.5.2自适应预测
6.5.3自适应噪声消除
6.5.4自适应反演建模
6.6实验和程序实例
6.6.1采用浮点C的LMS算法
6.6.2采用定点C的Leaky LMS算法
6.6.3采用定点C和内在函数的归一化LMS算法
6.6.4采用汇编程序的延迟LMS算法
6.6.5自适应系统识别的实验
6.6.6自适应预测器的实验
6.6.7自适应信道均衡器的实验
6.6.8采用eZdsp的实时自适应预测
习题
参考文献
第7章数字信号产生和检测
7.1正弦波产生器
7.1.1查找表法
7.1.2线性调频信号
7.2噪声产生器
7.2.1线性同余序列
7.2.2伪随机二进制序列产生器
7.2.3白色、彩色和高斯噪声
7.3DTMF产生和检测
7.3.1DTMF产生器
7.3.2DTMF检测
7.4实验和程序实例
7.4.1采用查找表的正弦波产生器
7.4.2采用查找表的警笛产生器
7.4.3DTMF产生器
7.4.4采用定点C的DTMF检测
7.4.5采用汇编程序的DTMF检测
习题
参考文献
第8章自适应回波消除
8.1线路回波简介
8.2自适应线路回波消除器
8.2.1自适应回波消除的原理
8.2.2性能评估
8.3实际考虑
8.3.1信号的预白化
8.3.2延迟估计
8.4双重通话效应及解决方案
8.5非线性处理器
8.5.1中心削波器
8.5.2舒适噪声
8.6自适应回声消除
8.6.1回声
8.6.2回声消除器
8.6.3子带实现
8.6.4无延迟结构
8.6.5回声消除和降噪的集成
8.6.6实现考虑
8.7实验和程序实例
8.7.1采用浮点C的回声消除器
8.7.2采用具有内在函数的定点C的回声消除器
8.7.3AEC和降噪的集成
习题
参考文献
第9章语音信号处理
9.1语音编码技术
9.1.1采用LPC的语音生成模型
9.1.2CELP编码
9.1.3合成滤波器
9.1.4激励信号
9.1.5基于感知的小化程序
9.1.6语音活动检测
9.1.7ACELP编解码器
9.2语音增强
9.2.1噪音抑制技术
9.2.2短时频谱估计
9.2.3幅度谱减
9.3VoIP应用
9.3.1VoIP概述
9.3.2不连续传输
9.3.3数据包丢失隐藏
9.3.4媒体流的质量因素
9.4实验和程序实例
9.4.1采用具有内在函数的定点C的LPC滤波器
9.4.2采用具有内在函数的定点C的感知加权滤波器
9.4.3采用浮点C实现的VAD
9.4.4采用定点C实现的VAD
9.4.5采用不连续传输的语音编码
9.4.6含有CNG的语音解码器
9.4.7采用浮点C的频谱减算法
9.4.8定点C实现的G722.2
9.4.9定点C实现G.711压扩
9.4.10实时G.711音频回送
习题
参考文献
第10章音频信号处理
10.1简介
10.2音频编码
10.2.1编码基本原理
10.2.2频域编码
10.2.3无损音频编码
10.2.4MP3编码概述
10.3音频均衡器
10.3.1图形均衡器
10.3.2参数均衡器
10.4音频效果
10.4.1混响
10.4.2时间扩展和变调
10.4.3声音调制和混声
10.4.4空间声音
10.5实验和程序实例
10.5.1使用C语言实现浮点MDCT
10.5.2使用C和内在函数实现定点MDCT
10.5.3预回声效应
10.5.4浮点C的MP3解码
10.5.5使用eZdsp的实时参数均衡器
10.5.6镶边效果
10.5.7使用eZdsp的实时镶边效果
10.5.8颤音效果
10.5.9使用eZdsp的实时颤音效果
10.5.10空间声音效果
10.5.11用eZdsp的实时空间效果
习题
参考文献
第11章数字图像处理初步
11.1数字图像与系统
11.1.1数字图像
11.1.2数字图像系统
11.2色彩空间
11.3YCbCr下采样色彩空间
11.4色彩平衡和校正技术
11.4.1色彩平衡
11.4.2颜色校正
11.4.3Gamma校正
11.5直方图均衡
11.6图像滤波
11.7快速卷积
11.8实际应用
11.8.1DCT与JPEG
11.8.2二维DCT变换
11.8.3指纹
11.8.4离散小波变换
11.9实验和程序实例
11.9.1YCbCr到RGB转换
11.9.2白平衡
11.9.3Gamma校正和对比度调节
11.9.4图像滤波
11.9.5DCT和IDCT
11.9.6指纹图像处理
11.9.7二维小波变换
习题
参考文献
附录A常用公式及定义
A.1三角恒等式
A.2等比级数
A.3复变量
A.4功率单位
参考文献
附录B软件组织和实验列表
附录CTMS320C55xx DSP简介
C.1引言
C.2TMS320C55xx体系结构
C.2.1体系结构概述
C.2.2片上存储
C.2.3存储器映射寄存器
C.2.4中断和中断向量
C.3TMS320C55xx寻址模式
C.3.1直接寻址模式
C.3.2间接寻址模式
C.3.3寻址模式
C.3.4MMR寻址模式
C.3.5寄存器位的寻址模式
C.3.6循环寻址模式
C.4TMS320C55xx汇编语言编程
C.4.1算术指令
C.4.2逻辑和位操作指令
C.4.3转移指令
C.4.4程序流控制指令
C.4.5并行执行
C.4.6汇编指示
C.4.7汇编声明语法
C.5TMS320C55xx的C语言编程
C.5.1数据类型
C.5.2通过C编译器的汇编代码生成
C.5.3编译器关键词及编译指令
C.6混合C和汇编的编程
C.7实验和程序实例
C.7.1实例
C.7.2汇编程序
C.7.3乘法
C.7.4循环
C.7.5模运算
C.7.6使用C语言与汇编语言的混合程序
C.7.7AIC3204的使用
C.7.8模拟输入和输出
参考文献
近些年,采用通用数字信号处理器(DSP)的实时数字信号处理,提供了设计和实现实际应用DSP系统的有效方法。很多公司专注于实时DSP的研究来开发新的应用。实时DSP应用的研究已经是并且将继续是学生、工程师和研究者们的具有挑战的领域。值得重视的是,我们不仅要掌握理论,并且还要掌握系统设计和实现技术的技巧。自从2001年出版《实时数字信号处理》(第1版)和2006年出版第2版以来,数字信号处理器的应用渗透到更为广泛的应用中。这导致很多大学课程发生变化,以便提供新的注重实现和应用的实时DSP课程,而且采用动手操作的实时实验来增强传统理论的讲授效果。同时,新处理器和开发工具的进步对书本知识的更新提出了持续的要求,以便能够跟上快速的DSP开发、应用和软件更新的革命。我们希望本书的第3版采用动手实验与理论、设计、应用和实现相结合,以便实现对实时DSP技术进行有效的学习。本书在给出基本DSP原理的同时,给出了很多MATLAB例子,并且强调通过动手实验来进行实时应用的学习。此书可用于高年级本科生和研究生的教材。本书的预备知识包括信号与系统的概念、基本的处理器结构以及MATLAB和C语言编程。这些内容通常覆盖电子与计算机工程、计算机科学及其他相关科学与工程领域的大学二年级水平。此书可以作为工程师、算法开发者、嵌入式系统设计师和编程者开发实际DSP系统的原理和实现技术的参考资料。我们采用实际动手操作的方式来讲授实验并评估结果,以便帮助读者理解复杂的理论原理。在每一章后给出了一些图书、技术文章以及数学证明等参考文献,以供感兴趣读者阅读这些超出本书范围的内容。第3版的主要目标和变化总结如下: (1) 专注于实际应用,提供一步一步的动手实验,完成从采用MATLAB进行的算法评估到具体实现,包括采用浮点C编程,更新到定点C编程,以及采用带有C内在函数与定点数字信号处理器的汇编程序的混合C和汇编语言的软件优化。(2) 加强了很多实例和实验,以便使DSP原理的讲授变得更加有趣,并且可以和真实世界应用进行互动。为了便于进行实时实验,所有的C和汇编程序采用版本的开发工具Code Composer Studio和低成本的TMS320C5505(C55xx系列的成员) eZdsp USB stick进行了详细的更新。由于eZdsp的低成本和便携性,使得学生、工程师、教师以及业余爱好者可以在比传统实验室更加方便的地方进行DSP实验。这种新的硬件工具广泛地被大学和工业组织所采用,替代了以往更昂贵的开发工具。(3) 增加有吸引力和挑战性的DSP应用,例如: 下一代网络和蜂窝(移动)电话的语音编码技术; 便携式播放器的音频编码; 多种音响效果,包括空间声音、音乐的图形和参数化音频均衡器和音频录音效果; JPEG2000的二维离散小波变换; 特殊效果的图像滤波; 指纹图像处理。同时,开发采用模块化的设计和灵活接口的实时实验,以便这些软件可以作为原型程序来创建其他相关应用。(4) 以更灵活和逻辑性的方式组织章节。一些相关应用组织在一起。我们也去掉了一些内容,例如信道编码技术,也许其不适用于一个学期的课程。对第2版中依赖于硬件的内容进行了较大的简化,以附录的形式提供给对学习TMS320C55xx体系结构和汇编编程感兴趣的读者。所有的这些变化都是为了专注于DSP原理,并加强实际应用的动手实验这一目的。很多DSP算法和应用能够以MATLAB和浮点C程序的形式而得到。为了将这些程序转换为定点C,并为在定点处理器的实现而进行优化,本书提供系统的软件开发过程。为了有效地说明DSP的原理和应用,采用MATLAB进行算法的演示、设计和分析。在此开发阶段之后,紧接着进行DSP算法实现的浮点和定点C编程。后,结合CCS和C5505 eZdsp进行动手实验。为了利用先进体系结构和指令集进行有效的软件开发和维护,对于实时应用,强调采用混合C和汇编程序的方法。本书针对原理和应用两个部分进行组织: 部分(第1章至第6章)介绍DSP原理、算法、分析方法和实现考虑。第1章回顾了实时DSP功能模块、DSP硬件选择、定点和浮点DSP器件、实时约束以及算法和软件开发过程的基础知识。第2章给出了基础DSP概念和实现DSP算法的实现考虑。第3章和第4章分别介绍了有限冲激响应和无限冲激响应滤波器的理论、设计、分析、实现和应用。第5章介绍了采用离散傅里叶变换进行频率分析的概念,以及快速傅里叶变换的实现和应用。第6章给出了自适应信号处理的基本原理以及很多实际应用。第二部分(第7章至第11章)介绍几种重要的DSP应用,其在当代现实世界系统和设备的实现中扮演着重要的角色。这些经过挑选的应用包括: 第7章的数字信号产生和双音多频(DTMF)检测; 第8章的自适应回波消除,特别是用于VoIP和免提电话应用; 第9章的语音处理算法,包括移动通信中的语音增强和编码技术; 第10章的音频信号处理,包括便携播放器的音响效果、均衡器和编码方法; 第11章的包括JPEG2000和指纹应用的图像处理基础。后,附录A总结了用于本书的方程推导和习题求解的一些有用的公式,附录C为感兴趣的读者介绍了TMS320C55xx的体系结构和汇编编程。对于任何一本想要在一定时期内保持先进的技术书籍,必须针对这个动态领域的快速进步进行更新。我们希望此书能够在已经来临的技术中起到指导的作用,并为将要到来的技术提供灵感。软件获取本书在例子、实验和应用中利用了各种MATLAB、浮点和定点C以及TMS320C55xx汇编程序。从Wiley网站上(http://www.wiley.com/go/kuo_dsp)可以获得这些程序以及附带的很多数据文件的配套软件包。目录和子目录以及这些软件程序和数据文件均列在附录B中,并进行了解释。这些软件是每一章节后一节和附录C中进行实验所需要的,可以增强对DSP原理的理解。这些软件可以作为原型进行修改,以提高其他实际应用的开发进度。致谢我们对德州仪器(Texas Instruments)的Gathy Wicks及Gene Frantz、MathWorks的Naomi Fernandes和Courtney Esposito表示诚挚的感谢,他们为我们撰写此书提供了支持。我们也要对下列John Wiley & Sons支持此项目的员工表示感谢: 特约编辑Alexandra King、项目编辑Liz Wingett和高级项目编辑Richard Davies。同时,我们也向为此书终出版做了工作的John Wiley & Sons的工作人员表示感谢。我们还要感谢Hui Tian,他创建了用于实例和实验的专用音频剪辑。后,我们感谢我们的家庭,自从我们从20世纪90年代撰写本书第1版的工作开始,他们给予了无尽的爱、鼓励、耐心和理解。Sen M. Kuo,Bob H. Lee和Wenshun Tian
FIR滤波器设计与实现
正如第2章讨论的,数字滤波器包括FIR和IIR滤波器。本章将介绍数字FIR滤波器设计、实现以及应用等方面内容[110]。3.1FIR滤波器简介
采用FIR滤波器的优点总结如下: (1) FIR滤波器总是稳定的; (2) 可以保证实现线性相位滤波器的设计; (3) 在FIR滤波器中有限精度误差不太严重; (4) FIR滤波器可以在大多数数字信号处理中有效地实现,这些处理器具有用于FIR滤波的优化硬件和专用指令。导出满足一套规范的滤波器系数的过程称为“滤波器设计”。即便存在很多用于设计数字滤波器的计算机辅助工具,例如带有诸如“信号处理工具箱”(Signal Processing Toolbox)[11]和“DSP系统工具箱”(DSP System Toolbox,在老版本中称为“滤波器设计工具箱”)等相关工具箱的MATLAB工具,我们仍需要理解滤波器的基本特性,并且熟悉用于实现数字滤波器的技术。3.1.1滤波器特性线性时不变滤波器可以采用幅度响应、相位响应、稳定性、上升时间、稳定时间和过冲等特性来描述。幅度和相位响应决定滤波器的稳态响应,而上升时间、稳定时间、过冲说明了瞬态响应。对于瞬时输入变化,上升时间说明其输出变化率。稳定时间描述输出稳定到一个稳态值需要多长时间,而过冲显示输出超出期望值的情况。参考图2.9以及式(2.31)的定义,输入信号、滤波器和输出信号的幅度和相位响应可以表达为
|Y(ω)|=|X(ω)‖H(ω)|(3.1)
和
Y(ω)=X(ω) H(ω)(3.2)
其中,Y(ω)、X(ω)、H(ω)分别表示输出、输入和滤波器的相位响应。这些公式表明输入信号的幅度相位谱经过滤波器后会被滤波器所改变。幅度响应|H(ω)|说明在给定频率下滤波器的增益,而相位响应H(ω)影响在给定频率下滤波器的相移(或时间延迟)。线性相位滤波器具有满足下式的相位响应:
H(ω)=αω或H(ω)=π-αω(3.3)
滤波器的群延迟函数定义为
Td(ω)=-dH(ω)dω(3.4)
对于式(3.3)定义的线性相位滤波器,所有频率下的群延迟Td(ω)为常数α。由于输入信号中的所有频率成分延迟同样的时间,所以滤波器避免了相位失真。线性相位对于很多不同频率成分之间的时间关系要求很严格的应用是很重要的。【例3.1】考虑例2.14中的简单二点滑动平均滤波器,幅度响应为
|H(ω)|=12[1 cos(ω)]
由于幅度响应单调下降,并且在ω=π处等于0,这是一个低通滤波器,其相位响应为
H(ω)=-ω2
这是式(3.3)表示的线性相位。因此,滤波器具有常数时间延迟
Td(ω)=-dH(ω)dω=0.5
这个特性可以采用MATLAB程序example3_1.m来验证。采用freqz(b, a)的幅度和相位响应见图3.1。采用grpdelay(b, a)计算和显示群延迟,其表明对于所有频率具有常数延迟0.5。
图3.1二点滑动平均滤波器的幅度和相位响应
3.1.2滤波器类型滤波器通常采用幅度响应来定义。有四种不同类型的频率选择滤波器: 低通、高通、带通和带阻滤波器。因为实系数数字滤波器的幅度响应是ω的偶函数,所以通常在0≤ω≤π的频率范围来定义滤波器规范。理想低通滤波器的幅度响应见图3.2(a)。区域0≤ω≤ωc和ω>ωc分别定义为通带和阻带,ωc称为“截止频率”(cutoff frequency)。理想低通滤波器在通带0≤ω≤ωc具有幅度响应|H(ω)|=1,在阻带ω>ωc具有幅度响应|H(ω)|=0。这样,理想低通滤波器通过截止频率以下的低频成分,而对高于ωc的高频成分进行抑制。理想高通滤波器的幅度响应见图3.2(b)。高通滤波器通过截止频率ωc以上的高频成分,而对低于ωc的低频成分进行抑制。实际中,高通滤波器用于消除低频噪声。理想带通滤波器的幅度响应见图3.2(c)。频率ωa和ωb分别称为低截止频率和高截止频率。理想带通滤波器通过两个截止频率ωa和ωb之间的频率成分,而对低于ωa高于ωb的频率成分进行抑制。理想带阻(bandstop或bandreject)滤波器的幅度响应见图3.2(d)。非常窄带阻滤波器也称为陷波滤波器(notch filter)。例如,电力线产生60Hz正弦噪声,称为“电力线干扰”(power line interference)或60Hz杂音(60Hz hum),这样的噪声可以采用中心频率为60Hz的陷波滤波器进行移除。
图3.2四种不同理想滤波器的幅度响应
除了以上四种频率选择滤波器,还有一种全通滤波器对于所有频率ω提供频率响应|H(ω)|=1。根据式(3.2),设计全通滤波器可以用来校正由于物理系统引入的相位失真,而不会改变频率成分的幅度。一个非常特殊的全通滤波器的例子是理想希尔伯特(Hilbert)变换器,它对输入信号产生90°相移。多波段滤波器具有多个通带或阻带。多波段滤波器的一个特殊例子是梳状滤波器。梳状滤波器具有等距的零点,幅度响应的形状像一把梳子。梳状滤波器的差分方程给出如下
y(n)=x(n)-x(n-L)(3.5)
其中L是一个正整数。这种FIR滤波器的传递函数为
H(z)=1-z-L=zL-1zL(3.6)
这样,梳状滤波器具有L个零点,等距分布在单位圆上的位置为
zl=ej(2π/L)l,l=0,1,…,L-1(3.7)
【例3.2】L=8梳状滤波器具有八个零点,对于l=0, 1,…,7,分别为原文有误,根据式(3.7)应该是zl=1,ejπ/4,ejπ/2,ej3π/4,ejπ,ej5π/4,ej3π/2,ej7π/4。——译者注
zl=1,eπ/4,eπ/2,e3π/4,eπ(-1),e5π/4,e3π/2,e7π/4
此梳状滤波器的频率响应采用MATLAB程序example3_2.m(L=8)绘制,见图3.3。
图3.3L=8的梳状滤波器的幅度相位响应
图3.3表明梳状滤波器可以用作多波段带阻滤波器去移除在以下频率处的窄带噪声:
ωl=2πl/L,l=0,1,…,L/2-1(3.8)
通带的中心位于频率响应中相邻零点之间的一半处,即频率(2l 1)π/L, l=0, 1, …, L/2-1。梳状滤波器可用于通过或消除特定频率及谐波。对于抑制带有谐波相关成分的周期性信号,采用梳状滤波器比为每一个谐波设计单独的滤波器有效得多。例如,在电力变电站中的大变压器产生的杂音由60Hz电力线频率的偶次谐波(120Hz、240Hz、360Hz等)组成。当信号被变压器噪声损害时,可以采用120Hz倍数陷波频率的梳状滤波器来消除那些不希望的谐波成分。3.1.3滤波器规范经常在频率域说明数字滤波器的特性。这样,滤波器设计通常基于幅度响应规范。实际中,我们不能获得像图3.2中理想滤波器中那样无限陡峭的截止特性。从通带到阻带,实际滤波器具有逐渐滚降的过渡带。经常以容差(或纹波)的形式给出规范,说明过渡带来刻画允许滚降的平滑幅度。低通滤波器的典型幅度响应见图3.4,图中水平虚线表明的是容忍的偏差限制。幅度响应在通带具有峰值偏差δp,在阻带具有偏差δs。频率ωp和ωs分别是通带和阻带边缘(截止)频率。
图3.4低通滤波器的幅度响应和性能测量
如图3.4所示,通带(0≤ω≤ωp)幅度近似为单位1,并具有±δp的误差,即
1-δp≤|H(ω)|≤1 δp,0≤ω≤ωp(3.9)
通带纹波δp是幅度响应通带允许变化值。注意,幅度响应的增益归一化到1(0dB)。在阻带,幅度响应近似为0,并具有δs误差,即
|H(ω)|≤δs,ωs≤ω≤π(3.10)
阻带纹波(或衰减)δs描述的是在频率ωs以上信号成分的衰减。通带和阻带偏差通常采用分贝表示。通带纹波和阻带衰减定义为
Ap=20lg1 δp1-δpdB(3.11)
和
As=-20lgδsdB(3.12)
【例3.3】考虑具有通带纹波±0.01的滤波器,即δp=0.01。根据式(3.11),有
Ap=20lg1.010.99=0.1737dB
当阻带衰减为δs=0.01,有
As=-20lg(0.01)=40dB
过渡带是通带边缘频率ωp和阻带边缘频率ωs之间的频率区域。在这个区域,幅度响应从通带到阻带单调地下降。过渡带的宽度决定了滤波器有多陡峭。通常,要求采用高阶滤波器来实现更小的δp和δs以及更窄的过渡带。3.1.4线性相位FIR滤波器FIR滤波器的信号流图见图2.6,I/O方程由式(2.14)定义。如果L是奇数,则定义M=(L-1)/2。式(2.14)可写成
B(z)=∑2Ml=0blz-l=∑Ml=-Mbl Mz-(l M)=z-M∑Ml=-Mhlz-l=z-MH(z)(3.13)
其中
H(z)=∑Ml=-Mhlz-l(3.14)
令hl具有对称属性
hl=h-l,l=0, 1,…, M(3.15)
根据式(3.13),频率响应B(ω)可写成
B(ω)=B(z)z=ejω=e-jωMH(ω)
=e-jωM∑Ml=-Mhle-jωl=e-jωMh0 ∑Ml=1hl(ejωl e-jωl)
=e-jωMh0 2∑Ml=1hlcos(ωl)(3.16)
如果L是偶整数,M=L/2,式(3.16)的推导必须做稍微修改。式(3.16)表明如果hl是实值,
H(ω)=h0 2∑Ml=1hlcos(ωl)
是ω的实函数。这样B(ω)的相位和群延迟为
B(ω)=-Mω,H(ω)≥0
π-Mω,H(ω)<0(3.17a)
和
Td(ω)=dH(ω)dω=M=L/2,L为偶数
(L-1)/2,L为奇数(3.17b)
这些公式表明此FIR滤波器的相位是ω的线性函数,并且以样本衡量的群延迟对于所有频率为常数M。然而,在H(ω)存在符号改变,对应于B(ω)的180°相移,在通带内B(ω)为分段线性,正如图3.3所示。如果hl具有反对称(负对称)属性
hl=-h-l,l=0, 1,…, M(3.18)
这意味着h(0)=0。按照式(3.16)类似的推导,也能表明B(z)的相位是ω的线性函数。总之,如果FIR的系数满足正对称条件
bl=bL-1-l,l=0, 1,…, L-1(3.19)
或者反对称条件
bl=-bL-1-l,l=0, 1,…, L-1(3.20)
FIR滤波器就具有线性相位。对称(或反对称)FIR滤波器的群延迟是Td(ω)=(L-1)/2,对应于FIR滤波器的中点。取决于L是偶数还是奇数以及bl具有正对称还是负对称,存在四种类型的线性相位FIR滤波器。可以利用线性相位FIR滤波器的对称(或反对称)属性来减少滤波器需要的乘运算总数量。考虑如式(3.19)定义的偶数长度L和正对称的FIR滤波器。式(2.36)可以修改为
H(z)=b0(1 z-L 1) b1(z-1 z-L 2) … bL/2-1(z-L/2 1 z-L/2)(3.21)
定义在式(3.21)的H(z)的实现如图3.5所示,I/O方程表达为
y(n)=b0[x(n) x(n-L 1)] b1[x(n-1) x(n-L 2)] …
bL/2-1[x(n-L/2 1) x(n-L/2)]
=∑L/2-1l=0bl[x(n-1) x(n-L 1 l)](3.22)
图3.5对称FIR滤波器的信号流图(L为偶数)
对于反对称FIR滤波器,两信号的加法被减法所代替,即
y(n)=∑L/2-1l=0bl[x(n-1)-x(n-L 1 l)](3.23)
如式(3.22)和图3.5所示,首先通过将一对样本相加,然后将和与相应系数相乘,乘法数量可减少到一半。这里需要做出权衡,需要两个地址指针指向x(n-l)和x(n-L 1 l),而不是采用单个指针通过相同缓冲器线性地访问数据。TMS320C55xx提供两个专用指令,FIRSADD和FIRSSUB,来分别实现对称和反对称FIR滤波器。采用FIRSADD的实验将在3.5.3节给出。3.1.5FIR滤波器的实现FIR滤波器能够在逐块的基础上或逐个样本的基础上工作。在逐块处理中,输入样本分段进入乘法数据模块。每次执行一块滤波操作,结果输出块组合后形成总的输出。每个数据块的滤波过程可以采用线性卷积或快速卷积来实现,这些内容将在第5章进行介绍。在逐个样本处理过程中,在当前x(n)有效后,输入样本在每个采样周期内进行处理。正如2.2.1节讨论的,线性时不变系统的输出是输入样本与系统的冲激响应的卷积。假设滤波器是因果的,在时刻n的输出如下计算
y(n)=∑∞l=0h(l)x(n-l)(3.24)
线性卷积的计算过程包括以下四个步骤: (1) 折叠——关于l=0折叠x(l)得到x(-l)。(2) 移位——将x(-l)向右移动n个样本得到x(n-l)。(3) 相乘——对于所有l,将h(l)和x(n-l)重叠部分相乘得到h(l)x(n-l)乘积。(4) 相加——将所有乘积相加得到在时刻n的输出y(n)。重复步骤(2)至步骤(4),计算系统在其他瞬时n的输出。注意,输入信号长度M和一个冲激响应长度L的卷积结果是一个长度为L M-1的输出信号。【例3.4】考虑四个系数b0、b1、b2和b3组成的FIR滤波器,那么我们有
y(n)=∑3l=0blx(n-l),n≥0
线性卷积产生
n=0, y(0)=b0x(0)
n=1, y(1)=b0x(1) b1x(0)
n=2, y(2)=b0x(2) b1x(1) b2x(0)
n=3, y(3)=b0x(3) b1x(2) b2x(1) b3x(0)
一般地,有
y(n)=b0x(n) b1x(n-1) b2x(n-2) b3x(n-3),n≥3
图形解释见图3.6。
图3.6线性卷积的图形解释(L=4)
如图3.6所示,输入序列翻转(折叠),然后每次向右移动一个样本与滤波器系数重叠。在每一时刻,输出值是系数与其下对准的相应输入数据重叠部分乘积的和。线性卷积的翻转和滑动(Flipandslide)的形式见图3.7。注意,在每一个采样周期,x(-l)向右移动一个单位等效于bl向左移动一个单位。
图3.7线性卷积的翻转滑动过程
在时刻n=0,输入序列通过在其右侧补L-1个零进行扩展。的非零乘积来自b0乘以此时对准的x(0)。在滤波器完全与输入序列重叠之前,滤波器进行了L-1次迭代。因此,前L-1个输出对应于FIR滤波器的暂态。在n≥L-1之后,FIR滤波器的信号缓冲器填满,滤波器处于稳态。在FIR滤波中,系数是常数,但信号缓冲器(或抽头延迟线)中的数据在每个采样周期T发生变化。信号缓冲器以图3.8的方式进行刷新,丢弃旧的样本x(n-L 1),剩下的样本向缓冲器的右侧移动一个位置。新的样本(来自实时应用中的ADC)插入到标为x(n)的存储位置。此x(n)来自时刻n,将在下一次采样周期变为x(n-1),然后是x(n-2),以此类推,直到它从延迟链的末端掉落。如果数据移位操作不能采用硬件实现,信号缓冲器的刷新(如图3.8所示)将要求非常密集的处理时间。
图3.8FIR滤波的信号缓冲器刷新
有效的刷新信号缓冲器的方法是以循环的方式来安排数据,见图3.9(a)。在循环缓冲器中的数据样本不移动,而是缓冲器起始地址反向(逆时针)更新,这点不像图3.8所示那样,图3.8中的缓冲器保持固定起始地址,正向移动数据样本。当前信号样本x(n)由起始地址指针指向,而前一个样本已经顺时针方向顺序装载。当接收新的样本,它放置在位置x(n),并且执行滤波操作。在计算输出y(n)之后,起始指针逆时针移动一个位置到x(n-L 1)等待下一个输入信号到达。时刻n 1的下一个输入将被写入x(n-L 1)位置,下次迭代它将作为x(n)。循环缓冲器非常有效,这是因为更新操作是通过调整起始地址(指针)来完成的,在存储器中不存在任何数据样本的物理移动。
图3.9FIR滤波器的循环缓冲器
(a) 保持信号的循环缓冲器,x(n)的起始指针逆时针方向更新;
(b) FIR滤波器系数的循环缓冲器,指针总是指向滤波器开端的b0
图3.9(b)显示的是FIR滤波器系数的循环缓冲器,当达到系数缓冲器末端时,其可以使系数指针环绕一圈。即,指针从bL-1移动到b0,以便总是在个系数开始FIR滤波。3.2FIR滤波器设计设计FIR滤波器的目标是确定一套满足给定规范的滤波器系数。已开发多种技术用于设计FIR滤波器。傅里叶级数方法提供了一种计算FIR滤波器系数的简便方法,因此将其用来解释FIR滤波器设计的原理。3.2.1傅里叶级数方法傅里叶级数方法通过计算滤波器的冲激响应近似期望的频率响应来设计FIR滤波器。采用离散时间傅里叶变换的滤波器频率响应定义为
H(ω)=∑∞n=-∞h(n)e-jωn(3.25)
其中,滤波器的冲激响应可以采用离散时间傅里叶逆变换得到,即
h(n)=12π∫π-πH(ω)ejωndω,-∞≤n≤∞(3.26)
此式表明冲激响应h(n)为双边并且具有无限长度。对于频率响应为H(ω)的期望FIR滤波器,相应的冲激响应h(n)(与滤波器系数相同)可以通过计算由式(3.26)确定的积分求得。可以采用截断式(3.26)定义的理想无限长冲激响应来获得有限长度冲激响应{h′(n)}。即
h′(n)=h(n),-M≤n≤M
0,其他(3.27)
因果FIR滤波器可以通过将h′(n)序列向右移动M个样本得到,并重新索引系数为
b′l=h′(l-M),l=0, 1,…, 2M(3.28)
假设L为奇数(L=2M 1),此FIR滤波器具有L个系数b′l,l=0, 1,…, L-1。冲激响应关于b′M对称,这是由于根据式(3.26)可以得到h(-n)=h(n)。因此,由式(3.28)确定系数的传递函数B′(z)具有线性相位和恒定的群延迟。【例3.5】图3.2(a)的理想低通滤波器具有频率响应
H(ω)=1,|ω|≤ωc0,其他(3.29)
相应的冲激响应可以采用式(3.26)进行计算
h(n)=12π∫π-πH(ω)ejωndω=12π∫ωc-ωcejωndω
=12πejωnjnωc-ωc=12πejωcn-e-jωcnjn
=sin(ωcn)πn=ωcπsincωcnπ(3.30)
其中sinc函数定义为
sinc(x)=sin(πx)πx
通过将-M≤n≤M范围之外的所有冲激响应系数置为零,并向右移动M单位,可以获得有限长度为L的因果FIR滤波器,系数如下
b′l=ωcπsincωc(l-M)π,0≤l≤L-1
0,其他(3.31)
【例3.6】设计一个低通滤波器,其频率响应为
H(f)=1,0≤f≤1kHz
0,1kHz≤f≤4kHz
其中,采样频率为8kHz,冲激响应限制在2.5ms。由于2MT=0.0025s以及T=0.000125s,因此需要M=10。这样,实际滤波器具有21个系数(L=2M 1),1kHz对应于ωc=0.25π。根据式(3.31),我们有
b′l=0.25sinc[0.25(l-10)],l=0,1,…,20
【例3.7】设计一个低通滤波器,截止频率ωc=0.4π,滤波器长度L=61。当L=61,M=(L-1)/2=30。根据式(3.31),设计的滤波器系数为
b′l=0.4sinc[0.4(l-30)],l=0,1,…,60
采用MATLAB程序example3_7.m计算出这些系数,并绘制设计的滤波器的幅度响应曲线,见图3.10。
图3.10通过傅里叶级数方法设计的低通滤波器的幅度响应
3.2.2吉布斯现象如图3.10所示,通过简单地截断需要的滤波器(式(3.27)定义)冲激响应来获得FIR滤波器,在其幅度响应中会呈现振荡行为(或纹波)。当滤波器的长度增加时,通带和阻带的纹波数量都增加,纹波的宽度下降。大的纹波发生在过渡边缘,其幅度独立于L。式(3.27)描述的截断操作可以认为是无限长度序列h(n)乘以有限长度矩形窗w(n)。即
h′(n)=h(n)w(n),-∞≤n≤∞(3.32)
其中矩形窗w(n)定义为
w(n)=1,-M≤n≤M
0,其他(3.33)
【例3.8】截断傅里叶级数表示的FIR滤波器系数的振荡行为,见图3.10,可以通过式(3.33)矩形窗的频率响应来解释。频率响应可以表达为
W(ω)=∑Mn=-Me-jωn=sin[(2M 1)ω/2]sin(ω/2)(3.34)
采用MATLAB程序example3_8.m产生M=8和M=20的W(ω)幅度响应。如图3.11所示,幅度响应以ω=0为中心存在一个主瓣。所有其他的纹波称为旁瓣。在ω=2π/(2M 1)处幅度响应存在个零值。因此,主瓣的宽度为4π/(2M 1)。根据式(3.34),很容易得到主瓣的幅度为|W(0)|=2M 1。个旁瓣近似处于频率ω1=3π/(2M 1)处,对于M1,幅度|W1| ≈ 2(2M 1)/3π。主瓣幅度与个旁瓣幅度的比为
W(0)W(ω1)≈3π2=13.5dB
当ω从0上升到π,分母变得更大。此阻尼函数的结果见图3.11。当M增加,主瓣的宽度减小。
图3.11M=8(上)和M=20(下)的矩形窗幅度响应
在-M≤n≤M范围外,矩形窗陡峭地过渡到零,在幅度响应中导致吉布斯现象(Gibbs Phenomenon)。可以通过采用在末端光滑地降低到零的窗,或者提供一个从通带到阻带光滑的过渡,来减弱吉布斯现象。锥形窗将降低旁瓣高度,提高主瓣宽度,结果导致在非连续性上更宽的过渡。这种现象常称为泄露或拖尾,将在第5章中讨论。3.2.3窗函数针对不同的应用,已经开发出来很多锥形窗,并进行了优化。本节主要讨论广泛使用的汉明(Hamming)窗,窗的长度L=2M 1。即w(n),n=0, 1,…, L-1,并且关于中点n=M对称。决定FIR滤波器设计中窗性能的两个因素为窗的主瓣宽度和相对旁瓣水平。为了确保从通带到阻带的快速过渡,窗应该具有小的主瓣宽度。另一方面,为了减小通带和阻带的纹波幅度,旁瓣下的面积应该小。不幸的是,在选择窗口时需要对这两方面的要求做出权衡。汉明窗函数定义为
w(n)=0.54-0.46cos2πnL-1,n=0,1,…,L-1(3.35)
其也对应于升余弦,但常数和余弦项的权重不同。从式(3.35)中可见,汉明窗在末端逐渐降低到0.08。MATLAB提供了汉明窗函数:
w=hamming(L);
采用MATLAB程序hamWindow.m产生汉明窗及其幅度响应见图3.12。汉明窗的主瓣宽度与汉宁(Hanning)窗大致相同,但是后者具有额外的10dB阻带衰减(总共41dB)。汉明窗在通带给出了低的纹波,并且具有良好的阻带衰减,其通常适用于低通滤波器设计。
图3.12汉明窗(上)和其幅度响应(下)(L=41)
【例3.9】采用汉明窗设计一个低通滤波器,截止频率为ωc=0.4π,阶数L=61。采用MATLAB程序(example3_9.m),类似于例3.7中采用的。绘制出的采用矩形窗和汉明窗设计的滤波器的幅度响应见图3.13。我们可观察到采用矩形窗设计产生的纹波完全被采用汉明窗设计所消除。降低纹波的折中是使过渡带宽度增加。
图3.13采用矩形窗和汉明窗设计的低通滤波器的幅度响应(L=61)
采用傅里叶级数和窗函数方法设计FIR滤波器的过程总结如下: (1) 确定满足阻带衰减要求的窗类型。(2) 基于所给过渡带宽度确定窗尺寸L。(3) 计算窗系数w(l),l=0, 1,…, L-1。(4) 采用式(3.26)为期望的滤波器产生理想冲激响应h(n)。(5) 采用式(3.27)截断无限长的理想冲激响应,得到h′(n),-M≤n≤M。(6) 采用式(3.28)通过向右移位M单位得到因果滤波器,得到b′l,l=0, 1, …, L-1。(7) 将第(3)步得到的窗系数和第(6)步获得的冲激响应相乘,得到以下滤波器系数:
bl=b′lw(l),l=0, 1,…, L-1(3.26)
在FIR滤波器的冲激响应上应用窗函数具有平滑滤波器幅度响应的效果。对称窗将保持对称FIR滤波器的线性相位响应。MATLAB提供GUI工具,称为“窗设计与分析工具”(Window Design & Analysis Tool,WinTool),使用户能够设计和分析窗函数。在MATLAB命令窗中输入以下命令启动:
wintool
其默认打开64点汉明窗。利用这个工具,可以评估不同的窗,例如布莱克曼(Blackman)窗、切比雪夫(Chebyshev)窗和凯塞(Kaiser)窗。另一个MATLAB提供的分析窗的GUI工具为wvtool,是一个窗可视化工具。
3.2.4采用MATLAB的FIR滤波器设计FIR滤波器设计算法采用迭代优化技术来小化期望频率响应和实际频率响应之间的误差。设计优化线性相位FIR滤波器广泛采用的算法是ParkMcClellan算法。此算法展开误差以产生相等幅度的纹波。在本节中,我们仅仅考虑MATLAB“信号处理工具箱”(Signal Processing Toolbox)中的设计方法和滤波器函数,表3.1总结了信号处理工具箱。MATLAB “DSP系统工具箱”(DSP system Toolbox)(老版本为“滤波器设计工具箱”(Filter Design Toolbox))提供了更多先进的FIR滤波器设计方法。
表3.1MATLAB中的FIR滤波器设计方法和函数列表
设 计 方 法滤波器函数描述
窗方法fir1, fir2, kaiserord采用窗方法截断傅里叶级数过渡带的多带方法firls, firpm, firpmord等纹波或小二乘法约束小二乘法fircls, fircls1在全频率范围小化平方积分误差任意响应cfirpm任意响应
例如,fir1和fir2函数采用加窗傅里叶级数方法设计FIR滤波器。函数fir1采用汉明窗设计FIR滤波器如下:
b=fir1(L,Wn);
其中,Wn是在0和1(ω=π)之间的归一化截止频率。函数fir2采用任意幅度响应设计FIR滤波器如下:
b=fir2(L,f,m);
其中,频率响应是通过分别包含频率和幅度向量f和向量m来说明。f中的频率必须以升序落在0b=firpm(L,f,m);
此函数返回长度为L 1的线性相位FIR滤波器,通过f(频带边缘向量对,在0和1之间升序)和m(与f相同大小的实向量,说明得到的滤波器b的幅度响应所需的幅度),其具有好的期望频率响应的近似。在3.5.1节中的例子中将采用此函数来设计一个FIR滤波器。【例3.10】设计一个长度为18的线性相位滤波器,通带归一化频率0.4到0.6。此滤波器可以采用MATLAB程序example3_10.m设计,期望和获得实际幅度响应见图3.14。
图3.14期望和实际FIR滤波器的幅度响应
3.2.5采用FDATool的FIR滤波器设计“滤波器设计和分析工具”(Filter Design and Analysis Tool, FDATool)是设计、量化和分析数字滤波器的GUI工具。它包含很多先进的滤波器设计技术,并支持“信号处理工具箱”(Signal Processing Toolbox)中所有的滤波器设计方法。此工具具有以下用途: (1) 通过设置滤波器规范设计滤波器; (2) 分析设计的滤波器; (3) 将滤波器转换为不同结构; (4) 量化和分析量化的滤波器。
本节将简要介绍FDATool来设计和量化FIR滤波器。在MATLAB命令窗口,我们通过键入
fdatoo1
来打开FDATool。Filter Design & Analysis Tool窗口见图3.15。我们可以选择几种响应类型: Lowpass(低通)、Highpass(高通)、Bangpass(带通)、Bandstop(带阻)和Differentiator(微分器)。例如,设计一个带通滤波器,在GUI的Response Type区选择单选按钮至Bandpass。它有多个选项Lowpass、Highpass和Differentiator类型。
图3.15FDATool窗口
重要的是比较图3.15中的Filter Specification(滤波器规范)和图3.2中指标。参数Fpass、Fstop、Apass和Astop分别对应于ωp、ωs、Ap和As。这些参数可以在Frequency Specification和Magnitude Specificaiton区进行输入。频率的单位是Hz(默认)、kHz、MHz或GHz,幅度的选项是dB(默认)或Linear。【例3.11】设计一个满足以下规范的低通FIR滤波器: 采样频率Fs=8kHz; 通带截止频率Fpass=2kHz; 阻带截止频率Fstop=2.5kHz; 通带纹波Apass=1dB; 阻带衰减Astop=60dB。
图3.16低通滤波器的频率和幅度规范
可以很容易地通过在Frequency Specification和Magnitude Specificaiton区输入参数来设计此滤波器,见图3.16。按Design Filter按钮来计算滤波器系数。Filter Specification区将显示本设计的滤波器的Magnitude Response(dB)。我们可以通过Analysis菜单来分析本设计滤波器的不同特性。例如,在菜单中选择Impulse Response打开一个新的Impulse Response窗口来显示本设计的FIR滤波器系数。有两个选项来确定滤波器阶数: 或者采用Specify order来说明滤波器阶数,或者采用默认的Minimum order。例3.11采用默认的小阶数,阶数(31)显示在Current Filter Information区。注意,阶数order=31意味着FIR滤波器的长度为L=32。一旦完成滤波器的设计(采用64位双精度浮点算术表示)和验证,可以通过单击图3.15中边框工具栏Set Quantization Parameter按钮来打开量化模式。FDATool窗口的下半部分变成新的面板,Filter arithmetic菜单中默认Doubleprecision floatingponit。Filter arithmetic选项允许用户采用不同的量化设置量化设计的滤波器和分析效果。当用户选择算术设置(单精度浮点或定点),FDATool根据选择量化当前滤波器,并更新在分析区域显示的信息。例如,为了使能FDATool中的定点量化设置,从Filter arithmetic下拉菜单选择Fixedpoint。量化选项出现在FDATool窗口的底部面板,见图3.17。
图3.17在FDATool中设置定点量化参数
在对话窗口有三个标签,用户可以在FDATool中用来选择量化任务: (1) Coefficient标签定义系数量化; (2) Input/Output标签量化输入输出信号; (3) Filter Internals标签设置算术选项。
在为期望的滤波器设置好恰当的选项后,单击Apply启动量化过程。Coefficient标签是默认的激活面板。滤波器类型和结构决定可获得的选项。Numerator word length设置表示FIR滤波器系数的字长。注意,Bestprecision fraction lengths选项也需要检查,Numerator word length选项默认设置为16。我们可以不检查Bestprecision fraction lengths选项,来说明Numerator frac. Length或Numerator range( /-)。滤波器系数可以作为系数文件或MAT文件导出到MATLAB工作区。为了将量化滤波器系数保持成文本文件,从工具栏File菜单选择Export。当Export对话窗口出现时,从Export to菜单选择Coefficient File (ASCII),并从Format选项选择Decimal、Hexadecimal或Binary。在单击OK按钮后,Export Filter Coefficients to .FCF file对话窗口将出现。输入文件名称并单击Save按钮。为了创建包含滤波器系数的C头文件,从Targets菜单选择Generate C Header。对于FIR滤波器,C头文件中使用的变量用于分子名称和长度。可采用默认变量名B和BL,见图3.18,或根据定义在包含此头文件C中的变量名修改它们。可以采用默认的Signed 16bit integer with 16bit fractional length,或者选择Export as选择希望的数据类型。单击Generate按钮打开Generate C Header对话窗口。输入文件名并单击Save保存文件。
图3.18产生C头文件的对话窗口
3.3实现考虑本节讨论数字FIR滤波器的有限字长效应,采用MATLAB和C语言说明一些重要的软件实现问题。3.3.1FIR滤波器中量化效应考虑定义在式(2.36)中的FIR滤波器。滤波器系数bl从诸如MATLAB的滤波器设计包中获得。这些系数通常采用双精度浮点数进行设计和表示,必须在浮点处理器中量化实现。在设计过程中,对滤波器系数进行量化和分析。如果量化的滤波器不再满足所给规范,我们将优化、重新设计、重建结构,并且(或者)采用更多的位数来满足规范。令b′l表示对应于bl的量化值。如第2章讨论的,可以将非线性量化建模成线性操作,表示如下:
b′l=Q[bl]=bl e(l)(3.37)
其中,e(l)是量化误差,可以假设为均值为零的均匀分布的随机噪声。采用量化系数b′l的实际FIR滤波器的频率响应可以表示为
B′(ω)=B(ω) E(ω)(3.38)
其中
E(ω)=∑L-1l=0e(l)e-jωl(3.39)
表示在期望频率响应B(ω)中的误差。误差频谱边界
|E(ω)|=∑L-1l=0e(l)e-jωl≤∑L-1l=0|e(l)|e-jωl≤∑L-1l=0|e(l)|(3.40)
如式(2.83)所示,有
|e(l)|≤Δ2=2-B(3.41)
这样,式(3.40)变为
|E(ω)|≤2-BL(3.42)
这个边界是很保守的,这是由于它仅在所有e(l)具有相同符号并在范围内具有值时才能达到。更为实际的边界可以通过假设e(l)是统计的独立随机变量进行推导。【例3.12】本例首先采用小二乘法设计FIR滤波器: 为了将其转换为定点FIR滤波器,我们采用滤波器构建函数dfilt,并将滤波器的算术设置改为定点算法,如下:
hd=dfilt.dffir(b); %创建直接型FIR滤波器
set(hd,’Arithmetic’,’fixed’);
个函数返回数字滤波器对象hd,类型dffir(直接型FIR滤波器)。我们可以采用MATLAB FVTool(Filter Visualization Tool,滤波器可视化工具)来绘制量化的滤波器和相应的参考滤波器的幅度响应。定点滤波器对象hd采用16位数表示滤波器系数。我们可以采用不同字长做出几个滤波器副本。例如,可以采用如下12位数表示滤波器系数:
h1=copy(hd); %将hd拷贝为h1
set(h1,’CoeffWordLength’,12); %使用12位来表示系数
MATLAB程序见example3_12.m。3.3.2MATLAB实现对于评估目的,使用诸如MATLAB等强大的软件包进行软件实现和数字滤波器的测试是很方便的。MATLAB提供FIR和IIR滤波函数filter(或filtfilt)。此函数的基本形式为
Y=filter(b, a, x);
对于FIR滤波,向量a=1,滤波器系数bl包含在向量b中。输入向量为x,而滤波器输出向量为y。【例3.13】15kHz正弦信号,采样率8kHz,受白噪声破坏。此噪声信号采用MATLAB程序example3_13.m产生,保存在文件xn_int.dat中并打印绘制。在程序中,信号样本从原来的浮点数进行归一化,并采用以下MATLAB命令保存成Q15整数格式:
xn_int=round(32767*in./max(abs(in))); %归一化到16位整数
fid=fopen(‘xn_int.dat’,’w’); %向xn_int.dat保存信号
fprintf(fid,’4.0f\n’,xn_int); %以整数格式保存
FIR滤波器系数可以通过选择File→Export导出到当前MATLAB工作区中。在Export弹出对话窗口,在Numerator窗口键入b,并单击OK按钮。这样将滤波器系数保存在向量b中,其可用在当前MATLAB目录中。现在,我们可以采用MATLAB函数filter通过以下命令执行FIR滤波。
y=filter(b, 1, xn_int);
滤波器输出在工作区中保存为向量y,可以将其绘制出来与输入信号进行对比。【例3.14】本例采用随机数据作为输入信号来评估16位定点滤波器对比于原始的双精度浮点(64位)滤波器的精度。将一个量化器用于产生均匀分布白噪声数据,采用Q15格式的数据,如下:
rand(‘state’,0);%初始化随机数产生器
q=quantizer([16,15],’RoundMode’,’round’);
xq=randquant(q,256,1);
xin=fi(xq,true,16,15);
这样,xin是256位的整数数组,表示为定点对象(fi对象)。接着,我们执行实际的定点滤波器如下:
y=filter(hd,xin);
完整的MATLAB程序见example3_14.m。3.3.3浮点C实现FIR滤波器实现通常起始于浮点C,然后移植到定点C,如果需要的话,再移植到汇编程序。【例3.15】输入数据标为x,滤波器输出标为y。滤波器系数存在系数数组h[ ]。滤波器抽头延迟线(信号向量)w[ ]保存过去的数据样本。逐个样本浮点C程序如下:
void floatPointFir(float *x, float *h, short order, float *y, float *w)
{
short i;
float sum;
w[0]=*x ; //将当前数据赋给延迟线
for (sum=0, i=0; i {
sum =h[i] * w[i]; //乘积和
}
*y =sum; //保存滤波器输出
for (i=order-1; i>0; i–) //更新信号缓冲器
{
w[i]=w[i-1];
}
}
信号缓冲器w[ ]在每个采样周期进行更新,如图3.8所示。对于每次更新过程,在信号缓冲器中的旧样本被丢弃掉,剩下的样本在缓冲器中向一个方向移位。近的数据样本x(n)插入到顶部位置w[0]。在诸如C55xx的大多数数字信号处理器中具有循环寻址模式,在数据缓冲器中移位数据可以更替为循环缓冲器来提高效率。采用块处理技术来实现DSP算法将更为有效。对于很多实际应用,例如无线通信、语言处理和音频压缩,信号样本经常形成块或帧。通过帧而不是逐个样本处理数据的FIR滤波器称为块FIR滤波器。【例3.16】块FIR滤波函数在每次函数调用时处理一块数据样本。输入样本存在数组x[ ]中,滤波输出存在数组y[ ]。在以下C程序中,块尺寸标为blkSize:
void floatPointBlockFir(float *x, short blkSize, float *h, short order,
float *y, float *w, short *index)
{
short i,j,k;
float sum;
float *c;
k=*index;
for (j=0; j< blkSize; j ) //块处理
{
w[k]=*x ; //将当前数据赋给延迟线
c=h;
for (sum=0, i=0; i < order; i )//FIR滤波器处理
{
sum =*c * w[k ];
k%=order; //模拟循环缓冲器
}
*y =sum; //保存滤波器输出
k=(order k-1)%order; //为下次更新索引
}
*index=k; //更新循环缓冲器索引
}
3.3.4定点C实现采用小数表示的定点实现在第2章进行了介绍。在定点数字信号处理器中通常采用Q15格式。本节采用一个例子来介绍FIR滤波的定点C实现。【例3.17】对于定点实现,可采用Q15格式在-1到1-2-15的范围内来表示数据样本。ANSI C编译器要求数据类型定义为long以确保乘积可以保存为左端对齐的32位数据。当保存滤波器输出,32位临时变量sim右移15位,来对相乘后从32位到16位Q15数据的转换进行模拟。定点C代码如下:
void fixedPointBlockFir(short *x, short blkSize, short *h, short order,
short *y, short *w, short *index)
{
short i,j,k;
long sum;
short *c;
k=*index;
for (j=0; j< blkSize; j ) //块处理
{
w[k]=*x ; //将当前数据赋给延迟线
c=h;
for (sum=0, i=0; i < order; i ) //下次滤波器处理
{
sum =*c * (long)w[k ];
if (k==order) //模拟循环缓冲器
k=0;
}
*y =(short)(sum>>15); //保存滤波器输出
if (k– <=0) //为下次更新索引
k=order-1;
}
*index=k; //更新循环缓冲器索引
}
3.4应用: 插值和抽取滤波器在多速率信号处理应用中,对工作在不同采样率下的DSP系统进行互连,改变采样频率是必需的。从原始采样率转换为不同采样率的过程称为“采样率转换”。采样率转换的关键操作是低通FIR滤波。提高整数U倍采样率的过程称为“插值”(上采样),而降低整数D倍的过程称为“抽取”(下采样)。采用恰当U和D因子的插值和抽取组合,可以使数字系统将采样率改变到任何值。例如,在使用过采样和抽取的音频系统中,模拟输入可以首先采用一个低成本的抗混叠滤波器进行滤波,然后在更高的频率下采样。之后采用抽取过程降低过采样数字信号的采样率。在这个应用中,数字抽取滤波器提供高质量低通滤波,同时降低采用昂贵模拟滤波器的成本,进而降低总的系统成本。3.4.1插值插值可以采用以下方式来实现: 在原始低速率信号的连续样本之间插入额外零样本,然后在插值后的样本上应用低通(插值)滤波器。对于插值比1∶U,在采样率fs的原始信号x(n)的连续样本之间插入(U-1)个零,这样采样率提高至Ufs,或者说原始采样周期T降低至T/U。然后采用低通滤波器对中间信号x(n′)进行滤波,产生采样率为Ufs的插值信号y(n′)。用于插值流行的低通滤波器为线性相位FIR滤波器。在3.2.5节介绍的FDATool可以用来设计插值滤波器。工作在高采样率Ufs插值滤波器B(z)的理想频率响应
B(ω)=U,0≤ω≤ωc
0,ωc≤ω≤π(3.43)
其中,截止频率由下确定
ωc=πU或fc=f′s/2U=fs/2(3.44)
因为在U个输出样本上插入(U-1)个零,此插入过程分散了每一个信号样本的能量,所以增益U补偿上采样过程的能量损失。插值提高了采样率; 然而,插值后的信号的有效带宽仍然与原始信号(fs/2)相同,见式(3.44)。假设插值滤波器是一个长度为L的FIR滤波器,其中L是U的倍数。因为插值在输入信号的连续样本之间插入了(U-1)个零,所以或许可以重新安排需要的滤波操作,以便仅对非零样本进行相乘。只要这些非零样本在时刻n被相应的FIR滤波器系数b0, bU, b2U, …, bL-U,相乘即可。在随后时刻n 1,非零样本被滤波器系数b1, bU 1, b2U 1, …, bL-U 1,相乘。这种变换的过程可以通过将长度为L的高速率FIR滤波器B(z)更换为长度为L/U工作在低(原始)速率fs的U个滤波器Bm(z)来完成, m=0, 1, …, U-1。滤波器结构的计算效率来自于将单L点FIR滤波器分成长度为L/U的U个更小的滤波器,每一个滤波器工作在更低的采样率fs下。进一步地,这些U个滤波器共享一个大小为L/U的信号缓冲器,以便进一步降低存储需求。【例3.18】假设信号文件wn8kHz.dat中的数据在8kHz采样,MATLAB程序example3_18.m可用于将其插值到48kHz。图3.19(a)显示了原始信号的频谱,图3.19(b)显示了在低通滤波之前的插值信号(插值因子为6)的频谱,图3.19(c)低通滤波之后的频谱。本例清楚地表明了低通滤波器移除了所有折叠的镜像谱,如图3.19(b)。比较图3.19(a)的原始信号频谱和终的插值信号图3.19(c)的频谱,插值提高了采样率,同时没有提高信号的带宽(频率内容)。用在本例中的一些有用的MATLAB函数将在3.4.4节中呈现。
图3.19插值信号频谱
3.4.2抽取对采样率f′s的信号进行因子D的抽取得到更低的采样率f″s=f′s/D。可简单地在每D个样本中丢弃(D-1)个样本来完成整数因子D的下采样。然而,采样率下降倍数D会引起同样倍数D的带宽下降。这样,如果原始的高速率信号在新的减小的带宽外具有频率成分,将会发生混叠。在抽取之前,对原始信号x(n′)进行低通滤波,这种混叠问题可以得到解决。低通滤波器的截止频率如下:
fc=f″s/2=f′s/2D(3.45)
此低通滤波器称为“抽取滤波器”。抽取滤波器输出y(n′)是下采样的,以便获得希望的低速率抽取信号y(n″)。抽取滤波器工作在高速率f′s。然而,由于只有第D个输出滤波器样本是需要的,所以没有必要计算其他(D-1)个输出样本,将其丢弃即可。因此,总的计算可以减少至原来的1/D倍。【例319】信号文件wn48kHz.dat中的数据在48kHz采样。MATLAB程序example3_19.m可用于将其抽取到8kHz。图3.20(a)显示了原始信号的频谱,图3.20(b)显示了6倍抽取且没有经过低通滤波的频谱,图3.20(c)显示了在抽取过程之前有低通滤波的频谱。图3.20(b)中的频谱发生了干扰,特别是在低幅值部分。图3.20(c)代表了图3.20(a)中的0到4kHz的频谱,这是由于高频成分被低通滤波器消除了。这个例子显示了在丢弃(D-1)个样本之前进行低通滤波可以防止混叠,抽取过程降低信号带宽D倍,如式(3.45)所描述。
图3.20抽取过程的信号频谱
3.4.3采样率转换通过采用恰当的插值和抽取因子,完全可以在数字域完成比例因子U/D的采样率转换。为了使信号带宽的减小小化,必须首先执行因子U插值操作,然后对插值的信号进行因子D的抽取操作。例如,我们采用因子U/D=3/2将广播(32kHz)数字音频信号转换为专业音频信号(48kHz)。就是说,我们首先采用U=3对32kHz信号(16kHz带宽)进行插值,然而对得到的96kHz信号采用D=2进行抽取得到希望的48kHz(16kHz带宽)信号。值得注意的是,我们已经在抽取之前进行了插值,为的是保证希望的频谱特性。否则,抽取或许会移除高频成分的一部分,并且不能采用插值进行恢复。例如,如果我们首先对32kHz信号(16kHz带宽)采用D=2进行抽取,然后采用U=3插值,终的带宽将被抽取D=2减小至8kHz带宽。插值滤波器的截止频率由式(3.44)给出,抽取滤波器的截止频率由式(3.45)给出。因为插值低通滤波器是在信号样本插入零之后应用,而抽取低通滤波器是在丢弃信号样本之前应用,所以这两个滤波器可以组合起来形成一个低通滤波器。因此,用于采样率转换的低通滤波器的频率响应理想上具有截止频率:
fc=12min(fs,f′s)(3.46)
【例3.20】采用MATLAB程序example3_20.m(改编自MATLAB Help菜单中upfirdn),改变一个正弦波形的采样率,从48kHz变换至44.1kHz。对于采样率转换,MATLAB函数gcd可以用来找到转换因子U/D。例如,为了找到从音频信号(44.1kHz)转换到远程通信信道传输信号(8kHz)的因子U和D,可以采用以下命令:
g=gcd(8000, 44100); %求公约数
U=8000/g; %上采样因子
D=44100/g; %下采样因子
在本例中,我们得到U=80,D=441,由于g=100。3.4.4MATLAB实现3.4.3节介绍的插值过程可以采用MATLAB函数interp来实现,语法如下:
y=interp(x, U);
插值的信号向量y比原始输入向量x长U倍。对于给定信号降采样的抽取可以采用MATLAB函数decimate来实现,语法如下:
y=decimate(x, D);
此函数默认采用八阶低通切比雪夫Ⅰ型IIR滤波器。可以通过以下语法采用FIR滤波器:
y=decimate(x, D, ‘fir’);
此命令采用由fir1(30, 1/D)产生的30阶FIR滤波器来进行数据的低通滤波。也可以采用y=decimate(x, D, L, ‘fir’)来说明L阶的FIR滤波器。【例3.21】假设语言文件timit_4.asc,其采用采样率为16kHz的16位ADC进行数字化。以下MATLAB程序(example3_21.m)可以用来进行8倍抽取,转换至2kHz采样率。
load timit_4.asc -ascii; %载入语音文件
soundsc(timit_4, 16000); %在16kHz下播放
timit2=decimate(timit_4,8,60,’fir’); %8倍抽取
soundsc(timit2, 2000); %播放抽取后的语音
可以通过聆听8kHz带宽的语言文件timit_4和1kHz带宽的timit2语言文件来说出声音质量(带宽)的不同。在MATLAB程序中,我们也将原始的16kHz信号插值到48kHz,并播放高速率语言。注意,48kHz信号的声音质量与原始的16kHz信号的相同,这是由于它们都具有相同的8kHz带宽。此外,在MATLAB程序中,我们采用函数soundsc执行信号声级的自动缩放操作,而不存在斩波。MATLAB函数upfirdn支持采样率转换算法。此函数实现有效多相位滤波技术。例如,可以使用以下命令进行采样率转换:
y=upfindn(x, b, U, D);
此函数首先对在向量x中的信号进行因子U插值,采用给定系数向量b的FIR滤波器对中间结果信号进行滤波,后采用因子D对中间结果进行抽取,来获得终输出向量y。采样率转换结果的质量将依赖于FIR滤波器的品质。另一个执行采样率转换的函数为resample。例如:
y=resample(x, U, D);
此函数采用转换因子U/D将向量x中的序列转换为向量y中的序列。它使用firls采用Kaiser窗实现FIR低通滤波器。MATLAB还提供了函数intfilt来设计插值(和抽取)FIR滤波器。例如:
b=intfilt(U, L, alpha);
采用插值比1∶U设计线性相位低通FIR滤波器,并在向量b中保存滤波器系数。b的长度为2UL-1,滤波器的带宽为奈奎斯特频率的alpha倍,其中alpha=1实现全奈奎斯特间隔。3.5实验和程序实例本节采用C5505 eZdsp进行FIR滤波实验,包括采用C和C55xx汇编程序的实时演示。3.5.1采用定点C的FIR滤波此实验采用定点C程序来实现在3.3.4节中的块FIR滤波器。输入信号在8000Hz采样,采用16位Q15格式保存,其由分别为800、1800和3300Hz三个频率的正弦成分组成。此实验采用48抽头带通FIR滤波器,采用以下MATLAB程序设计:
f=[0 0.3 0.4 0.5 0.6 1]; %定义频带边沿
m=[0 0 1 1 0 0]; %定义希望的幅度响应
b=firpm(47, f, m); %设计具有48个小数的FIR滤波器
MATLAB函数firpm设计等纹波FIR滤波器,通带从1600到2000Hz。此带通滤波器将衰减800和3300Hz正弦成分。输入信号文件和48抽头带通滤波器将会用在Exp3.1到Exp3.4实验中,以便比较不同的FIR滤波器实现技术。用于这些实验的文件列在表3.2中。
表3.2Exp3.1实验中的文件列表
文件描述fixedPointBlockFirTest.c测试块FIR滤波器的程序fixedPointBlockFir.c定点块FIR滤波器的C函数fixedPointFir.hC头文件firCoef.hFIR滤波器系数文件tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件input.pcm输入数据文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用数据文件夹中的输入数据文件input.pcm,载入并运行程序。(3) 采用MATLAB绘制带通FIR滤波器的幅度响应,其滤波器系数列在头文件firCoef.h包含的数组firCoefFixedPoint[ ]中。(4) 通过聆听音频文件,对比滤波器的输出和输入; 通过绘制输入和输出信号的幅度谱,来对比滤波器性能。两个信号之间有什么不同,为什么?滤波器输出信号的特性是否符合第3步中的滤波器幅度响应?(5) 概括FIR滤波程序来评估其有效性,并识别耗时的操作。(6) 采用FDATool以下规范来设计等纹波FIR带阻滤波器: 采样频率Fs=8000Hz; 通带截止频率Fpass1=1400Hz; 阻带截止频率Fstop1=1700Hz; 阻带截止频率Fstop2=1900Hz; 通带截止频率Fpass2=2200Hz; 通带纹波Apass1=1dB; 阻带衰减Astop=50dB; 通带纹波Apass2=1dB。采用此滤波器重做实验的步骤(4)。3.5.2采用C55xx汇编程序的FIR滤波如附录C所示,C55xx处理器具有MAC(乘累加)指令、循环寻址模式和零开销循环嵌套,用来有效地实现FIR滤波。此实验利用C55xx汇编程序,采用循环系数和信号缓冲器来实现FIR滤波器。采用与前一个实验相同的带通滤波器和输入信号文件。这个实验表明,采用C55xx汇编程序实现FIR滤波器需要(阶数 4)个时钟周期来处理每个输入样本。这样,48抽头滤波器要求52个周期(除了过载)产生一个输出样本。表3.3列出了用于这个实验的文件。
表3.3Exp3.2实验中的文件列表
文件描述blockFirTest.c测试块FIR滤波器的程序blockFir.asm块FIR滤波器的汇编函数blockFir.hC头文件blockFirCoef.hFIR滤波器系数文件tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件input.pcm输入数据文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用数据文件夹中的输入数据文件input.pcm,载入并运行程序。(3) 采用CCS证实滤波结果,显示800Hz和3300Hz正弦成分已经被衰减。并且,通过与Exp3.1获得的结果比较输出文件来验证实验。(4) 概括FIR滤波器的汇编实现,并且将其与Exp3.1中的定点C实验需要的时钟周期进行对比。(5) 采用Exp3.1步骤(6)中设计的滤波器重复此实验。3.5.3采用C55xx汇编程序的对称FIR滤波如3.14节所述,线性相位FIR滤波器具有对称或反对称系数。C55xx提供两个汇编指令FIRSADD和FIRSSUB,分别针对对称和反对称FIR滤波器的有效实现。这个实验采用FIRSADD来实现对称系数的线性相位FIR滤波器。由于用在实验Exp3.1和Exp3.2的带通FIR滤波器是对称滤波器,因此在本实验采用相同的FIR滤波器和输入信号文件。注意,仅仅需要一半的FIR滤波器系数来实现一个对称的FIR滤波器。需要仔细考虑两个实现方面的问题: ,如式(3.22)所示,指令FIRSADD对两个相应的信号样本进行相加,这或许会导致不期望的溢出; 第二,FIRSADD指令在同一周期内需要三个读数(一个系数和两个信号样本),这或许会导致数据总线竞争。个问题可以通过以下方式解决: 采用Q14格式按比例缩小输入信号,然后再将滤波器输出按比例放大到Q15格式。第二个问题可以通过在不同的存储器块中放置系数缓冲器和信号缓冲器来解决。我们能采用预处理(pragma)指令来将程序代码和数据放置到希望的存储器位置。在本实验中,对称FIR滤波器的C55xx汇编实现花费(阶数/2) 5个时钟周期来处理每个信号样本。这样,除去过载,48抽头滤波器需要29个周期来产生一个输出样本。表3.4列出了用于这个实验的文件。
表3.4Exp3.3实验中的文件列表
文件描述symFirTest.c测试对称FIR滤波器的程序symFir.asm对称FIR滤波器的汇编函数symFir.hC头文件symFirCoef.hFIR滤波器系数文件tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件input.pcm输入数据文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用在数据文件夹中提供的输入数据文件input.pcm,载入并运行程序。(3) 通过计算输出信号文件与Exp3.2获得的输出文件之间结果的不同,来对比这两个文件。采用Q14数据来实现对称FIR滤波器的数据操作是否会出现不同结果?(4) 采用MATLAB或CCS在时域(例如波形)或频域(例如幅度谱)绘制输入和输出信号,并且检查实验结果。(5) 概括对称FIR滤波器需要的时钟周期,并且与前面的实验对比效率。(6) 采用以下MATLAB程序设计一个49抽头FIR带通滤波器:
f=[0 0.3 0.4 0.5 0.6 1];%定义频带边沿
m=[0 0 1 1 0 0]; %定义希望的幅度响应
b=firpm(48,f,m); %设计具有49个系数的FIR滤波器
① 修改对称块FIR滤波器汇编程序,来实现此奇数阶对称滤波器。② 书写一个定点C程序,仅采用前25个系数来实现此块FIR滤波器。3.5.4采用DualMAC结构的优化通过采用C55xx的双MAC(DualMAC)结构可以提高FIR滤波器的效率。通过并行地执行两个MAC操作,两个输出样本y(n)和y(n 1)可以在一个时钟周期内计算出来。详见附录C。当采用双MAC结构时,需要考虑三个问题。首先,信号缓冲器的长度必须增加一个以便累积因并行计算两个输出信号而需要的额外存储器位置。其次,采用双MAC的FIR滤波器实现同时需要三个存储器读数(两个信号采样和一个滤波器系数)。为了避免存储器总线竞争,信号缓冲器和系数缓冲器必须置于不同的存储器块内。后,由于双MAC计算结果保存在两个累加器中,因此需要两个存储单元保存两个输出样本。双存储保存指令可以用于保存在一个时钟周期内从累加器到数据存储器的两个样本。然而,双存储保存指令要求数据以偶字(32位)边界形式对齐。可以采用DATA_SECTION和DATA_ALIGN预处理指令告知链接器哪里放置输出数据样本,由此来设置这种对齐方式。采用双MAC的FIR滤波器的C55xx汇编实现需要(阶数/2) 5个时钟周期处理每一个输入信号。这样,除去过载,48抽头的FIR滤波器需要29个周期产生一个输出样本。本实验采用与前一个实现相同的FIR滤波器和输入信号文件。表3.5列出了用于这个实验的文件。
表3.5Exp3.4实验中的文件列表
文件描述dualMacFirTest.c测试双MAC FIR滤波器的程序dualMacFir.asm双MAC FIR滤波器的汇编函数dualMacFir.hC头文件dualMacFirCoef.hFIR滤波器系数文件tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件input.pcm输入数据文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用在数据文件夹中提供的输入数据文件input.pcm,载入并运行程序。(3) 采用MATLAB或CCS证实滤波结果,显示800Hz和3300Hz正弦成分已经被衰减。并且,将实验的输出信号与前一个实验获得的结果进行比较。从双MAC操作得出的结果有什么不同吗?(4) 概括双MAC FIR滤波器,并且与前面的定点C实现、汇编实现和对称FIR滤波器实现的实验结果对比效率。(5) 采用FDATool设计一个24个系数的低通FIR滤波器,滤波器的规范如下: 采样频率Fs=8000Hz; 通带截止频率Fpass=1000Hz; 阻带截止频率Fstop=1200Hz; 通带纹波Apass=1dB; 阻带衰减Astop=50dB。采用此新的低通滤波器做FIR滤波实验。在时域和频域对比输出和输入信号。滤波器结果是否满足滤波器规范?(6) 采用FDATool重新设计一个满足步骤(5)的滤波器规范的低通FIR滤波器,滤波器的阶数是多少?重新做实验,并且将结果与步骤(5)的结果进行对比。3.5.5实时FIR滤波在这个实验中,将第1章讲述的音频回环实验修改为FIR滤波实验。此实验对输入信号使用一个FIR滤波器,并输出经过滤波的信号,而不是像在音频回环中将输入信号直接进行输出。用于此实验的FIR滤波器为采用如下规范的低通滤波器: 采样频率Fs=48kHz; 通带截止频率Fpass=2kHz; 阻带截止频率Fstop=4kHz; 通带纹波Apass=1dB; 阻带衰减Astop=60dB。C5505 eZdsp的采样率设置到48000Hz。表3.6列出了用于这个实验的文件。
表3.6Exp3.5实验中的文件列表
文件描述realtimeFIRTest.c实时FIR滤波器的程序dualMacFir.asmFIR滤波器双MAC实现的汇编函数firFilter.cFIR滤波器初始化和控制vector.asm实时实验的向量表续表
文件描述dualMacFir.hC头文件dualMacFirCoef.hFIR滤波器系数文件tistdtypes.h标准类型定义头文件dma.hDMA函数头文件dmaBuff.hDMA数据缓冲器头文件i2s.hi2s函数的i2s头文件Ipva200.incC5505处理器包含文件myC55xUtil.libBIOS音频库c5505.cmd链接器命令文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 将耳机连接到eZdsp音频输出插口,将音频源连接到eZdsp的音频输入插口。载入并运行程序。(3) 聆听音频回放,验证高于2000Hz的频率成分被截止频率为2000Hz的低通滤波器所衰减。(4) 采用MATLAB绘制低通FIR滤波器的幅度响应,低通FIR滤波器的滤波器系数dualMacFirCoef[ ]在头文件dualMacFirCoef.h中。将得到的通道纹波和阻带衰减与滤波器规范进行对比。(5) 采用以下MATLAB程序设计一个反对称带通滤波器:
f=[0 0.03 0.1 0.9 0.97 1]; %定义频带边沿
m=[0 0 1 1 0 0]; %定义希望的幅度响应
c=firpm(47, f, m, ‘h’); %48抽头反对称FIR滤波器
① 检查滤波器特性,包括带宽、边沿频率、阻带衰减和通带纹波。② 修改对称块FIR汇编程序来实现反对称FIR滤波器。③ 写出定点C程序来实现此反对称FIR滤波器,仅仅采用24个滤波器系数来实现反对称FIR滤波器。将eZdsp的采样频率设置到8000Hz,采用此滤波器重新做以上实验,注意溢出问题。通过聆听原始和经过滤波的信号的方法来评估实验结果。3.5.6采用C和汇编程序的抽取此实验采用两个FIR滤波器实现一个二级抽取因子为2∶1和3∶1的抽取器。此抽取实验使用输入、输出和临时缓冲器。输入缓冲器大小等于输出帧尺寸乘以抽取因子。例如,当帧尺寸为96Hz,48000Hz到8000Hz抽取需要的输入缓冲器的大小为576(96×6),其中6为抽取因子。临时缓冲器大小为输入缓冲器大小除以级抽取因子(在本例中为2)。表3.7列出了用于这个实验的文件。
表3.7Exp3.6实验中的文件列表
文件描述decimationTest.c测试抽取实验的程序decimate.asm抽取滤波器的汇编函数decimation.hC头文件Coef48to24.h2∶1抽取的FIR滤波器系数Coef24to8.h3∶1抽取的FIR滤波器系数tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件tone1k_48000.pcm数据文件——采样率为48kHz的1kHz音信号
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用在数据文件夹中提供的输入数据文件tone1k_48000.pcm,载入并运行程序产生抽取输出。(3) 采用MATLAB绘制抽取输出的幅度谱来验证它是一个8000Hz采样率的1000Hz信号。播放抽取输出信号并聆听。(4) 概括抽取滤波器汇编函数的运行时间效率。采用定点C程序重新书写此函数。重复实验,并且与汇编实现对比其效率。(5) 设计一个3∶1抽取器。修改实验,将采样率从48000Hz改变至16000Hz中抽取信号,并且验证抽取结果。(6) 当eZdsp的采样率设置在48000Hz,coef24to8.h中的滤波器系数是否可以用于抽取采样率为48000Hz改变至16000Hz的音频信号?为什么?3.5.7采用定点C的插值此实验实现一个插值因子为2和3的二级插值器,将输入信号的采样率从8000Hz改变至48000Hz。采用模仿循环寻址模式的定点C程序来实现两个插值滤波器。循环缓冲器索引为index。系数数组为h[ ],信号缓冲器为w[ ]。由于不需要对插入的零数据样本进行滤波,系数数组指针采用一个偏移等于插值因子的索引。表3.8列出了用于这个实验的文件。
表3.8Exp3.7实验中的文件列表
文件描述interpolateTest.c测试插值实验的程序interpolate.c插值滤波器的C函数interpolation.hC头文件coef8to16.h1∶2插值的FIR滤波器系数coef16to48.h1∶3插值的FIR滤波器系数续表
文件描述tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件tone1k_8000.pcm数据文件——采样率为8kHz的1kHz音信号
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 采用在数据文件夹中提供的输入数据文件tone1k_8000.pcm,载入并运行程序产生插值输出。(3) 通过在每个周期对采样数进行计数来验证采样频率为48000Hz的1000Hz输出信号(提示: 8000Hz采样率的1000Hz正弦波形每个周期包含八个样本)。(4) 采用MATLAB设计一个1∶4插值器。采用MATLAB或CCS绘制输出信号的幅度谱的方法来验证插值结果。(5) 采用汇编程序实现插值FIR滤波器(提示: Exp3.2中的块FIR滤波器汇编函数blockFir.asm与插值FIR滤波器interpolate.c的关键不同点是插值滤波器系数索引)。采用汇编滤波器函数重新做实验。采用MATLAB验证结果。相比较于C函数,概括和对比通过采用汇编函数而获得的效率提高。3.5.8采样率转换在这个实验中,采样率从48000Hz转换至32000Hz。为了达到这个目的,首先采用1∶2插值器将信号从48000Hz插值到96000Hz,然后将中间结果采用3∶1抽取器抽取到32000Hz。图3.21是采样率从48000Hz转换到32000Hz的过程。输入信号文件为双音多频(DTMF)的digit 5,其包含770Hz和1336Hz两个频率的正弦信号。表3.9列出了用于这个实验的文件。 原文此处有误,应该是96kHz。——译者注
图3.21采样率转换的流程图
表3.9Exp3.8实验中的文件列表
文件描述srcTest.c测试采样率转换的程序interpolate.c插值滤波器的C函数续表
文件描述decimate.asm抽取滤波器的汇编程序interpolation.h插值的C头文件decimation.h抽取的C头文件coef48to96.h1∶2插值的FIR滤波器系数coef96to32.h3∶1抽取的FIR滤波器系数tistdtypes.h标准类型定义头文件c5505.cmd链接器命令文件DTMF5s_48kHz.pcm数据文件——采样率为48kHz的DTMF音信号digit5
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 使用在数据文件夹中提供的输入数据文件DTMF5s_48kHz.pcm,载入并运行程序产生输出数据文件。(3) 采用MATLAB或CCS绘制输出信号的幅度谱的方法来验证采样率转换结果具有正确的双音频率。(4) 采用MATLAB将CD音乐的采样率从44100Hz转换为48000Hz(提示: 参照例3.20)。验证设计,并将此MATLAB实验转变为C5505 eZdsp实验。3.5.9实时采样率转换此实验采用C5505 eZdsp数字化模拟信号,以便进行实时采样率转换。仅在信号的左通道进行转换,而保留右通道不做处理以便进行对比。在此实验中,两级插值用于从8000Hz到48000Hz上采样,两级抽取用于从48000Hz到8000Hz的下采样。表3.10列出了用于这个实验的文件。
表3.10Exp3.9实验中的文件列表
文件描述realtimeSRCTest.c测试采样率转换的程序rtSRC.c采样率转换函数interpolate.c插值滤波器的C函数decimate.asm抽取滤波器的汇编程序vector.asm实时实验的向量表interpolation.h插值的C头文件decimation.h抽取的C头文件coef8to16.h1∶2插值的FIR滤波器系数coef16to48.h1∶3插值的FIR滤波器系数coef48to24.h2∶1抽取的FIR滤波器系数Coef24to8.h3∶1抽取的FIR滤波器系数续表
文件描述tistdtypes.h标准类型定义头文件dma.hDMA函数的头文件dmaBuff.hDMA数据缓冲器的头文件i2s.hi2s函数的i2s头文件Ipva200.incC5505处理器包含文件myC55xUtil.libBIOS音频库c5505.cmd链接器命令文件
实验过程如下: (1) 从配套软件包中导入CCS项目,并重建项目。(2) 将耳机连接到eZdsp音频输出插口,将音频源连接到eZdsp的音频输入插口。载入并运行程序。(3) 聆听eZdsp音频输出,并通过对比输出频率信号的左右通道来评估采样率转换结果。(4) 设计一个48000Hz到24000Hz转换的抽取滤波器和一个上采样24000Hz到48000Hz的插值滤波器。修改程序,采用这些新的滤波器,基于相同的机制进行实时采样率转换,即左通道进行信号采样率转换,而右通道直接通过信号。eZdsp的采样率设置在48000Hz。对比试验结果,是否存在明显的人工成分?习题3.1考虑例3.1中的二点滑动平均滤波器。计算采样率8kHz的此滤波器的3dB带宽。3.2考虑冲激响应h(n)={1, 1, 1}的FIR滤波器。计算幅度响应和相位响应,并验证此滤波器具有线性相位。3.3考虑例3.2中的梳状滤波器,采样率8kHz。基频为500Hz、谐波为1kHz、15kHz、3.5kHz的周期信号,由此梳状滤波器进行滤波。哪一个谐波成分被衰减?为什么?3.4采用如图3.6中的线性卷积的图形化解释,来计算h(n)={1,1,1}和如下定义的x(n)的线性卷积:(1) x(n)={1,-1,2,1};(2) x(n)={1,2,-2,-2,2};(3) x(n)={1,3,1}。采用MATLAB验证结果。3.5梳状滤波器也可采用下式进行描述:
y(n)=x(n) x(n-L)
求传递函数和零点。同时,采用MATLAB计算此滤波器的幅度响应,并与图3.3(假设L=8)对比结果。3.6假设h(n)具有对称属性h(n)=h(-n),n=0, 1, …, M,验证h(ω)可以表示为H(ω)=h(0) ∑Mn=12h(n)cos(ωn)
3.7连续时间微分器的简单数字近似表示为如下定义的一阶操作:
y(n)=1T[x(n)-x(n-1)]
求微分器的传递函数H(z)、幅度响应和相位响应。采用MATLAB绘制频率响应来验证计算结果。3.8当L为奇数时,重新画出图3.5中的对称FIR滤波器的信号流图,并修改式(3.22)和式(3.23)。3.9考虑具有以下冲激响应的FIR滤波器: (1) h(n)={-4,1,-1,-2,5,0,-5,2,1,-1,4};(2) h(n)={-4,1,-1,-2,5,6,5,-2,-1,1,-4}。采用MATLAB对这两个滤波器绘制幅度响应、相位响应以及零点位置。3.10绘制下面低通滤波器的零极点图及幅度响应:
H(z)=1L1-z-L1-z-1
对于L=8,采用MATLAB验证结果,并与图3.3对比结果。3.11采用例3.5和例3.6,通过截断理想高通滤波器冲激响应长度原文此处有笔误,应该为L=2M 1。——译者注L=2M=1,M=32和M=64,设计一个线性相位FIR高通滤波器,并绘制其幅度响应,滤波器的截止频率为ωc=0.6π。采用MATLAB验证结果。3.12采用汉明和布莱克曼窗函数重做习题3.11。表明可以通过对傅里叶级数加窗的方法减小不希望的振荡行为。3.13设计一个带通滤波器
H(f)=1,1.6kHz≤f≤2kHz
0,其他
采用不同窗函数的傅里叶级数方法,采样率为8kHz,冲激响应持续50ms,采用MATLAB函数fir1验证结果。绘制幅度响应和相位响应。3.14采用不同设计方法的FDATool,重做习题3.13,并与习题3.13对比结果。3.15重做例3.13,采用定点Q15格式量化设计的滤波器系数,并将系数保存在C头文件中。书写一个浮点C程序来实现此FIR滤波器,并通过以时域波形和频域谱的方式对比输入和输出信号来测试结果。同时,采用MATLAB实现此滤波器,并且将输出结果与浮点C程序输出进行对比。3.16采用定点(16位)C程序重做习题3.15,通过将定点C程序的结果与之前浮点C程序的结果相减绘制误差信号(相差),以便评估数值误差。3.17采用FDATool针对不同边沿频率和纹波重做例3.13,总结它们与期望滤波器阶数的关系。同时,采用系数字长分别为8、12和16位定点数来量化设计的滤波器。3.18列出MATLAB Wintool支持的窗函数。同时,采用此工具研究不同L和β值的Kaiser窗,并且与采用相同L的当前流行的汉明(Hamming)窗对比结果。3.19编写MATLAB和C程序实现L=8的梳状滤波器。程序必须具有输入/输出能力。同时,产生包含频率ω1=π/4和ω2=3π/8的正弦信号。采用这个正弦信号作为输入信号来测试滤波器。基于滤波器的零点分布和相应的幅度响应来解释结果。3.20在配套软件包中给出的语言文件TIMIT_4.ASC(采样率16kHz),将其抽取到8kHz、4kHz、2kHz和1kHz采样率。采用MATLAB函数soundsc,通过聆听抽取信号来检查不同信号的带宽。3.21采用本章中的采样率转换技术,将语音文件TIMIT_4.ASC的采样率转换为12kHz、5kHz和3kHz。3.22给定的语言文件TIMIT_4.ASC,将其抽取到1kHz采样率,然后将其插值回16kHz。聆听输出语音,并且与原始信号对比语音质量。观察并解释不同。3.23给定的语言文件TIMIT_4.ASC,将其插值到48kHz采样率,然后将其抽取回16kHz。聆听输出语音,并且与习题3.22获得的输出信号对比语音质量。观察并解释不同。参考文献
1. Ahmed, N. and Natarajan, T.(1983) DiscreteTime Signals and Systems, Prentice Hall,Englewood Cliffs, NJ.
2. Ingle, V.K. and Proakis, J.G.(1997) Digital Signal Processing Using MATLAB V.4, PWS Publishing,Boston, MA.
3. Kuo, S.M. and Gan, W.S.(2005) Digital Signal Processors, Prentice Hall,Upper Saddle River, NJ.
4. Oppenheim, A.V. and Schafer, R.W.(1989) DiscreteTime Signal Processing, Prentice Hall,Englewood Cliffs, NJ.
5. Orfanidis, S.J.(1996) Introduction to Signal Processing, Prentice Hall,Englewood Cliffs, NJ.
6. Proakis, J.G. and Manolakis, D.G.(1996) Digital Signal Processing—Principles, Algorithms, and Applications, 3rd edn, Prentice Hall, Englewood Cliffs, NJ.
7. Mitra, S.K.(1998) Digital Signal Processing: A ComputerBased Approach, 2nd edn,McGrawHill, New York.
8. Grover, D. and Deller, J.R.(1999) Digital Signal Processing and the Microcontroller, Prentice Hall,Englewood Cliffs, NJ.
9. Taylor, F. and Mellott, J.(1998) HandsOn Digital Signal Processing,McGrawHill, New York.
10. Stearns, S.D. and Hush, D.R.(1990) Digital Signal Analysis, 2nd edn, Prentice Hall, Englewood Cliffs, NJ.
11. The MathWorks, Inc.(2004) Signal Processing Toolbox Users Guide, Version 6, June.
12. The MathWorks, Inc.(2004) Filter Design Toolbox Users Guide, Version 3, October.
评论
还没有评论。