FFT原理与实现

合集下载

简述fft原理和算法

简述fft原理和算法

简述fft原理和算法FFT(快速傅里叶变换)是一种高效的算法,用于将一个复杂的信号分解成一系列简单的正弦波分量。

它在信号处理、图像处理、通信等领域得到广泛应用。

本文将简述FFT的原理和算法。

傅里叶变换是一种将时域信号转换为频域信号的数学工具,可以将信号表示为一系列正弦波的叠加。

傅里叶变换的计算复杂度较高,特别是对于大规模的信号处理任务来说,计算成本非常高昂。

FFT 算法的出现解决了这个问题,它通过利用信号的对称性质和复数运算的性质,大大减少了计算所需的时间。

FFT算法通过逐步将信号分解为越来越短的子序列,最后得到每个子序列的傅里叶变换。

具体来说,FFT算法首先将信号分成偶数和奇数下标的两个子序列,然后对这两个子序列分别进行FFT计算。

接着将得到的两个子序列的傅里叶变换重新组合,得到原始信号的傅里叶变换。

为了更好地理解FFT算法的原理,可以将其比喻为一棵二叉树。

树的根节点表示原始信号,每个节点表示一个子序列。

通过不断地将子序列分解为更小的子序列,直到只剩下一个元素为止。

树的叶子节点表示最终的傅里叶变换结果。

在每一层的计算中,FFT算法利用了信号的对称性质,将计算量减半。

最后,将每个子序列的傅里叶变换结果按照规定的顺序重新组合,得到原始信号的傅里叶变换。

FFT算法的时间复杂度为O(NlogN),其中N表示信号的长度。

相比于传统的傅里叶变换算法,FFT算法的计算速度得到了极大的提升。

这使得FFT算法成为了信号处理领域中最重要的算法之一。

除了傅里叶变换,FFT算法还具有许多其他应用。

例如,FFT算法可以用于信号滤波,通过将信号变换到频域进行滤波操作,然后再将信号变换回时域。

此外,FFT算法还可以用于频谱分析、图像处理、通信等领域。

总结起来,FFT算法是一种高效的计算傅里叶变换的算法。

通过将信号分解为子序列并利用对称性质,FFT算法大大减少了计算所需的时间。

它在信号处理、图像处理、通信等领域得到广泛应用。

FFT的算法原理应用

FFT的算法原理应用

FFT的算法原理应用FFT(快速傅里叶变换)是一种用于计算傅里叶变换的算法,它通过分治法和迭代的方式,将O(n^2)时间复杂度的离散傅里叶变换(DFT)算法优化到O(nlogn)的时间复杂度。

FFT算法在信号处理、图像处理、通信系统等领域应用广泛。

1.算法原理:FFT算法的核心思想是将一个长度为n的序列分解为两个长度为n/2的子序列,然后通过递归的方式对子序列进行FFT计算。

在将子序列的FFT结果合并时,利用了傅里叶变换的对称性质,即可以通过递归的方式高效地计算出整个序列的FFT结果。

具体来说,FFT算法可以分为升序计算和降序计算两个过程。

升序计算是将原始序列转换为频域序列的过程,而降序计算则是将频域序列转换回原始序列的过程。

在升序计算中,序列的奇数项和偶数项被分开计算,而在降序计算中,FFT结果被奇数项和偶数项的和和差重新组合成原始序列。

2.算法应用:2.1信号处理:FFT算法在数字信号处理中广泛应用,可以将信号从时域转换为频域,从而实现滤波、降噪、频谱分析等操作。

例如,在音频处理中,可以利用FFT算法对音频信号进行频谱分析,从而实现声音的等化处理或实时频谱显示。

2.2图像处理:FFT算法在图像处理中也有重要的应用。

图像的二维傅里叶变换可以将图像从空间域转换为频域,从而实现图像的频域滤波、频域增强等操作。

例如,可以通过对图像进行傅里叶变换,找到图像中的频域特征,进而实现图像的降噪、边缘检测等功能。

2.3通信系统:FFT算法在通信系统中也有广泛应用,特别是在OFDM (正交频分复用)系统中。

OFDM系统可以将高速数据流分成多个低速子流,然后利用FFT对每一个子流进行频域调制,再通过并行传输的方式将它们叠加在一起。

这样可以提高信号的传输效率和容量,降低频率的干扰。

2.4数据压缩:FFT算法在数据压缩领域也得到了广泛应用。

例如,在JPEG图像压缩算法中,就使用了离散余弦变换(DCT),它可看做是FFT的一种变种。

编程实现快速傅里叶变换(fft)

编程实现快速傅里叶变换(fft)

一、概述傅里叶变换是信号处理和数据压缩中常用的数学工具,它可以将时域信号转换为频域信号,从而便于分析和处理。

而快速傅里叶变换(FFT)则是一种高效的计算傅里叶变换的方法,可以大大提高计算效率,广泛应用于信号处理、图像处理、通信系统等领域。

二、傅里叶变换原理傅里叶变换的基本思想是将一个时域信号分解为不同频率的正弦和余弦函数的叠加,从而得到该信号的频谱图。

具体来说,对于一个连续信号x(t),它的傅里叶变换X(ω)定义为:X(ω) = ∫[0,∞]x(t)e^(-jωt)dt其中,ω为频率变量,X(ω)表示在频率ω处的信号能量。

而对于离散信号x[n],它的傅里叶变换X[k]则定义为:X[k] = ∑[n=0,N-1]x[n]e^(-j2πkn/N)其中,N为信号的采样点数,k为频率域的序号。

上述公式称为离散傅里叶变换(DFT),计算复杂度为O(N^2)。

而快速傅里叶变换则通过巧妙的算法设计,将计算复杂度降低到O(NlogN)。

三、快速傅里叶变换算法概述快速傅里叶变换的算法最早由Cooley和Tukey在1965年提出,它的基本思想是将一个长度为N的DFT分解为两个长度为N/2的DFT的组合,通过递归地分解和合并,最终实现对整个信号的快速计算。

下面我们来介绍一种常用的快速傅里叶变换算法:递归式分治法。

四、递归式分治法递归式分治法是一种高效的计算DFT的方法,它的基本思想是将长度为N的DFT分解为两个长度为N/2的DFT,并通过递归地调用自身,最终实现对整个信号的傅里叶变换。

具体来说,假设有一个长度为N的信号x[n],对其进行快速傅里叶变换的过程可以分为如下几个步骤:1. 将长度为N的信号x[n]分为长度为N/2的偶数序号和奇数序号的两个子信号x_even[n]和x_odd[n];2. 对子信号x_even[n]和x_odd[n]分别进行快速傅里叶变换,得到它们的频域表示X_even[k]和X_odd[k];3. 结合X_even[k]和X_odd[k],计算原信号的频域表示X[k]。

快速傅里叶变换的原理

快速傅里叶变换的原理

快速傅里叶变换的原理快速傅里叶变换(FFT)是一种计算傅里叶变换的快速算法,它将傅里叶变换的复杂度从O(n^2)降低到O(n log n),大大提高了计算效率。

快速傅里叶变换的原理是基于分治法和递归的思想,通过将一个长度为N的离散序列分成两个长度为N/2的子序列,然后将这些子序列分别进行快速傅里叶变换,最后再将它们合并起来,从而得到原序列的傅里叶变换结果。

快速傅里叶变换的原理可以通过以下步骤详细解释:1. 初始化:首先将输入的N个复数序列x(n)进行重排,以便使得序列中的奇数项和偶数项可以分别在计算时被独立处理。

这一步可以使用位逆序排列(bit-reversal permutation)算法来实现,将输入序列中的元素按照其二进制位反转的方法进行重新排列,使得后续计算能够高效地进行。

2. 分治处理:将N个复数序列x(n)分成两个长度为N/2的子序列,分别记为偶数项序列x_e(n)和奇数项序列x_o(n)。

分别对这两个子序列进行快速傅里叶变换,得到它们的傅里叶变换结果X_e(k)和X_o(k)。

3. 合并结果:利用蝶形算法(butterfly algorithm)将两个子序列的傅里叶变换结果X_e(k)和X_o(k)合并起来,得到原序列的傅里叶变换结果X(k)。

蝶形算法是一种迭代的方法,通过不断的蝶形运算将两个输入信号的频域信息进行合并,实现了快速的傅里叶变换。

以上三个步骤就构成了快速傅里叶变换的基本原理,通过将一个长度为N的复数序列进行分治处理,并利用蝶形算法将子序列的傅里叶变换结果合并起来,从而高效地得到原序列的傅里叶变换结果。

快速傅里叶变换的原理可以通过一个简单的例子进行解释。

假设有一个长度为8的复数序列x(n)={1, 2, 3, 4, 4, 3, 2, 1},我们希望计算这个序列的傅里叶变换。

首先将输入序列按照位逆序排列,得到新的序列x'(n)={1, 3, 2, 4, 4, 2, 3, 1},然后将x'(n)分成两个长度为4的子序列x_e(n)={1, 2, 4, 3}和x_o(n)={3, 4, 2, 1}。

应用FFT实现信号频谱分析

应用FFT实现信号频谱分析

应用FFT实现信号频谱分析一、快速傅里叶变换(FFT)原理快速傅里叶变换是一种将时域信号转换为频域信号的算法,它通过将信号分解为不同频率的正弦波的和,来实现频谱分析。

FFT算法是一种高效的计算DFT(离散傅里叶变换)的方法,它的时间复杂度为O(nlogn),在实际应用中得到广泛使用。

二、FFT算法FFT算法中最基本的思想是将DFT进行分解,将一个长度为N的信号分解成长度为N/2的两个互为逆序的子信号,然后对这两个子信号再进行类似的分解,直到分解成长度为1的信号。

在这一过程中,可以通过频谱折叠的性质,减少计算的复杂度,从而提高计算效率。

三、FFT实现在实际应用中,可以使用Matlab等软件来实现FFT算法。

以Matlab 为例,实现FFT可以分为以下几个步骤:1.读取信号并进行预处理,如去除直流分量、归一化等。

2. 对信号进行FFT变换,可以调用Matlab中的fft函数,得到频域信号。

3.计算频谱,可以通过对频域信号进行幅度谱计算,即取频域信号的模值。

4.可选地,可以对频谱进行平滑处理,以降低噪音干扰。

5.可选地,可以对频谱进行归一化处理,以便于分析和比较不同信号的频谱特性。

四、应用1.音频处理:通过分析音频信号的频谱,可以实现音频特性的提取,如频率、振幅、共振等。

2.图像处理:通过分析图像信号的频谱,可以实现图像特征的提取,如纹理、边缘等。

3.通信系统:通过分析信号的频谱,可以实现信号的调制解调、频谱分配等功能。

4.电力系统:通过分析电力信号的频谱,可以实现电力质量分析、故障检测等。

总结:应用FFT实现信号频谱分析是一种高效的信号处理方法,通过将时域信号转换为频域信号,可以实现对信号频谱特性的提取和分析。

在实际应用中,我们可以利用FFT算法和相应的软件工具,对信号进行频谱分析,以便于进一步的研究和应用。

FFT算法详解

FFT算法详解

FFT算法详解FFT (Fast Fourier Transform) 是一种高效的离散傅里叶变换算法,用于将时域信号转换为频域信号。

它在信号处理、图像处理、通信领域等具有广泛的应用。

本文将详细介绍FFT算法的原理和实现。

一、傅里叶变换的基本原理傅里叶变换是一种将信号从时域转换到频域的方法。

它将时域信号分解成多个不同频率的正弦和余弦函数的叠加。

傅里叶变换的基本公式为:F(k) = Σ_{n=0}^{N-1} f(n)e^{-2πikn/N}其中,F(k)是频域信号的复数表示,f(n)是时域信号的复数表示,N是信号长度,k是频率。

二、傅里叶变换的问题传统的傅里叶变换算法的时间复杂度为O(N^2),计算量较大,不适用于实时处理大型信号。

FFT算法通过分治的思想,将DFT(Digital Fourier Transform)问题转化为多个子问题,从而降低了计算复杂度。

三、蝶形运算蝶形运算的公式为:y_0=x_0+W_N^k*x_1y_1=x_0-W_N^k*x_1其中,x_0、x_1是输入,y_0、y_1是输出,W_N^k是旋转因子,N是信号长度,k是频率。

四、FFT算法的步骤1.将输入信号分成偶数下标和奇数下标的两个子序列。

2.对两个子序列分别进行FFT变换,得到两个子序列的频域表示。

3.将两个子序列的频域表示合并成完整的频域信号。

4.重复上述步骤,直到得到最终的频域信号。

五、FFT算法的实现1.初始化输入信号和旋转因子。

2.将输入信号按照偶数下标和奇数下标分成两个子序列。

3.对两个子序列分别进行FFT变换,递归调用FFT函数。

4.将两个子序列的频域表示合并成完整的频域信号。

5.返回最终的频域信号。

总结:FFT算法是一种高效的离散傅里叶变换算法,通过分治的思想将DFT问题分解为多个子问题,从而降低了计算复杂度。

它在信号处理、图像处理、通信领域等有着广泛的应用。

掌握FFT算法的原理和实现对于理解信号处理技术和提高算法效率具有重要意义。

fft的C语言实现

算法原理:按时间抽取(DIT)FFT算法将时间序列x(n)的次序重排,并利用W i n函数的特性,将长序列的离散傅里叶变换运算逐渐分解成较短序列的离散傅里叶变换计算,从而提高运算效率。

基2DIT FFT的特点(1)倒位序输出频谱抽样值X(K)是按照顺序出现的,但是输入时间序列x(n)的顺序被打乱了。

可以使用“二进制码位倒置法”对输入的时间序列x(n)进行排序。

比如对N=8,用三位二进制码n2n1n0表示。

对于正序来说,十进制数序号n的二进制数的关系为n=22n2+2n1+n0倒位序的序号为n=22n0+2n1+n2(2)运算结构FFT的运算结构式由大量的蝶形流图组成的。

基2DIT FFT运算是将N点的DFT先分成2个N/2点DFT,再是4个N/4点DFT,直至N/2个2点DFT。

每分一次,称为一“级”运算,前一级的输出时候一级的输入。

在编程过程中要解决码位到序、级数级数、旋转因子计算及蝶形运算流图的编程实现。

程序流程图。

利用WIN-TC测试程序,对一三角波序列进行FFT。

将得到的结果与matable的结果进行比较,判断其正确性。

对三角波序列x(n)={0,1,2,3,4,5,6,5,4,3,2,1,0}在WIN-TC进行128点FFT,得到前6个结果Matable仿真的前6个结果是XKN2 =Columns 1 through 636.0000 34.2084 -10.3770i 29.1007 -19.4445i 21.4292 -26.1115i 12.2946 -29.6817i 2.9501 -29.9525i前半段波形对比显示WIN-TC结果能保证小数点后2位的精度。

对方波序列x(n),长度为64,前32为1,幅值为1的序列在WIN-TC进行128点FFT,得到前6个结果Matable仿真的前6个结果是Columns 1 through 632.0000 20.8677 -19.8677i 1.0000 -20.3555i -6.2783 - 7.2783i 04.5539 - 3.5539i仿真波形对比显示WIN-TC结果能保证小数点后2位的精度。

FFT实验

FFT实验傅里叶变换(Fast Fourier Transform,FFT)是一种将时间域信号转换为频域信号的算法。

它在信号处理、图像处理、通信等领域得到广泛应用。

本实验将介绍FFT的原理,并提供一个简单的FFT实现程序。

一、傅里叶变换原理傅里叶变换是一种将连续时间域信号转换为连续频域信号的变换。

对于一个具有周期T的连续信号f(t),它的傅里叶变换F(w)可以表示为:F(w) = ∫[0,T] f(t) * exp(-j*w*t) dt其中,j是虚数单位,w是频率。

傅里叶变换的结果是一个复数函数,包含信号的幅度和相位信息。

在数字信号处理中,我们使用离散傅里叶变换(Discrete Fourier Transform,DFT)代替连续傅里叶变换。

离散傅里叶变换可以将离散时间域信号转换为离散频域信号。

对于一个N点采样的离散信号x(n),它的离散傅里叶变换X(k)可以表示为:X(k) = ∑[0,N-1] x(n) * exp(-j*2π*k*n/N)傅里叶变换的计算复杂度为O(n^2),而FFT是一种改进的傅里叶变换算法,可以将计算复杂度降低到O(n*logn)。

FFT通过将N点DFT分解为多个较小规模的DFT计算来实现。

以下提供一个使用C语言实现的简单FFT程序:#include <stdio.h>#include <math.h>int reverseBits(int num, int bits)int reversed = 0;for (int i = 0; i < bits; i++)reversed = (reversed << 1) , (num & 1); num >>= 1;}return reversed;void fft(double x[], double y[], int n) int bits = log2(n);for (int i = 0; i < n; i++)int j = reverseBits(i, bits);if (j < i)double temp = x[i];x[i]=x[j];x[j] = temp;temp = y[i];y[i]=y[j];y[j] = temp;}}for (int k = 2; k <= n; k <<= 1)int half = k >> 1;double wn_r = cos(2 * PI / k);double wn_i = sin(2 * PI / k);for (int i = 0; i < n; i += k)double w_r = 1.0;double w_i = 0.0;for (int j = 0; j < half; j++)double u_r = x[i + j];double u_i = y[i + j];double v_r = x[i + j + half] * w_r - y[i + j + half] * w_i; double v_i = x[i + j + half] * w_i + y[i + j + half] * w_r; x[i+j]=u_r+v_r;y[i+j]=u_i+v_i;x[i + j + half] = u_r - v_r;y[i + j + half] = u_i - v_i;double next_w_r = w_r * wn_r - w_i * wn_i;double next_w_i = w_i * wn_r + w_r * wn_i;w_r = next_w_r;w_i = next_w_i;}}}int maiint n = 8;double x[] = {0, 1, 2, 3, 4, 5, 6, 7};double y[] = {0, 0, 0, 0, 0, 0, 0, 0};fft(x, y, n);for (int i = 0; i < n; i++)printf("(%f, %f)\n", x[i], y[i]);}return 0;以上程序实现了一个8点FFT算法,可以将输入信号{x[0],x[1], ..., x[7]}转换为频域信号{X[0], X[1], ..., X[7]}。

FFT原理与实现

FFT原理与实现FFT(Fast Fourier Transform)是一种快速傅里叶变换算法,用于将时域信号转换为频域信号。

它是傅里叶变换的一种优化算法,通过分解和递归计算可以大幅缩短计算时间。

FFT在信号处理、图像处理、音频处理、通信等领域得到广泛应用。

FFT的原理可以通过以下几个步骤进行解释:1.输入信号:FFT的输入是时域信号,即在时间上采样得到的离散信号。

通常,这个信号是一个在计算机中存储的数字序列。

2.傅里叶变换:FFT将时域信号转换为频域信号,使用了傅里叶变换的数学公式。

傅里叶变换将信号分解为一系列正弦和余弦函数的和,每个函数对应一种频率成分。

3.分解和递归计算:FFT将输入信号分解成多个较小的子问题,然后通过递归计算解决。

这个分解过程是基于信号的二进制反转,将数字序列重新排列为二进制反转的次序。

4.合并和求和:计算出每个子问题的频域结果后,FFT通过合并和求和操作将子问题的结果合并为最终的频域结果。

这个操作需要对结果进行两两合并,并加上对应的旋转因子,以得到更高频率成分的结果。

5.输出频域信号:最终得到的频域结果可以表示为幅度和相位,幅度表示在对应频率上的能量大小,相位表示信号在对应频率上的相位关系。

FFT的实现可以分为两种常见的算法:基2FFT和基4FFT。

基2FFT是将输入信号按照二进制表示进行分解和合并,而基4FFT是将输入信号按照四进制进行分解和合并。

两种算法时间复杂度相同,但基4FFT的计算量更少。

在实现FFT时,需要注意以下几点:1.选择适当的FFT长度:FFT的计算结果是根据输入信号的采样个数来计算的,因此需要根据输入信号的长度选择合适的FFT长度。

一般来说,FFT长度选择为2的幂次方,这样可以充分利用FFT的分解和合并特性。

2.使用合适的内存分配:FFT需要使用数组来存储输入信号和计算结果,因此需要根据输入信号的长度分配合适的内存空间。

同时,为了提高计算效率,可以使用一些优化策略,如使用位操作和循环展开。

fft原理

FFT原理1. 前言FFT(快速傅里叶变换)是一种高效的计算DFT(离散傅里叶变换)的算法。

DFT是一种将信号在时域(时间域)转换为频域的方法,即将信号从时间域表示为频域表示。

FFT通过利用信号的周期性和对称性,将DFT计算的时间复杂度从O(n^2)降低到O(n log n),使信号的频谱分析更加高效。

本文将介绍FFT的原理,包括DFT、FFT的推导过程和算法实现。

2. DFT(离散傅里叶变换)DFT将一个离散的时间域信号转换为离散的频域信号。

对于一个长度为N的时域信号序列x[n],其DFT表示为:X[k] = Σ(x[n] * exp(-j * 2π * k * n / N)),其中k = 0, 1, …, N-1DFT的计算复杂度为O(N^2),对于大规模的信号处理,计算时间过长。

为了加速DFT的计算,引入了FFT算法。

3. FFT(快速傅里叶变换)FFT是一种基于DFT的快速计算算法,通过利用信号的周期性和对称性,将DFT的计算复杂度从O(N^2)降低到O(N log N)。

3.1 首先了解蝶形运算蝶形运算是FFT算法中的核心操作,用于实现信号的分解和合成。

假设有两个复数A和B,蝶形运算的公式如下:C = A + W * BD = A - W * B其中,W是一个复数,通常称为旋转因子。

通过不断地应用蝶形运算,可以将一个信号分解为多个子频段,并最终得到信号的频谱。

3.2 FFT的推导以求解长度为N的序列的DFT为例,假设N为偶数。

步骤1:将序列x[n]分为偶数下标和奇数下标的两个子序列,记为x_e[n]和x_o[n]。

步骤2:对x_e[n]和x_o[n]分别进行DFT,得到X_e[k]和X_o[k]。

步骤3:构造旋转因子W,并计算X[k]。

•如果k = 0, 1, …, N / 2 - 1,则 X[k] = X_e[k] + W_N^k X_o[k]•如果k = N / 2, N / 2 + 1, …, N - 1,则 X[k] = X_e[k - N / 2] - W_N^k X_o[k - N / 2]其中,W_N = exp(-j * 2π / N)为旋转因子。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FFT原理与实现在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。

尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理。

因此至DFT被发现以来,在很长的一段时间内都不能被应用到实际的工程项目中,直到一种快速的离散傅立叶计算方法——FFT,被发现,离散是傅立叶变换才在实际的工程中得到广泛应用。

需要强调的是,FFT并不是一种新的频域特征获取方式,而是DFT的一种快速实现算法。

本文就FFT的原理以及具体实现过程进行详尽讲解。

DFT计算公式其中x(n)表示输入的离散数字信号序列,WN为旋转因子,X(k)一组N点组成的频率成分的相对幅度。

一般情况下,假设x(n)来自于低通采样,采样频率为fs,那么X(k)表示了从-fs/2率开始,频率间隔为fs/N,到fs/2-fs/N截至的N个频率点的相对幅度。

因为DFT计算得到的一组离散频率幅度只实际上是在频率轴上从成周期变化的,即X(k+N)=X(k)。

因此任意取N个点均可以表示DFT的计算效果,负频率成分比较抽象,难于理解,根据X(k)的周期特性,于是我们又可以认为X(k)表示了从零频率开始,频率间隔为fs/N,到fs-fs/N截至的N个频率点的相对幅度。

N点DFT的计算量根据(1)式给出的DFT计算公式,我们可以知道每计算一个频率点X(k)均需要进行N次复数乘法和N-1次复数加法,计算N各点的X(k)共需要N^2次复数乘法和N*(N-1)次复数加法。

当x(n)为实数的情况下,计算N点的DFT需要2*N^2次实数乘法,2*N*(N-1)次实数加法。

旋转因子WN的特性1.W的对称性NW的周期性2.NW的可约性3.N根据以上这些性质,我们可以得到式(5)的一些列有用结果基-2 FFT算法推导假设采样序列点数为N=2^L,L为整数,如果不满足这个条件可以人为地添加若干个0以使采样序列点数满足这一要求。

首先我们将序列x(n)按照奇偶分为两组如下:于是根据DFT计算公式(1)有:至此,我们将一个N点的DFT转化为了式(7)的形式,此时k的取值为0到N-1,现在分为两段来讨论,当k为0~N/2-1的时候,因为x1(r),x2(r)为N/2点的序列,因此,此时式(7)可以写为:而当k取值为N/2~N-1时,k用k’+N/2取代,k’取值为0~N/2-1。

对式(7)化简可得:综合以上推导我们可以得到如下结论:一个N点的DFT变换过程可以用两个N/2点的DFT变换过程来表示,其具体公式如式(10)所示DFT快速算法的迭代公式:上式中X'(k’)为偶数项分支的离散傅立叶变换,X''(k’’)为奇数项分支的离散傅立叶变换。

式(10)的计算过程可以用图1的蝶形算法流图直观地表示出来。

图1 时间抽取法蝶形运算流图在图1中,输入为两个N/2点的DFT输出为一个N点的DFT结果,输入输出点数一致。

运用这种表示方法,8点的DFT可以用图2来表示:图2 8点DFT的4点分解根据公式(10),一个N点的DFT可以由两个N/2点的DFT运算构成,再结合图1的蝶形信号流图可以得到图2的8点DFT的第一次分解。

该分解可以用以下几个步骤来描述:1.将N点的输入序列按奇偶分为2组分别为N/2点的序列2.分别对1中的每组序列进行DFT变换得到两组点数为N/2的DFT变换值X1和X23.按照蝶形信号流图将2的结果组合为一个N点的DFT变换结果根据式(10)我们可以对图2中的4点DFT进一步分解,得到图3的结果,分解步骤和前面一致。

最后对2点DFT进一步分解得到最终的8点FFT信号计算流图:图3 8点DFT的全分解从图2到图3的过程中关于旋转系数的变化规律需要说明一下。

看起来似乎向前推一级,在奇数分组部分的旋转系数因子增量似乎就要变大,其实不是这样。

事实上奇数分组部分的旋转因子指数每次增量固定为1,只是因为每向前推进一次,该分组序列的数据个数变少了,为了统一使用以原数据N为基的旋转因子就进行了变换导致的。

每一次分组奇数部分的系数WN,这里的N均为本次分组前的序列点数。

以上边的8点DFT为例,第一次分组N=8,第二次分组N为4,为了统一根据式(4)进行了变换将N变为了8,但指数相应的需要乘以2。

N点基-2 FFT算法的计算量从图3可以看到N点DFT的FFT变换可以转为log2(N)级级联的蝶形运算,每一级均包含有N/2次蝶形计算。

而每一个蝶形运算包含了1次复数乘法,2次复数加法。

因此N点FFT计算的总计算量为:复数乘法——N/2×log2(N) 复数加法——N×log2(N)。

假设被采样的序列为实数序列,那么也只有第一级的计算为实数与复数的混合计算,经过一次迭代后来的计算均变为复数计算,在这一点上和直接的DFT计算不一致。

因此对于输入序列是复数还是实数对FFT算法的效率影响较小。

一次复数乘法包含了4次实数乘法,2次实数加法,一次复数加法包含了2次复数加法。

因此对于N点的FFT计算需要总共的实数乘法数量为:2×N×log2(N);总的复数加法次数为:2xNxlog2(N)。

:FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。

有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。

这就是很多信号分析采用FFT变换的原因。

另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。

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

现在圈圈就根据实际经验来说说FFT结果的具体物理意义。

一个模拟信号,经过ADC采样之后,就变成了数字信号。

采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。

采样得到的数字信号,就可以做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的采样率采样102点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到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。

从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。

我们分别将这三个点附近的数据拿上来细看:1点:512+0i2点:-2.6195E-14 - 1.4162E-13i3点:-2.8586E-14 - 1.1898E-13i50点:-6.2076E-13 - 2.1713E-12i51点:332.55 - 192i52点:-1.6707E-12 - 1.5241E-12i75点:-2.2199E-13 -1.0076E-12i76点:3.4315E-12 + 192i77点:-3.0263E-14 +7.5609E-13i很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。

接着,我们来计算各点的幅度值。

分别计算这三个点的模值,结果如下:1点:51251点:38476点: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);该点的相位即是对应该频率下的信号的相位。

相关文档
最新文档