6.2.1 离散傅立叶变换
.傅立叶变换的几种形式
傅立叶变换是信号分析和处理的有力工具,在以快速傅立叶变换算法为代表的一系列有效算法出现后,傅立叶变换不但在信号处理领域起着支柱作用,而且在其它工程领域也获得了广泛的应用[6]。
根据信号的连续性、离散性、周期性、非周期性,傅立叶变换可以分为四种不同的形式,形成四种不同的傅立叶变换对:连续时间非周期信号、连续时间周期信号、离散时间非周期信号以及离散时间周期信号。其中,前三种至少在时域或频域是连续的,因此都不适于在计算机上运行。
对于有限长序列,可以得出另外一种傅立叶表示,称为离散傅立叶变换(DFT)。离散傅立叶变换本身是一个序列,而不是一个连续变量的函数,它相应于对信号的傅立叶变换进行频率的等间隔取样的样本。因为计算DFT存在高效的算法,所以DFT作为序列的傅立叶表示,除了在理论上十分重要外,在实现各种数字信号处理算法中还起着核心作用。
离散傅里叶变换描述的是对有限长序列的分析,其本质是建立了以时间为自变量的信号与以频率为自变量的频谱函数之间的变换关系,换言之,离散傅里叶变换定义了时域与频域之间的一种变换或者说是映射。对于DFT而言,时间和频率变量都取离散值。
下面讨论一下有限长序列的离散傅立叶变换。对于一个长度为N的有限长序列
,即只在
个点上为非零值,其余皆为零,我们可以把它看成周期为N的周期序列
中的一个周期,即
![]()
其中,
(6-1)
从而,有限长序列的傅立叶变换定义为
正变换: ![]()
反变换: ![]()
其中,
。
由此可见,离散傅立叶变换开辟了频域离散化的道路,使数字信号处理也可以在频域上采用数字运算方法进行。它作为一种数学工具来描述离散信号的时域和频域表示的关系,大大增加了数字信号处理的灵活性,特别是其多种快速算法,使信号的实时处理和设备的简化得以实现。所以,离散傅立叶变换不仅在理论上有重要意义,而且在各种数字信号处理中起着核心的作用。
6.2.2 频域应用
散傅立叶变换作为傅立叶变换的一种近似而得到广泛应用,它的快速算法保证了DFT在实时信号处理中的应用。下面介绍两种常用的频域应用。
1. 功率谱
信号
的离散傅利叶变换X(k)一般是一个复数,X(k)与其共轭X*(k)之积称为自功率谱,简称自谱或功率谱。也有文献叫其为功率谱密度(函数),其表示为:
(6-2)
这里的系数1/N 只是为了满足能量定理而进行的归一化。
反映的是信号的功率密度,在图形上与幅度谱类似,只是大小不同,功率谱不含相位信息,所以由功率谱不能恢复原始信号。
可以证明,线性自相关函数和功率谱是一对离散时间傅立叶变换对(DTFT),相应的循环自相关函数和功率谱是一对离散傅立叶变换对(DFT)。考虑序列 可能是复数,且实际得到的 是一段样本序列,因而:

当
是实序列时,自相关序列也是实序列,则功率谱是偶对称的。从功率谱和自相关函数之间的关系,我们知道功率谱蕴涵着集合统计的实质,一个随机信号的自相关和功率谱都表达了随机信号的统计平均特性。
2. 频域滤波
理想的数字滤波器幅度谱如图7-9所示,包括低通、高通、带通和带阻。这些频率特性都是以
为周期的连续函数,当单位脉冲响应
是实数序列时,幅度谱周期偶对称,相位谱周期奇对称,因而只需要给出一半的频谱图即可。

图6-9各理想数字滤波器频率特性
数字频域滤波可以用硬件和软件的方法实现,滤波器的设计方法多种多样,大致分为IIR滤波器设计和FIR滤波器设计。前者主要利用传统的模拟滤波器设计方法,后者多采用窗函数和频率取样设计法,限于篇幅,这里不进行详细介绍,有兴趣的读者可参考相关文献。频域滤波如果用软件方法来实现,更为灵活。如不考虑信号因果性(非实时分析),则滤波的实现方法很简单,只需令需要滤波的频段所对应的滤波器幅度为0,再作IFFT即可获得滤波后的时域波形,可高效、干净地完成滤波。如果要实现实时分析,就要设计出因果的滤波器,在Matlab中有滤波器的设计工具箱,读者可以参考里面的应用例子。在本章的随后章节也将介绍基于FPGA的滤波器实现。
6.2.3 FFI/IFFT IP Core的使用
在ISE 9.1.03i版中,提供了FFT/IFFT的IP Core,可以完成实数、复数信号的FFT以及IFFT运算。FFT的IP Core提供三种结构,分别为:(1)流水线,Streaming I/O结构:允许连续的数据处理;(2)基4,Burst I/O结构:提供数据导入/导出阶段和处理阶段。此结构拥有较小的结构,但转换时间较长;(3)基2,Burst I/O结构:使用最少的逻辑资源,同Radix-4相同,提供两阶段的过程。其配置界面有3页,第一页如图7-10所示,主要用于配置实现结构;第二页配置数据位宽以及数据处理操作;第三页配置数据缓存空间。

图6-10 FT IP core的用户界面
在实际硬件操作中,模块的执行速度是很重要的参数,所以本文分析第一种结构,即流水线Streaming I/O结构,以进行连续的数据处理。在进行当前帧的 点数据时,可加载下一帧的 点数据,同时输出前一帧的 点数据。此结构由多个基2的蝶形处理单元构成,每个单元都有自己的存储单元来存储输入和中间处理的数据,其结构如图7-11所示。

图6-11 FT模块的流水线,Streaming I/O结构
FFT的计算单元具有丰富的控制信号,其详细说明见下文。
XN_RE、XN_IM:输入操作数,分别为实部和虚部,以2的补码输入。在使用时应当确定其位宽。
START:FFT开始信号,高有效。当此信号变高时,开始输入数据,随后直接进行FFT转换操作和数据输出。一个START脉冲,允许对一帧进行FFT转换。如果每N个时钟有一个START脉冲或者START始终为高,,则都可以连续进行FFT。如果在最初的START前,还没有NFFT_WE,FWD_INV_WE,SCALE_SCH_WE信号,则START变高后就使用这些信号的默认值。由于此IP Core支持非连续的数据流,因此在任何时间输入START,即可开始数据的加载。当加载N个数据结束后,就开始FFT转换运算。
UNLOAD:对于Burst I/O结构,此信号将开始输出处理的结果。对于流水线结构和比特逆序输出的情况,此端口不是必要的。
NFFT:此端口只对实时可配置应用时有用。
NFFT_WE:此端口是NFFT端口的使能信号。
FWD_INV:用以指示IP Core为FFT还是IFFT,其等于1时IP Core进行FFT运算,否则进行IFFT运算。至于采用哪种转换运算是可以逐帧变化的。这一端口给FFT的使用提供了很大的方便。
FWD_INV_WE:作为FWD_INV端口的使能信号。
SCALE_SCH:(1)在IP Core设计时,如果选择在计算过程中进行中间数据的缩减,那么此信号才可起作用;(2)输入的位宽等于2*ceil(NFFT/2),其中NFFT = log2(point size)。(3)流水线结构中,将每个基2的蝶形处理单元视为一个阶段,每个阶段进行一次数据的缩减,缩减的比例以此输入中对应阶段的两比特表示。(4)每阶段的两比特数可以是3,2,1或0:它们表示了数据所需要移动的比特数。
SCALE_SCH_WE:作为SCALE_SCH的使能信号。
SCLR:可选端口。
Reset:重置信号端口。Reset=1时,所有工作都停止且初始化。但内部的帧缓存保留其内容。
CE:可选端口。
CLK:输入时钟。
XK_RE,XK_IM:输出数据总线,以2的补码输出。SCALE_SCH_WE有效时,输出位宽等于输入;否则,输出位宽=输入位宽+NFFT+1。
XN_INDEX:位宽等于log2(point size),输入数据的下标。
XK_INDEX:位宽等于log2(point size),输出数据的下标。
RFD:数据有效信号,高有效,在加载数据时为高电平。
BUSY:IP Core工作状态的指示信号,在计算FFT转换时为高电平。
DV:数据有效指示信号,当输出端口存在有效数据时变高。
EDONE:高有效。在DONE信号变高的前一个时钟变为高电平。
DONE:高有效。在FFT完成后变高,且只存在一个时钟。在DONE变高后,IP Core开始输出计算结果。
BLK_EXP:当使用Burst I/O结构时可用,若选择流水线,则此端口无效
OVFLO:算法溢出指示。在数据输出时,如每帧有溢出,此信号变高。在每帧开始处,此信号重置。
例7-1 使用IP Core实例化一个16点、位宽为16位的FFT模块。
IP Core直接生成的乘法器的Verilog模块接口为:
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy, edone, scale_sch, xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
……
endmodule
在使用时,直接调用multiply模块即可,如
module fft16(sclr, fwd_inv_we, rfd, start, fwd_inv, dv, scale_sch_we, done, clk, busy,
edone, scale_sch, xn_re, xk_im, xn_index, xk_re, xn_im, xk_index);
input sclr , fwd_inv_we, start, fwd_inv, scale_sch_we, clk;
input [3 : 0] scale_sch;
input [15 : 0] xn_re;
output rfd, dv, done, busy, edone;
output [15 : 0] xk_im;
output [3 : 0] xn_index;
output [15 : 0] xk_re;
input [15 : 0] xn_im;
output [3 : 0] xk_index;
fft fft1( //调用FFT的IPCore
.sclr(sclr), .fwd_inv_we(fwd_inv_we), .rfd(rfd), .start(start), .fwd_inv(fwd_inv),
.dv(dv), .scale_sch_we(scale_sch_we), .done(done), .clk(clk), .busy(busy),
.edone(edone), .scale_sch(scale_sch), .xn_re(xn_re), .xk_im(xk_im),
.xn_index(xn_index), .xk_re(xk_re), .xn_im(xn_im), .xk_index(xk_index));
endmodule
经过仿真测试得到的功能波形图如图7-12所示:

图6-12 FT的IP core仿真波形


