1、 DSP 课 程 设 计 姓名: 学号: 日期: 一、 实验目的 1. 加深对 DFT算法原理和基本性质的理解; 2. 熟悉 FFT 的算法原理和 FFT子程序的算法流程和应用; 3. 学习用 FFT对连续信号和时域信号进行频谱分析的方法; 4. 学习 DSP 中 FFT的设计和编程思想; 5. 学习使用 CCS的波形观察器观察波形和频谱情况; 二、实验内容 用 DSP 汇编语言及 C 语言进行编程,实现 FFT 运算、对输入信号进行频谱分析。 三、实验原理 快速傅里叶变换 FFT 旋转因子 WN 有如下的特性。 对称性: WNk+N/2=-WNk ( 2) 周期性 : WNn(N-k)=WN
2、k(N-n)=WN-nk ( 3) 利用这些特性,既可以使 DFT中有些项合并,减少了乘法积项,又可以将长序列的 DFT 分解成几个短序列的 DFT。 FFT 就是利用了旋转因子的对称性和周期性来减少运算量的。 FFT 的算法是将长序列的 DFT 分解成短序列的 DFT。例如: N 为偶数时,先将 N 点的 DFT分解为两个 N/2 点的 DFT,使复数乘法减少一半:再将每个 N/2 点的 DFT 分解成 N/4 点的 DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为 2 的 FFT算法,它的最小变换是 2点 DFT。 一般而言, FFT算法分为按
3、时间抽取的 FFT( DIT FFT) 和按频率抽取的 FFT( DIF FFT) 两大类。 DIF FFT 算法是在时域内将每一级输入序列依次按奇偶分成 2 个短序列进行计算。而 DIF FFT 算法是在频域内将每一级输入序列依次奇偶分成 2 个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在 DIF FFT 算法中,旋转因子 WN出现在输入端,而在 DIF FFT 算法中它出现在输入端。 假定序列 x(n)的点数 N 是 2 的幂,按照 DIF FFT 算法可将其分为偶序列和奇序列。 偶序列 : x(2r)=x1(r) 奇序列 : x(2r+1)=x2(r) 其中:
4、r=0,1,2,N/2 -1,则 x(n)的 DFT表示为 式中, X1 (k)和 X2(k)分别为 X1(r)和 X2(r)的 N/2的 DFT。 由于对称性, WNk+N/2=-WNk。 因此, N点 DFT可分为两部分: 前半部分: x(k)=x1(k)+WkNx2(k) ( 4) 后半部分 : x(N/2+k)=x1(k)-WkNx2(k) k=0,1,N/2 -1 ( 5) 从式 ( 4) 和式 ( 5) 可以看出,只要求出 0N/2-1 区间 x1(k)和x2(k)的值,就可求出 0N-1区间 x(k)的 N 点值。 以同样的方式进行抽取,可以求得 N/4 点的 DFT,重复抽取过
5、程,就可以使 N 点的 DFT 用上组 2点的 DFT 来计算,这样就可以大减少运算量。 基 2 DIF FFT 的蝶形运算如图 3.1所示。设蝶形输入为 x1(k)和 1 1 10 0 0N N Nnk nk nkN N Nn n nX k x n W x n W x n W 为 偶 数n为 奇 数 / 2 1 / 2 1 212002 2 1NN rkrkNNrrx r W x r W / 2 1 / 2 12212 rk rkkN N Nx r W W x r W / 2 1 / 2 11 / 2 2 / 2rk k rkN N Nx r W W x r W 12 kNX k W X k
6、, 0 , 1 , . / 2 1r k Nx2(k),输出为 x(k)和 x(N/2+K),则有 x(k)=x1(k)+WkNx2(k) ( 6) x(N/2+k)=x1(k)-WkNx2(k) ( 7) 在基数为 2 的 FFT 中,设 N=2M,共有 M 级运算,每级有 N/2 个 2点 FFT 蝶形运算,因此, N点 FFT 总共有 MN/2个 蝶形运算。 图 3.1 基 2 DIF FFT 的蝶形运算 例如:基数为 2的 FFT,当 N=8时,共需要 3 级, 12 个基 2 DIT FFT 的蝶形运算。其信号流程如图 3.2所示。 x(0) x(0) WN0 x(4) x(1) -
7、1 WN0 x(2) x(2) -1 WN0 WN2 x(6) x(3) -1 -1 WN0 x(1) x(4) -1 WN0 WN1 x(5) x(5) -1 -1 WN0 WN2 x(3) x(6) -1 -1 WN0 WN2 WN3 x(7) x(7) -1 -1 -1 图 3.2 8 点基 2 DIF FFT 蝶形运算 从图 (b)可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为 x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7),CABA BCA BC输 出 是 按 自 然 顺 序 排 列 , 其 顺 序 为x(0),x(1),x(2),
8、x(3),x(4),x(5),x(6),x(7). 程序设计顺序 串口设置 AD 设置 设置信号源类型、频率幅值、和采样点数 串口接收, AD 采样 位码倒置 FFT 运算 功率谱计算 串口发送转换结果 观看转换结果,保存数据 DSP 初始化 四、 FFT算法的 DSP实现过程: DSP芯片的出现使 FFT的实现方法变得更为方便。由于大多数 DSP芯片都具有在单指令周期内完成乘法 累加操作,并且提供了专门的FFT 指令,使得 FFT 算法在 DSP芯片实现的速度更快。 FFT算法可以分为按时间抽取 FFT 和按频率抽取 FFT 两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。
9、 (一) FFT 运算序列的存储分配 FFT运算时间是衡量 DSP芯片性能的一个重要指标,因此提高 FFT的运算速度是非常重要的。在用 DSP芯片实现 FFT算法时,应允许利用 DSP 芯片所提供的各种软、硬件资源。如何利用 DSP 芯片的有限资源,合理地安排好所使用的存储空间是十分重要的。 (二 )FFT运算的实现 用 TMS320C54x的汇编程序实现 FFT 算法主要分为四步: 1.实现输入数据的比特反转 输入数据的比特反转实际上就是将输入数据进行码位倒置, 以便在整个运算后的输出序列是一个自然序列。在用汇编指令进行码位倒置时,使用码位倒置可以大大提高程序执行速度和使用存储器的效率。在这
10、种寻址方式下, AR0 存放的整数 N是 FFT 点的一半,一个辅助寄存器指向一个数据存放的单元。当使用位码倒置寻址将 AR0加到辅助寄存器时,地址将以位码倒置的方式产生。 2.实现 N 点复数 FFT N点复数 FFT算法的实现可分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级至 级蝶形运算。 对于任何一个 2的整数幂,总可以通过 M次分解最后成为 2 点的 DFT计算。通过 这样的 M次分解,可构成 M(即 )级迭代计算,每级由 N/2 个蝶形运算组成。 3.功率谱的计算 用 FFT 计算想 x(n)的频谱,即计算 X( k) = X(k)一般是由实部 (k)和虚部 (k)组成的复
11、数,即 X( k) = (k)+j (k) 因此,计算功率谱时只需将 FFT 变换好的数据,按照实部实部(k)和虚部 (k)求它们的 平方和,然后对平方和进行开平方运算。但是考虑到编程的难度,对于求 FFT变换后数据的最大值,不开平方也可以找到最大值,并对功率谱的结果没有影响,所以在实际的 DSP编程中省去了开方运算。 4.输出 FFT结果 (三 )汇编语言程序 程序主体由 rfft-task、 bit-rev、 fft 和 power四个子程序组成。 rfft-task:主调用子程序,用来调用其他子程序,实现统一的接口。 bit-rev:位码倒置子程序,用来实现输入数据的比特反转。 fft:
12、 FFT算法子程序,用来完成 N点 FFT运算。在运算过程中,为避免运 算结果的溢出,对每个蝶形的运算结果右移一位。 fft 子程序分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至至级蝶形运算。 (四)正弦系数表和余弦系数表: 正弦系数表和余弦系数表可以由数据文件 coeff.inc给出,主程序通过 .copy 汇编命令将正弦和余弦系数表与程序代码汇编在一起。 在本例中,数据文件 coeff.inc给出 1024 复数点 FFT的正弦、余弦系数各 512个。利用此系数表可完成 81024点 FFT 的运算。 (五) FFT 算法的模拟信号输入: FFT算法的模拟信号输入可 以采用 C语
13、言编程来生成一个文本文件 sindata,然后在 rfft-task汇编程序中,通过 .copy汇编命令将生成的数据文件复制到数据存储器中,作为 FFT 算法的输入数据参与FFT运算。这种方法的优点是程序的可读性强,缺点是当输入数据修改后,必须重新编译、汇编和链接。 五、设计步骤: 1.启动 CCS,在 CCS中建立一个 C源文件和一个命令文件,并将这两个文件添加到工程,再编译并装载程序:阅读 Dsp 原理及应用中 fft 用 dsp 实现的有关程序。 2.双击 ,启动 CCS 的仿真平台的配着选项。选择 C5502 Simulator。 3.启动 ccs2后建立工程文件 FFT.pjt 4.建立源文件 FFT.c与链接文件 FFT.cmd 5.将这两个文件加到 FFT.pjt这个工程中。 6.创建 out文件 7.加载 out文件 六、编译程序 int INPUTSAMPLENUMBER,DATASAMPLENUMBER;