FFT(FastFourier Transform,快速傅立叶变换)

Posted ljtyxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFT(FastFourier Transform,快速傅立叶变换)相关的知识,希望对你有一定的参考价值。

FFT(FastFourier Transform,快速傅立叶变换)是离散傅立叶变换的快速算法,也是我们在数字信号处理技术中经常会提到的一个概念。在大学的理工科课程中,在完成高等数学的课程后,数字信号处理一般会作为通信电子类专业的专业基础课程进行学习,原因是其中涉及了大量的高等数学的理论推导,同时又是各类应用技术的理论基础。

       关于傅立叶变换的经典著作和文章非常多,但是看到满篇的复杂公式推导和罗列,我们还是很难从直观上去理解这一复杂的概念,我想对于普通的测试工程师来说,掌握FFT的概念首先应该搞清楚这样几个问题:(1) 为什么需要FFT  (2) 变换究竟是如何进行的 (3) 变换前后信号有何种对应关系(4) 在使用测试工具(示波器或者其它软件平台)进行FFT的方法和需要注意的问题  (5) 力科示波器与泰克示波器的FFT计算方法的比较。

       在这篇文章中我尝试用更加浅显的讲解,尽量不使用公式推导来说一说FFT的那些事儿。

一, 为什么需要FFT?

       首先FFT(快速傅立叶变换)是离散傅立叶变换的快速算法,那么说到FFT,我们自然要先讲清楚傅立叶.Fourier对热传递很感兴趣,于1807年在法国科学学会上发表了一篇论文,运用正弦曲线来描述温度分布,论文里有个在当时颇具争议性的命题:任何连续周期信号可以由一组适当的正弦曲线组合而成。当时审查这个论文的人,其中有两位是历史上著名的数学家拉格朗日(Joseph Louis Lagrange, 1736-1813)和拉普拉斯(PierreSimon de
Laplace, 1749-1827),当拉普拉斯和其他审查者投票通过并要发表这个论文时,拉格朗日坚决反对,在近50年的时间里,拉格朗日坚持认为傅立叶的方法无法表示带有棱角的信号,如在方波中出现非连续变化斜率。法国科学学会屈服于拉格朗日的权威,拒绝了傅立叶的工作,幸运的是,傅立叶还有其它事情可忙,他参加了政治运动,随拿破仑远征埃及,法国大革命后因为怕被推上断头台而一直在逃难。直到拉格朗日死后15年这个论文才被发表出来。

       谁是对的呢?拉格朗日是对的:正弦曲线无法组合成一个带有棱角的信号。但是,我们可以用正弦曲线来非常逼近地表示它,逼近到两种表示方法不存在能量差别,基于此,傅立叶是对的。

       为什么我们要用正弦曲线来代替原来的曲线呢?如我们也还可以用方波或三角波来代替,分解信号的方法是无穷的,但分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有其他信号所不具备的性质:正弦曲线保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的,且只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。

 傅立叶变换的物理意义在哪里?

       傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。当然这是从数学的角度去看傅立叶变换。

       那么从物理的角度去看待傅立叶变换,它其实是帮助我们改变传统的时间域分析信号的方法转到从频率域分析问题的思维,下面的一幅立体图形可以帮助我们更好得理解这种角度的转换:

 

所以,最前面的时域信号在经过傅立叶变换的分解之后,变为了不同正弦波信号的叠加,我们再去分析这些正弦波的频率,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。

        傅立叶变换提供给我们这种换一个角度看问题的工具,看问题的角度不同了,问题也许就迎刃而解!

二、变换是如何进行的?

        首先,按照被变换的输入信号类型不同,傅立叶变换可以分为 4种类型:
         1、 非周期性连续信号傅立叶变换(Fourier Transform)
       2、 周期性连续信号傅立叶级数(Fourier Series)
         3、 非周期性离散信号离散时域傅立叶变换(Discrete Time Fourier Transform)
         4、 周期性离散信号离散傅立叶变换(Discrete Fourier Transform)

下面是四种原信号图例:

 

 这里我们要讨论是离散信号,对于连续信号我们不作讨论,因为计算机只能处理离散的数值信号,我们的最终目的是运用计算机来处理信号的。所以对于离散信号的变换只有离散傅立叶变换(DFT)才能被适用,对于计算机来说只有离散的和有限长度的数据才能被处理,对于其它的变换类型只有在数学演算中才能用到,在计算机面前我们只能用DFT方法,我们要讨论的FFT也只不过是DFT的一种快速的算法。

DFT的运算过程是这样的:

 

其中,
X(k)—频域值
X(n)—时域采样点
n—时域采样点的序列索引
k—频域值的索引
N—进行转换的采样点数量

        可见,在计算机或者示波器上进行的DFT,使用的输入值是数字示波器经过ADC后采集到的采样值,也就是时域的信号值,输入采样点的数量决定了转换的计算规模。变换后的频谱输出包含同样数量的采样点,但是其中有一半的值是冗余的,通常不会显示在频谱中,所以真正有用的信息是N/2+1个点。

        FFT的过程大大简化了在计算机中进行DFT的过程,简单来说,如果原来计算DFT的复杂度是N2次运算(N代表输入采样点的数量),进行FFT的运算复杂度是Nlg10(N),因此,计算一个1,000采样点的DFT,使用FFT算法只需要计算3,000次,而常规的DFT算法需要计算1,000,000次!

        我们以一个4个点的DFT变换为例来简单说明FFT是怎样实现快速算法的:

 

计算得出:

 

其中的红色部分在FFT中是必须计算的分量,其他蓝色部分不需要直接计算,可以由红色的分量直接推导得到,比如:
x(1)e-j0 = -1*x(1)e-jπ
x(2)e-j0 = x(2)e-j2π
… …
这样,已经计算出的红色分量只需要计算机将结果保存下来用于之后计算时调用即可,因此大大减少了DFT的计算量。

三、 变换前后信号有何种对应关系?

        我们以一个实际的信号为例来说明:

        示波器采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。

        假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析精确到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析精确到0.5Hz。如果要提高频率分辨率,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

下面这幅图更能够清晰地表示这种对应关系:

 

变换之后的频谱的宽度(Frequency Span)与原始信号也存在一定的对应关系。根据Nyquist采样定理,FFT之后的频谱宽度(Frequency Span)最大只能是原始信号采样率的1/2,如果原始信号采样率是4GS/s,那么FFT之后的频宽最多只能是2GHz。时域信号采样周期(Sample Period)的倒数,即采样率(Sample Rate)乘上一个固定的系数即是变换之后频谱的宽度,即 Frequency Span = K*(1/ΔT),其中ΔT为采样周期,K值取决于我们在进行FFT之前是否对原始信号进行降采样(抽点),因为这样可以降低FFT的运算量。如下图所示:

 

 可见,更高的频谱分辨率要求有更长的采样时间,更宽的频谱分布需要提高对于原始信号的采样率,当然我们希望频谱更宽,分辨率更精确,那么示波器的长存储就是必要的!它能提供您在高采样率下采集更长时间信号的能力!值得强调的是,力科示波器可以支持计算128Mpts的FFT,而其它某品牌则只有3.2Mpts。

四、 在使用测试工具(示波器或者其它软件平台)进行FFT的方法和需要注意的问题?

        我们先来看一个简单的例子---
Problem:在示波器上采集一个连续的,周期性的信号,我们希望在示波器上进行FFT计算之后,观察到信号中心频率(Center Frequency)在2.48GHz,频宽(Frequency Span)为5MHz,频谱分辨率(Bandwidth Resolution)为10KHz的频谱图,应该如何设置示波器的采集?

        首先,根据频谱分辨率(Bandwidth Resolution)10KHz可以推算出,至少需要采集信号的时间长度为 1/10KHz=100us,因此至少要设置示波器时基为10us/Div;为了尽量保证FFT之后频谱图在各个频点的信号能量精度,测量时需要时域信号幅值占满整个栅格的90%以上;采样率设置应至少满足Nyquist采样率,即至少设置 >5GS/s采样率才能够看到中心频率在2.48GHz的频率谱线;选择合适的窗函数(Von Hann汉宁窗)和频谱显示方式(power spectrum);使用Zoom工具,将频谱移动到Center
2.48GHz,Scale 500KHz/Div 位置,Zoom设置方法如下图所示:

 

在力科示波器中进行FFT的运算有几种不同的输出类型:
Linear Magnitude(Volts),
Phase(Degrees),
Power Spectrum(dBm),
Power Spectral Density(dBm)
这几种输出类型都是由FFT计算之后的结果换算而来,我们知道FFT计算之后的结果包含实部(Real)和虚部(Imaginary)成分,它们的单位都是Volts。
具体的换算方式如下:
Linear Magnitude(Volts)= 

Phase(Degrees)= 
Power Spectrum(dBm)= 
Power Spectral Density(dBm)= ,其中

为频谱分辨率,ENBW为与所选加权函数(窗)相关的有效噪声带宽。

几种典型周期函数的频谱图:

 

频谱泄露:

        所谓频谱泄露,就是信号频谱中各谱线之间相互干扰,使测量的结果偏离实际值,同时在真实谱线的两侧的其它频率点上出现一些幅值较小的假谱。产生频谱泄露的主要原因是采样频率和原始信号频率不同步,造成周期的采样信号的相位在始端和终端不连续。简单来说就是因为计算机的FFT运算能力有限,只能处理有限点数的FFT,所以在截取时域的周期信号时,没有能够截取整数倍的周期。信号分析时不可能取无限大的样本。只要有截断不同步就会有泄露。如下图所示:

 

图中被测信号的开始端相位和截止端相位相同,表示在采集时间内有整数倍周期的信号被采集到,所以此时经行FFT运算后得出的频谱不会出现泄露。

 

上图的信号频率为2.1MHz,采集时间内没有截取整数倍周期的信号,FFT运算之后谱线的泄露现象严重,可以看到能量较低的谱线很容易被临近的能量较高的谱线的泄露给淹没住。

         因此,避免频谱泄露的方法除了尽量使采集速率与信号频率同步之外,还可以采用适当的窗函数。

         另外一个方法是采集信号时间足够长,基本上可以覆盖到整个有效信号的时间跨度。这种方法经常在瞬态捕捉中被使用到,比如说冲击试验,如果捕捉的时间够长,捕捉到的信号可以一直包括了振动衰减为零的时刻。在这种情况下,可以不加窗函数。

窗函数其实就是一个加权函数,它在截取的信号时间段内有值,时间段之外值为0:,记为:
w(t)=g(t)       -T/2<t<T/2
w(t)=0          其它

        加窗在时域上表现的是点乘,因此在频域上则表现为卷积。卷积可以被看成是一个平滑的过程。这个平滑过程可以被看出是由一组具有特定函数形状的滤波器,因此,原始信号中在某一频率点上的能量会结合滤波器的形状表现出来,从而减小泄漏。基于这个原理,人们通常在时域上直接加窗。
大多数的信号分析仪一般使用矩形窗(rectangular),汉宁(hann),flattop和其它的一些窗函数。

        不同的窗函数对频谱谱线的影响不同,基本形状可以参看下图:

 

 可以看到,不同的窗函数的主瓣宽度和旁瓣的衰减速度都不一样,所以对于不同信号的频谱应该使用适当的窗函数进行处理。

         矩形窗(Rectangular):加矩形窗等于不加窗,因为在截取时域信号时本身就是采用矩形截取,所以矩形窗适用于瞬态变化的信号,只要采集的时间足够长,信号宽度基本可以覆盖整个有效的瞬态部分。

         汉宁窗(Von Hann):如果测试信号有多个频率分量,频谱表现的十分复杂,且测试的目的更多关注频率点而非能量的大小。在这种情况下,需要选择一个主瓣够窄的窗函数,汉宁窗是一个很好的选择。

        flattop窗:如果测试的目的更多的关注某周期信号频率点的能量值,比如,更关心其EUpeak,EUpeak-peak,EUrms,那么其幅度的准确性则更加的重要,可以选择一个主瓣稍宽的窗,flattop窗在这样的情况下经常被使用。

五、力科示波器与泰克示波器的FFT计算方法的比较

        您可能也已经发现了这个问题:在示波器上进行FFT运算时,使用力科示波器和使用Tek示波器的计算结果似乎相差很大。产生这种差别的原因一方面可能是两者有效运算的采样点不一样。另外一个重要原因是LeCroy和Tek所使用的FFT运算的参考值不同,LeCroy使用dBm为单位(参考值是1mW的功率值),而Tek使用dB为单位(参考值是1Vrms的电压值),参考值不同产生的计算结果当然不一样!

        dB(Deci-bel,分贝) 是一个纯计数单位,本意是表示两个量的比值大小,没有单位。在工程应用中经常看到貌似不同的定义方式(仅仅是看上去不同)。对于功率,dB = 10*lg(A/B)。对于电压或电流,dB = 20*lg(A/B)。此处A,B代表参与比较的功率值或者电流、电压值。 dB的意义其实再简单不过了,就是把一个很大(后面跟一长串0的)或者很小(前面有一长串0的)的数比较简短地表示出来。

dBm是一个考征功率绝对值的值,计算公式为:10lg(功率值/1mw)。

此外,还有dBV、dBuV、dBW等等,仅仅是参考值选择的不同而已。

这里推荐一个工具网站,可以在不同的比较值之间进行转换:
http://www.giangrandi.ch/electronics/anttool/decibel.html

如下是一个实测的例子,使用同一信号分别用LeCroy和Tek示波器进行FFT运算

 

 使用LeCroy WaveRunner 64Xi的测试结果

 

使用Tek DPO4104的测试结果

所使用的信号幅值是 6.55 mV rms , 信号频率是 25 MHz

力科使用的计算方式如下:
dBm= 10 Log10 (((vrms^2)/50)/0.001)= 10Log10 ((4.29E-5/50)/0.001)=10Log10(8.5E-7/0.001)=10Log10 (8.5e-4)=10 (-3.066)= -30.66dBm

Tek使用的计算方式如下:
dB= 20Lg (6.61E-3)= 10(-4.3596)=-43.59

换算关系如下:

 

不仅仅只是FFT计算方式的差别,我们以力科的WaveMaster 8Zi-A和Tek的DPO70000系列为例,在WaveMaster上您可以做最多128M个采样点的FFT运算,而在DPO70000上只能做3.2M个点的FFT运算,所以,这种差别才是本质上的!

FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。

  虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。

  现在我就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号最高频率的两倍,这些我就不在此罗嗦了。

  采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方(参见FFT原理)。FFT运算量:Nlog2N(2为对数的底)。

  假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率F0=Fs/N。假设频率分辨率F0=Fs/N限定,采样频率Fs也给定,也已知信号最高频率Fh,那么由采样定理:Fs》=2Fh得到:N=Fs/F0>=2Fh/F0,即采样点必须满足这样一个关系式。

  如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,相应的采样点也为原来2倍,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即延长采样时间,所以频率分辨率和采样时间是倒数关系,就是说,要想分辨出频率间隔越小的频率(频率分辨率越高),采样时间越长越好。
假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:
    An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。
对于n=1点的信号,是直流分量,幅度即为A1/N。
    由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

    好了,说了半天,看着公式也晕,下面以一个实际的信号来做说明。

    假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:

    S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

    式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、
第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。

 

                      图1 FFT结果
   从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看:
1点: 512+0i
2点: -2.6195E-14 - 1.4162E-13i
3点: -2.8586E-14 - 1.1898E-13i

50点:-6.2076E-13- 2.1713E-12i
51点:332.55 - 192i
52点:-1.6707E-12 - 1.5241E-12i

75点:-2.2199E-13-1.0076E-12i
76点:3.4315E-12 + 192i
77点:-3.0263E-14 +7.5609E-13i
  
    很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值,
结果如下:
1点: 512
51点:384
76点:192
    按照公式,可以计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。
    然后再来计算相位信息。直流信号没有相位可言,不用管它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。
根据FFT结果以及上面的分析计算,我们就可以写出信号的表达式了,它就是我们开始提供的信号。

    总结:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度
达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。

[附录:本测试数据使用的matlab程序]
close all; %先关闭所有图片
Adc=2; %直流分量幅度
A1=3;   %频率F1信号的幅度
A2=1.5; %频率F2信号的幅度
F1=50; %信号1频率(Hz)
F2=75; %信号2频率(Hz)
Fs=256; %采样频率(Hz)
P1=-30; %信号1相位(度)
P2=90; %信号相位(度)
N=256; %采样点数
t=[0:1/Fs:N/Fs]; %采样时刻

%信号
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%显示原始信号
plot(S);
title('原始信号');

figure;
Y = fft(S,N); %做FFT变换
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %显示原始的FFT模值结果
title('FFT 模值');

figure;
Ayy=Ayy/(N/2);   %换算成实际的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %换算成实际的频率值
plot(F(1:N/2),Ayy(1:N/2));   %显示换算后的FFT模值结果
title('幅度-频率曲线图');

figure;
Pyy=[1:N/2];
for i=1:N/2
Pyy(i)=phase(Y(i)); %计算相位
Pyy(i)=Pyy(i)*180/pi; %换算为角度
end;
plot(F(1:N/2),Pyy(1:N/2));   %显示相位图
title('相位-频率曲线图');

 

以上是关于FFT(FastFourier Transform,快速傅立叶变换)的主要内容,如果未能解决你的问题,请参考以下文章

使用 scipy.fft 进行Fourier Transform:Python 信号处理

快速傅里叶变换FFT(Fast Fourier Transform)

FFT及NTT学习

用于特征提取的 Python FFT

J2me 的 FFT 示例

CycloneNTT:需要更少内存的butterfly FFT方案