C语言实现FFT(快速傅里叶变换)

合集下载

fft计算频谱和相位 c语言

fft计算频谱和相位 c语言

一、概述快速傅里叶变换(FFT)是一种常用的计算频谱和相位的方法,广泛应用于信号处理、图像处理、语音识别等领域。

C语言作为一种高效、灵活的编程语言,被广泛应用于嵌入式系统、操作系统、网络编程等方面。

本文将介绍如何使用C语言编写FFT算法,计算信号的频谱和相位。

二、FFT算法原理1. 傅里叶变换的基本概念傅里叶分析是一种数学工具,用来将一个信号分解成不同频率的正弦和余弦函数的叠加。

对于一个离散的信号序列,可以使用快速傅里叶变换来高效地计算其频谱和相位。

2. 快速傅里叶变换的原理FFT是一种将离散信号的傅里叶变换分解为若干子变换的算法,其时间复杂度为O(NlogN),远优于普通的傅里叶变换算法。

FFT算法基于蝶形运算和分治策略,通过递归地将N个信号点划分为两个子序列,然后分别计算它们的傅里叶变换,最后再将结果合并得到整体的傅里叶变换。

三、C语言实现FFT算法1. 数据结构定义在C语言中,可以使用数组来存储信号序列,并且定义结构体来表示复数及其运算。

例如:```ctypedef struct {double real; // 实部double imag; // 虚部} Complex;```2. FFT算法实现以递归方式实现FFT算法,需要先实现蝶形运算和分治策略。

以下是一个简化的FFT实现代码示例:```cvoid fft(Complex *input, Complex *output, int N) {if (N == 1) {output[0] = input[0];} else {Complex *even = (Complex*)malloc(N/2 * sizeof(Complex)); Complex *odd = (Complex*)malloc(N/2 * sizeof(Complex)); for (int i = 0; i < N/2; ++i) {even[i] = input[2*i];odd[i] = input[2*i + 1];}fft(even, even, N/2);fft(odd, odd, N/2);for (int k = 0; k < N/2; ++k) {Complex t = {cos(2*PI*k/N), -sin(2*PI*k/N)};output[k] = add(even[k], mul(t, odd[k]));output[k + N/2] = sub(even[k], mul(t, odd[k]));}free(even);free(odd);}}```4. 主函数调用在主函数中可以定义输入序列,调用fft函数计算其傅里叶变换,并进一步计算频谱和相位。

快速傅里叶变换fft的c程序代码实现

快速傅里叶变换fft的c程序代码实现

快速傅里叶变换fft的c程序代码实现标题:一种高效实现快速傅里叶变换(FFT)的C语言程序代码导言:快速傅里叶变换(Fast Fourier Transform,FFT)是一种在信号处理、图像处理、通信系统等领域广泛应用的重要算法。

它通过将输入信号从时域转换到频域,实现了对信号的频谱分析和频率成分提取。

在实际应用中,为了获得高效的FFT计算过程,我们需要使用合适的算法和优化技巧,并将其转化为高质量的C语言代码。

本文将介绍一种基于Cooley-Tukey算法的快速傅里叶变换的C语言程序代码实现。

我们将从原理开始详细讲解FFT算法,然后逐步引入代码实现的步骤,并进行相关优化。

我们将总结整个实现过程,并分享一些个人对FFT算法的理解和观点。

一、快速傅里叶变换(FFT)的原理(1)傅里叶级数与离散傅里叶变换傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和的方法。

然而,实际数字信号往往是离散的。

我们需要离散傅里叶变换(Discrete Fourier Transform,DFT)来对离散信号进行频谱分析。

(2)DFT的定义及其计算复杂度离散傅里叶变换通过对离散信号的变换矩阵进行乘法运算,得到其频谱表示。

然而,直接使用定义式计算DFT的时间复杂度为O(N^2),其中N为信号长度,这对于大规模信号计算是不可接受的。

(3)引入快速傅里叶变换 (FFT)Cooley-Tukey算法是一种最常用的FFT算法,通过将DFT分解为多个较小规模的DFT计算来降低计算复杂度。

FFT的时间复杂度为O(NlogN),大大提高了计算效率。

二、快速傅里叶变换(FFT)的C语言实现(1)算法流程和数据结构设计以一维FFT为例,我们需要定义合适的数据结构来表示复数和存储输入输出信号,同时设计实现FFT的主要流程。

(2)递归实现方法递归实现是最直观的FFT实现方法,基于Cooley-Tukey算法的思想。

将输入信号分为偶数和奇数两部分,然后递归计算它们的FFT。

c语言dft算法

c语言dft算法

在C语言中实现DFT(离散傅里叶变换)算法可以使用库函数fft(Fast Fourier Transform,快速傅里叶变换),也可以自己实现。

以下是一个简单的DFT算法的C语言实现:
void idft(double *x, int n)
{
double complex *y;
int i;
for (i = 0; i < n; i++) {
y[i] = creal(x[i]);
y[i] *= pow(-1.0, i * 2) * x[i];
}
for (i = 0; i < n; i++) {
x[i] = creal(y[i]);
y[i] = complex_conj(y[i]);
}
}
这个算法的基本思路是:首先将输入向量x中的所有元素求实部和虚部,然后将虚部乘以-1.0的i*2次方,再将实部和虚部相加,得到DFT输出向量y中的每个元素。

最后将y中的实部和虚部交换,得到原始向量x的反转DFT输出。

在这个算法中,我们使用了C语言中的complex类型来表示复数,使用creal()函数来获取复数的实部,使用complex_conj()函数来计算复数的共轭。

需要注意的是,这个算法只适用于n为偶数的情况,因为DFT输出向量中的元素需要和输入向量中的元素一一对应。

如果n为奇数,则需要对输入向量进行填充或删除,以使其满足偶数长度。

编程实现快速傅里叶变换(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]。

c实现快速傅里叶变换输出频谱

c实现快速傅里叶变换输出频谱

标题:C语言实现快速傅里叶变换输出频谱一、简介在信号处理和频域分析中,快速傅里叶变换(FFT)是一种常用的算法,用于将时域的信号转换为频域的频谱。

在C语言中实现快速傅里叶变换可以帮助我们对信号进行高效的频域分析。

本文将从基础开始,介绍C语言实现快速傅里叶变换并输出频谱的方法。

二、快速傅里叶变换概述快速傅里叶变换是一种将离散信号转换为频域表示的算法,它将N个离散时间域采样点转换成N个频域采样点。

快速傅里叶变换算法的核心是分治法,通过递归地将信号分解为奇偶部分,然后合并计算,从而实现高效的频谱分析。

三、C语言实现快速傅里叶变换1. 我们需要定义一个复数结构体,用于表示实部和虚部。

在C语言中,可以使用结构体来表示复数,例如:```ctypedef struct {double real; // 实部double imag; // 虚部} Complex;```2. 接下来,我们可以编写一个函数来实现快速傅里叶变换。

在函数中,我们可以按照快速傅里叶变换的递归算法,将信号分解为奇偶部分,并进行合并计算,最终得到频域表示的频谱。

```cvoid FFT(Complex* x, int N, int inv) {// 实现快速傅里叶变换的代码// ...}```3. 在实现快速傅里叶变换的过程中,我们还需要编写一些辅助函数,例如计算旋转因子和进行信号分解合并等操作。

四、输出频谱在C语言中实现快速傅里叶变换后,我们可以将得到的频域表示的频谱输出到文件或者直接在终端进行可视化。

通过频谱分析,我们可以了解信号的频域特性,包括频率成分、频谱密度等信息。

五、个人观点和理解C语言实现快速傅里叶变换需要深入理解算法的原理,同时对C语言的数据结构和递归算法有一定的掌握。

在实际应用中,我们可以将快速傅里叶变换应用于音频处理、图像处理、通信系统等领域,对信号的特性进行频域分析。

六、总结通过本文的介绍,我们了解了C语言实现快速傅里叶变换并输出频谱的方法。

用c语言实现的FFT

用c语言实现的FFT

一、对FFT的介绍1. FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。

2.FFT算法的基本原理FFT算法是把长序列的DFT逐次分解为较短序列的DFT。

按照抽取方式的不同可分为DIT-FFT(按时间抽取)和DIF-FFT(按频率抽取)算法。

按蝶形运算的构成不同可分为基2,基4,基8,以及任意因子的类型。

3.迭代关系4、本次程序的基本过程我们这次所研究的是数字信号处理中的FFT算法,我们这次所用的数字信号是复数类型的。

(1)所以首先,我们先定义了一个复数结构体,因为是进行复数的运算,我们又相继定义复数的加减乘运算的函数。

(2)紧接着,我们定义了进行FFT计算的fft()快速傅里叶变换函数initW() 初始化变换核函数即旋转因子的计算,change() 变址函数,output()输出傅里叶变换的结果的函数。

(3)定义主函数,并调用定义好的相关子函数,利用fft()中的蝶形运算以及change()函数来完成从时间域上选取的DIT-FFT。

二、FFT中码位倒置排序1、码位倒置的实现方法:(1)简单的利用按位与、或循环实现(2)利用公式推导的迭代方法2、为什么要进行码位倒置因为由于FFT的计算特性,如果按照正常顺序输入,而没有进行码位倒置的话,就会以乱序输出,就不便于我们后续对信号的相关性质进行研究了,所以DIT-FFT算法就是在进行FFT计算之前,进行分奇偶后的码位倒置运算,即二进制数的倒位。

3、倒位序由奇偶分组造成,以N=8为例,说明如下:三、蝶形运算由按照上述公式的规律进行逐级分解,直到2点DFT,如下是N=8时的蝶形算法分析图:四、FFT算法中蝶形算法的基本思想分析(1)我们知道N点FFT运算可以分成log2(N)级,每一级都有N/2个碟形,FFT的基本思想是用3层循环完成全部运算(N点FFT)。

c语言快速傅里叶变

c语言快速傅里叶变

c语言快速傅里叶变快速傅里叶变换的实现可以使用递归或迭代两种方式:1. 递归实现递归版本的快速傅里叶变换(FFT)是一种标准实现方法,它的时间复杂度为O(n * log2(n))。

快速傅里叶变换的代码实现如下:```void fft(double complex* x, int n){if(n == 1)return;double complex odd[n/2], even[n/2];for(int i=0, j=0; i<n; i+=2, j++){even[j] = x[i];odd[j] = x[i+1];}fft(even, n/2);fft(odd, n/2);for(int i=0; i<n/2; i++){double complex t = cexp(-I * 2 * M_PI * i / n) * odd[i];x[i] = even[i] + t;x[i+n/2] = even[i] - t;}}```2. 迭代实现迭代实现 FFT 的主要思路是根据蝴蝶定理将一次变换的复杂度降为 O(n),多次迭代后复杂度为 O(n*logn)。

代码实现如下:```void fft(double complex* x, int n){int k = log2(n);double complex w[n/2];for (int i=0; i<n/2; i++)w[i] = cexp(-I * 2 * M_PI * i / n);for (int i=0; i<k; i++)for (int j=0; j<n; j++)if (!(j & (1<<i))){int x1 = j, x2 = j | (1<<i);double complex t = x[x2] * w[x2 & ((1<<i)-1)];x[x2] = x[x1] - t;x[x1] += t;}}```以上两种方式都是可行的,但是迭代实现方式更加快速。

fft算法c语言实现

fft算法c语言实现

fft算法c语言实现快速傅里叶变换(FFT)是一种高效的离散傅里叶变换算法,用于计算信号在频域的表示。

下面是一个简单的使用 C 语言实现的 FFT 算法示例,它可以用于对输入的时域信号进行离散傅里叶变换。

```c#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 16// 复数结构体typedef struct {double real;double imag;} Complex;// 初始化复数void initComplex(Complex *c, double real, double imag) {c->real = real;c->imag = imag;}// FFT 算法void fft(Complex *c, int n) {int i, j, k;Complex w, u, v;// 层次遍历for (i = 1; i < n; i <<= 1) {// 旋转因子w.real = cos(2 * M_PI * i / n);w.imag = -sin(2 * M_PI * i / n);for (j = 0; j < n; j += i) {for (k = 0; k < i / 2; k++) {u.real = c[j + k].real;u.imag = c[j + k].imag;v.real = c[j + i / 2 + k].real;v.imag = c[j + i / 2 + k].imag;c[j + k].real = u.real + w.real * v.real - w.imag * v.imag; c[j + k].imag = u.imag + w.real * v.imag + w.imag * v.real; c[j + i / 2 + k].real = u.real - w.real * v.real + w.imag * v.imag; c[j + i / 2 + k].imag = u.imag - w.real * v.imag - w.imag * v.real; }}}}// 打印复数void printComplex(Complex c) {printf("%f + %fi\n", c.real, c.imag);}int main() {Complex c[N];// 输入的时域信号for (int i = 0; i < N; i++) {c[i].real = rand() / RAND_MAX;c[i].imag = rand() / RAND_MAX;}printf("输入的时域信号:\n");// 打印输入的时域信号for (int i = 0; i < N; i++) {printComplex(c[i]);}fft(c, N);printf("经过 FFT 变换后的频域信号:\n");// 打印经过 FFT 变换后的频域信号for (int i = 0; i < N; i++) {printComplex(c[i]);}return 0;}```上述代码是一个简单的 C 语言实现的 FFT 算法示例。

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

#include <iom128.h>#include <intrinsics.h>/*********************************************************************快速福利叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。

此函数采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的应该为2的N次方,不满足此条件时应在后面补0函数调用:FFT(s);时间:2010-2-20版本:Ver1.0参考文献:**********************************************************************/#include<math.h>#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值#define FFT_N 128 //定义福利叶变换的点数struct compx {float real,imag;}; //定义一个复数结构struct compx s[FFT_N]; //FFT输入和输出:从S[1]开始存放,根据大小自己定义/*******************************************************************函数原型:struct compx EE(struct compx b1,struct compx b2)函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出*******************************************************************/struct compx EE(struct compx a,struct compx b){struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);}/*****************************************************************函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型*****************************************************************/void FFT(struct compx *xin){int f,m,nv2,nm1,i,k,l,j=0;struct compx u,w,t;nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法nm1=FFT_N-1;for(i=0;i<nm1;i++){if(i<j) //如果i<j,即进行变址{t=xin[j];xin[j]=xin[i];xin[i]=t;}k=nv2; //求j的下一个倒位序while(k<=j) //如果k<=j,表示j的最高位为1{j=j-k; //把最高位变成0k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }j=j+k; //把0改为1}{int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT运算f=FFT_N;for(l=1;(f=f/2)!=1;l++) //计算l的值,即计算蝶形级数;for(m=1;m<=l;m++) // 控制蝶形结级数{ //m表示第m级蝶形,l为蝶形级总数l=log(2)Nle=2<<(m-1); //le蝶形结距离,即第m级蝶形的蝶形结相距le点lei=le/2; //同一蝶形结中参加运算的两点的距离u.real=1.0; //u为蝶形结运算系数,初始值为1u.imag=0.0;w.real=cos(PI/lei); //w为系数商,即当前系数与前一个系数的商w.imag=-sin(PI/lei);for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结{for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结{ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点t=EE(xin[ip],u); //蝶形运算,详见公式xin[ip].real=xin[i].real-t.real;xin[ip].imag=xin[i].imag-t.imag;xin[i].real=xin[i].real+t.real;xin[i].imag=xin[i].imag+t.imag;}u=EE(u,w); //改变系数,进行下一个蝶形运算}}}}/************************************************************函数原型:void main()函数功能:测试FFT变换,演示函数使用方法输入参数:无输出参数:无************************************************************/void main(){int i;for(i=0;i<FFT_N;i++) //给结构体赋值{s[i].real=sin(2*3.141592653589793*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1 s[i].imag=0; //虚部为0}FFT(s); //进行快速福利叶变换for(i=0;i<FFT_N;i++) //求变换后结果的模值,存入复数的实部部分s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);while(1);}#include <iom128.h>#include <intrinsics.h>/*********************************************************************快速福利叶变换C程序包函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。

此程序包采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表,以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的应该为2的N次方,不满足此条件时应在后面补0。

若使用查表法计算sin值和cos值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表函数调用:FFT(s);时间:2010-2-20版本:Ver1.1参考文献:**********************************************************************/#include<math.h>#define FFT_N 128 //定义福利叶变换的点数#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值struct compx {float real,imag;}; //定义一个复数结构struct compx s[FFT_N]; //FFT输入和输出:从S[0]开始存放,根据大小自己定义float SIN_TAB[FFT_N/2]; //定义正弦表的存放空间/*******************************************************************函数原型:struct compx EE(struct compx b1,struct compx b2)函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出*******************************************************************/struct compx EE(struct compx a,struct compx b){struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);}/******************************************************************函数原型:void create_sin_tab(float *sin_t)函数功能:创建一个正弦采样表,采样点数与福利叶变换点数相同输入参数:*sin_t存放正弦表的数组指针输出参数:无******************************************************************/ void create_sin_tab(float *sin_t){int i;for(i=0;i<FFT_N/2;i++)sin_t[i]=sin(2*PI*i/FFT_N);}/****************************************************************** 函数原型:void sin_tab(float pi)函数功能:采用查表的方法计算一个数的正弦值输入参数:pi 所要计算正弦值弧度值,范围0--2*PI,不满足时需要转换输出参数:输入值pi的正弦值******************************************************************/ float sin_tab(float pi){int n;float a;n=(int)(pi*FFT_N/2/PI);if(n>=0&&n<FFT_N/2)a=SIN_TAB[n];else if(n>=FFT_N/2&&n<FFT_N)a=-SIN_TAB[n-FFT_N/2];return a;}/****************************************************************** 函数原型:void cos_tab(float pi)函数功能:采用查表的方法计算一个数的余弦值输入参数:pi 所要计算余弦值弧度值,范围0--2*PI,不满足时需要转换输出参数:输入值pi的余弦值******************************************************************/ float cos_tab(float pi){float a,pi2;pi2=pi+PI/2;if(pi2>2*PI)pi2-=2*PI;a=sin_tab(pi2);return a;}/*****************************************************************函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型输出参数:无*****************************************************************/void FFT(struct compx *xin){int f,m,nv2,nm1,i,k,l,j=0;struct compx u,w,t;nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法nm1=FFT_N-1;for(i=0;i<nm1;i++){if(i<j) //如果i<j,即进行变址{t=xin[j];xin[j]=xin[i];xin[i]=t;}k=nv2; //求j的下一个倒位序while(k<=j) //如果k<=j,表示j的最高位为1{j=j-k; //把最高位变成0k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }j=j+k; //把0改为1}{int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT运算f=FFT_N;for(l=1;(f=f/2)!=1;l++) //计算l的值,即计算蝶形级数;for(m=1;m<=l;m++) // 控制蝶形结级数{ //m表示第m级蝶形,l为蝶形级总数l=log(2)N le=2<<(m-1); //le蝶形结距离,即第m级蝶形的蝶形结相距le点lei=le/2; //同一蝶形结中参加运算的两点的距离u.real=1.0; //u为蝶形结运算系数,初始值为1u.imag=0.0;//w.real=cos(PI/lei); //不适用查表法计算sin值和cos值// w.imag=-sin(PI/lei);w.real=cos_tab(PI/lei); //w为系数商,即当前系数与前一个系数的商w.imag=-sin_tab(PI/lei);for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结{for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结{ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点t=EE(xin[ip],u); //蝶形运算,详见公式xin[ip].real=xin[i].real-t.real;xin[ip].imag=xin[i].imag-t.imag;xin[i].real=xin[i].real+t.real;xin[i].imag=xin[i].imag+t.imag;}u=EE(u,w); //改变系数,进行下一个蝶形运算}}}}/************************************************************函数原型:void main()函数功能:测试FFT变换,演示函数使用方法输入参数:无输出参数:无************************************************************/void main(){int i;create_sin_tab(SIN_TAB);for(i=0;i<FFT_N;i++) //给结构体赋值{s[i].real=sin(2*3.141592653589793*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1 s[i].imag=0; //虚部为0}FFT(s); //进行快速福利叶变换for(i=0;i<FFT_N;i++) //求变换后结果的模值,存入复数的实部部分s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);while(1);}#include <iom128.h>#include <intrinsics.h>/*********************************************************************快速福利叶变换C程序包函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。

相关文档
最新文档