绘芯电池测试 - 专业的电池测试平台!

电池测试在线  - 电池测试仪|超级电容测试仪|电池测试系统|超级电容

当前位置: 电池测试 > 知识库 >

FFT与IFFT算法的C程序实现

时间:2016-08-12 12:10来源:未知 作者:admin 点击:
快速傅立叶变换(FFT)是数字信号处理的基本算法,它可以明显的降低运算量,成为数字信号处理的基本工具和迅速发展的动力。

 FFT与IFFT算法的C程序实现

快速傅立叶变换(FFT)是数字信号处理的基本算法,它可以明显的降低运算量,成为数字信号处理的基本工具和迅速发展的动力。本文首先介绍了时域抽取基2FFT算法、频域抽取基2FFT的算法和分裂基算法的工作,通过C语言程序将这些算法一一实现,并对输入信号进行了频谱分析,实验结果表明本程序能正确、高效地实现FFT正变换与FFT逆变换。另外, 用DSP处理器来实现FFT算法,仿真结果表明该算法极大程度上减小了运算量。

 

关键词数字信号处理;FFTDFTDSP 


1 绪论

1.1研究目的及意义

有限长序列可以通过离散傅叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅叶变换(FFT). 1965年,CooleyTukey提出了计算离散傅叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。从此,对快速傅叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIFFFT在离散傅叶反变换、线性卷积和线性相关等方面也有重要应用。

快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅叶变换,可以说是进了一大步。

傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。

因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。

从现代数学的眼光来看,傅叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅叶变换具有多种不同的变体形式,如连续傅叶变换和离散傅立叶变换。C语言为其提供软件支持,FFTIFFT均可通过C语言来实现。

1.2国内外研究现状

傅立叶变换快速算法发展已30年,我国综合了离散变换快速算法的发展,特别是近几年的发展,其中包括传统的基2、基4、基8、分裂基算法的发展以及多维离散傅叶变换、多维离散余统变换、多维离散W变换的快速算法、阐述各种算法是如何将多


维变换转换为一维变换的计算,并讨论了在有理数域上计算上述各种变换所需量小实数乘法的次数。FFT/IFFT是时域信号与频域信号之间转换的基本运算,是数字信号处理的核心工具之一,因此,它广泛地应用于许多领域。在数字化的今天,对数字信号处理的速度、精度和实时性要求不断提高。为满足不断提高的要求,国内不断地推出各种FFT/IFFT处理器,使各级运算并行处理,对输入进来的数据进行连续处理,提高了运算速度,满足了系统的实时性要求。DSP算法很多,但常把这些用算法通过C程序,编成标准子程序,需要时只需要简单调用即可完成相应的FFT/IFFT处理功能,这项工作对于实时数字信号应用系统的处理具有举足轻重作用。

当今,FFT算法在国外的发展已经相当成熟。在数字信号处理方面,国外的FFT算法处于领先地位,尤其是DSP芯片。目前,FFT算法通过C程序的实现为国际上的很多领域的发展提供了便利,也为其他领域的相关发展提供了应用基础。由于国际上的芯片处理技术的飞速发展,使得应用VC++6.0操作环境,大大提高了数字信号处理应用系统关于FFT算法的可操作性和可靠性。

1.3论文研究内容

本文主要研究如何利用VC++6.0软件学习和研究“FFTIFFT算法”,按照软件的工程方法,根据需求进行程序的功能分析和程序设计,给出设计详细说明。然后按照自己拟定的功能要求进行程序设计和调试。


2  FFT的研究领域及VC6.0编程环境

2.1FFT变换的研究领域及应用

2.1.1FFT的研究领域

从现代数学的眼光来看,傅叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅叶变换具有多种不同的变体形式,如连续傅叶变换和离散傅叶变换。

傅立叶变换属于调和分析的内容。“分析”二字,可以解释为深入的研究。从字面上来看,“分析”二字,实际就是"条分缕析"而已。它通过对函数的"条分缕析"来达到对复杂函数的深入理解和研究。从哲学上看,"分析主义""还原主义",就是要通过对事物内部适当的分析达到增进对其本质理解的目的。比如近代原子论试图把世界上所有物质的本源分析为原子,而原子不过数百种而已,相对物质世界的无限丰富,这种分析和分类无疑为认识事物的各种性质提供了很好的手段。

在数学领域,也是这样,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。“任意”的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅立叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感叹造物的神奇:

1.傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;

2.傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;

3.正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;

4.著名的卷积定理指出:傅立叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;

5.离散形式的傅立叶变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))

正是由于上述的良好性质,傅立叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。

2.1.2FFT的发展及重要应用


(1) 卷积

卷积是滤波网络对信号响应的术语,即用卷积积分来描述滤波网络对冲击函数信号的反应。若x(t)为信号,h(t)为响应,则卷积积分表示如下(2-1)所示:

                      2-1

每一个卷积点是信号函数与反转和平移后的网络函数的乘积中的区域。

(2) 相关


相关是用于小信号噪声检测的一种方法。如果有已知信号与一个噪声波形相关,用这个方法可以检测出来,有非零的结果表示发现了相关性,结果越明显,相关性越大。其在形式上与卷积积分相似,如下(2-2)所示:

                                      2-2

自相关是用来描述一个信号与它自己的相关程度,其值为信号的PSD,即功率谱密度。

(3) 滤波

这可能是FFT最广泛的应用了,它使对波形的频率分量滤波变得十分简单。比如对采样信号进行FFT后,干掉不需要的频率分量,再进行FFT反变换,就得到滤波后的期望信号。

(4) 信号分析

比如电力监控系统的谐波分析,就需要对采样数据进行FFT运算,然后通过液晶屏或其它人机界面重新绘画出来,以方便技术人员掌握电力的质量。

小结:

傅立叶变换在目前的相关电子产品中用得非常广泛,可以说,它是描述函数的另一种语言。掌握傅立叶变换,学会在空域和频域中同时思考问题,很多时候可以让我们使用简单的方法来解决复杂的问题。

2.2VC6.0编程环境

2.2.1VC6.0软件介绍

VC6.0的全称是:Visual C++ 6.0;它是美国Microsoft公司研发的基于Windows操作系统的C++集成开发环境。较早期程序设计的各个阶段都要用不同的软件来进行处理,如先用字处理软件编辑源程序,然后用链接程序进行函数、模块链接,再用编译程序进行编译,开发者必须在几种软件间进行来回切换操作。而集成开发环境是将这些繁琐工作流程集中在一个软件环境,通过这个软件环境来完成所有的软件研发步骤而且无需切换不同的开发工具。

Microsoft Visual C++,这套功能强大的Windows应用程序开发系统是由Microsoft C/C++演化而来的。从Microsoft C/C++8.0开始改称Visual C++,发展到今天的Visual C++6.0Visual C++6.0的最主要的技术特点是:可视化编程和支持面向对象的编程技


术。Visual C++提供了一系列可视化编程工具,如AppWizardClassWizard等。它们使Windows编程更为直观。Visual C++支持的面向对象的编程技术包装了Windows内在的复杂的运行机制,使Windows编程更为易学。此外,Visual C++6.0还具有其他技术特点:如通过Activex技术,支持Internet编程;支持ODBC数据库编程等。

2.2.2VC6.0主要特征

(1) Visual C++6.0开发环境

Visual C++6.0开发环境Developer Studio是在Windows 98/2000/XP环境下运行的一套集成工具,由文本编辑、资源编辑器、项目建工具、优化编辑器、增量连接器、源代码浏览器、集成调试器等组成。使用Developer Studio,不仅可以创建有Visual C++6.0使用的源文件和其他文档,而且可以创建、查看和编辑写任何与Active部件有关的文档。还可以在项目工作区中组织文件、项目和子项目。可以使用工作窗口来查看和访问项目中的各个元素。项目工作区可以含有多个项目。

(2) 向导

Visual C++6.0中,可以使用向导、MFC类库和活动模板库(ATL)来开发Windows应用程序。

(3) 最快的集成数据库访问

Visual C++6.0允许用户建立强有力的数据库应用程序,可以使用ODBC类的高性能的32ODBC驱动程序来访问各种数据库管理系统。还可以使用DAO(数据访问对象)类通过编写语言来访问和操纵数据库中的数据并管理数据库、数据库对象与结构。

2.2.3VC6.0的主要菜单项功能

VC6.0是集成开发环境,同时也是一种软件,因此也具备一般应用软件的操作界面,VC6.0的顶级菜单项有9个:

File:提供对源文件、资源文件和项目的新建、打开和保存等功能。

Edit:提供对源文件的编辑功能,包括复制粘贴等操作。

View:提供给用户查看调试窗口,或设置开发环境视图等功能。

Insert:提供新建类或插入文件到项目等功能。

Project:提供了对整个项目的设置功能。

Build:提供启动编译和运行等功能。

Tools:提供一些额外的工具以帮助开发者提高软件开发效率和质量。

Windows:提供窗口显示和切换功能。

Help:提供帮助信息。

 


3  FFTIFFT算法

3.1快速傅立叶变换简介

DFT是信号分析与处理中的一种重要变换。因直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,所以在快速傅叶变换(FFT)出现以前,直接用DFT算法进行普分析和信号的实时处理是不切实际的。直到1965年发现了一种快速算法FFT,情况才发生了根本变化。快速傅氏变换(FFT)是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。FFT原理如下:设x(n)N项的复数序列,由DFT变换,任一Xm)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次运算(四次实数乘法和四次实数加法),那么求出N项复数序列的Xm,NDFT变换大约就需要N2次运算。当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2DFT变换需要(N/22次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2N/22=N+N2/2。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种一分为二的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。

3.2按时间抽取的基2FFT算法

FFT算法基本上分为两大类:时域抽取法FFT(Decimation In Time FFT,简称DIT-FFT)和频域抽取法FFT(Decimation In Frequency FFT,简称DIFFFT)。下面先介绍DIFFFT算法。

设序列x(n)的长度为N,且满足,为自然数按n的奇偶把x(n)分解为两个N/2点的子序列如(3-1),(3-2)所示:                       

                                                                     3-1

                                                         

                                                                     3-2

x(n)DFT为:

                                                                     3-3

 

 

 

 

所以

其中分别为N/2DFT,即式子(3-4),(3-5)所示:

                                      3-4                                        

                3-5

由于均以N/2为周期,且(3-6)所示:

                                                                     3-6

所以X(k)又可表示为:

                                                                     3-7

 

                                                                     3-8

 

 

 

3.1 蝶形运算符号

 

 

 

 

 

 

 

 

 

 

3.2 NDFT的一次时域抽取分解图(N=8)


与第一次分解相同,将按奇偶分解成两个N/4长的子序列,那么,又可表示为:

 


                                                                     3-9

 


                                                                    3-10

 

 

 

 


                                                                    3-11

式中                                                                3-12

 

 

同理,由的周期性和的对称性  可最后得到式子(3-13):

 


                                                                    3-13               

 

用同样的方法可计算出(3-15

 


                                                                    3-14

 

其中

                                                                    3-15

 

                                                                    3-16

 

                                                                    3-17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


3.3 NDFT的第二次时域抽取分解图(N=8)

 

 

 

 

 

 

 

 

 

 


3.4 NDITFFT运算流图(N=8)

3.3按频率抽取的基2FFT算法

    在基2FFT算法中,频域抽取法FFT也是一种常用的快速算法,简称DIFFFT

    设序列x(n)长度为N=2M,首先将x(n)前后对半分开,得到两个子序列,其DFT可表示为如下(3-18)所示:

                                                               3-18

 

 

 

 

 

 

X(k)分解成偶数组与奇数组如下:

k取偶数(k=2r,r=0,1,,N/2-1)时如下(3-19)所示:

 


                                                                3-19

 

 

k取奇数(k=2r+1,r=0,1,…,N/2-1)时如下(3-21)所示:

 


                                                                3-20

 

 

分别代入上式(3-19),(3-20),可得式子(3-21)所示:

 


                                                                3-21

 

 

 

 

 

 

 

 

 

 


3.5 DIFFFT一次分解运算流图(N=8)

 

 

 

 

 

 

 

 

3.6 DIFFFT二次分解运算流图(N=8)

 

 

 

 

 

 

 

 


3.7 DIFFFT运算流图(N=8)

 

 

 

 

 

 

 

 

 


3.8 DITFFT的一种变形运算流图

 

 

 

 

 

 

 

 

 

3.9 DITFFT的一种变形运算流图

3.4离散IFFT的快速计算方法

上述FFT算法流图也可以用于离散傅立叶逆变换(Inverse Discrete Fourier Transform,简称IDFT)。比较DFT3-23)和IDFT3-24)的运算公式:

 

 


                                                                3-22

                                             

                                                                3-23

 

 

 

 

 

 

 

 

3.10 DITIFFT运算流图

 

 

 

 

 

 

 

 

 

3.11 DITIFFT运算流图(防止溢出)

3.5分裂基FFT算法

n=pq,且p=N/4q=4时,n可表示为:

                                                           3-24

并有

                                                              

3-25

 

 

 

 

 

 

 

 

 

 


再将上式(3-26)中的k表示为(3-27)所示:

                                                                3-26

可得如下式(3-28)所示:

 

                                                                3-27

 

 

 

 

 

 

 

 

=0,1,2,3,并用k表示,用n表示,可以写出如下式子(3-28),(3-29)所示:

 

 

 

 


3-28

 

 

 

 

 

 

 

 

 

 

 


                                                                3-29

 

 

 

 

 

令式子(3-30)如下:

 

 


                                                                3-30

 

 

 

 

 

则上式式子(3-29)可写成如下更简明的形式如下式(3-31)所示:

 

 

 

 


                                                                3-31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


3.12 分裂基第一次分解L形流图

 

(a)             (b)

3.13 分裂基FFT算法L形排列示意图与结构示意图

3.13(a)是分裂基FFT算法L形排列示意图,图3.13(b)分裂基FFT算法运算流图结构示意图。

 


4 FFTIFFT算法的C程序实现

4.1时间抽取基2FFTIFFT算法的C程序实现

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define N 1000

/*定义复数类型*/

typedef struct{

 double real;

 double img;

}complex;

 

complex x[N], *W;                                      /*输入序列,变换核*/

int size_x=0;                                          /*输入序列的大小*/

double PI;                                             /*圆周率*/

int main(){

 int i,method;

 void fft();                                          /*快速傅里叶变换*/

 void ifft();

 void initW();                                        /*初始化变换核*/

 void change();                                       /*变址*/

 void add(complex ,complex ,complex *);               /*复数加法*/

 void mul(complex ,complex ,complex *);               /*复数乘法*/

 void sub(complex ,complex ,complex *);               /*复数减法*/

 void divi(complex ,complex ,complex *);              /*复数除法*/

 void output();                                       /*输出结果*/

 system("cls");

 PI=atan(1)*4;

 printf("Please input the size of x:\n");

 scanf("%d",&size_x);

 printf("Please input the data in x[N]:\n");

 for(i=0;i<size_x;i++)

  scanf("%lf%lf",&x[i].real,&x[i].img);

 initW();

 printf("Use FFT(0) or IFFT(1)?\n");

 scanf("%d",&method);

 if(method==0)

  fft();

 else

  ifft();

 output();

 return 0;

}

/*快速傅立叶变换*/

void fft()                                           /*快速傅立叶变换*/

{

 int i=0,j=0,k=0,l=0;

 complex up,down,product;                            /*输入序列,变换核*/

 change();

 for(i=0;i< log(size_x)/log(2) ;i++)                 /*一级蝶形运算*/

  l=1<<i;

  for(j=0;j<size_x;j+= 2*l )                         /*一组蝶形运算*/

{           

   for(k=0;k<l;k++)                               /*一个蝶形运算*/

{      

     mul(x[j+k+l],W[size_x*k/2/l],&product);

     add(x[j+k],product,&up);

     sub(x[j+k],product,&down);

     x[j+k]=up;

     x[j+k+l]=down;

   }

  }

 }

}

/*快速傅叶逆变换*/

void ifft()                                        /*快速傅叶逆变换*/

{

 int i=0,j=0,k=0,l=size_x;

 complex up,down;

 for(i=0;i< (int)( log(size_x)/log(2) );i++)       /*一级蝶形运算*/

{

  l/=2;

  for(j=0;j<size_x;j+= 2*l )                       /*一组蝶形运算*/

{

   for(k=0;k<l;k++)                                /*一个蝶形运算*/

{

    add(x[j+k],x[j+k+l],&up);

    up.real/=2;up.img/=2;

    sub(x[j+k],x[j+k+l],&down);

    down.real/=2;down.img/=2;

    divi(down,W[size_x*k/2/l],&down);

    x[j+k]=up;

    x[j+k+l]=down;

   }

  }

 }

 change();

}

4.2 FFTIFFT的输出结果

/*输出傅立叶变换的结果*/
void output()                                      
/*输出结果*/

{

     int i;

     printf("the result are as follows\n");

     for(i=0;i<size_x;i++)

{

           printf("%.4f",x.real);

           if(x.img>=0.0001)printf("+%.4fj\n",x.img);

           else if(fabs(x.img)<0.0001)printf("\n");

           else printf("%.4fj\n",x.img);

    }

}

void add(complex a,complex b,complex *c)       /*复数加法*/

{

   c->real=a.real+b.real;

c->img=a.img+b.img;

 }

void mul(complex a,complex b,complex *c)         /*复数乘法*/

{

 c->real=a.real*b.real - a.img*b.img;

 c->img=a.real*b.img + a.img*b.real;

 }

void sub(complex a,complex b,complex *c)       /*复数减法*/

{

     c->real=a.real-b.real;
     c->img=a.img-b.img;
}

void divi(complex a,complex b,complex *c)        /*复数除法*/

{

     c->real=( a.real*b.real+a.img*b.img )/( b.real*b.real+b.img*b.img);

     c->img=( a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img);

 }

please input the size of x:

4

please input the data in x[n]:

1 0

0 2

3 0

0 4

use ifft(1)?

1

the result are as follows

4.0000+6.0000j

-4.0000

4.0000-6.0000j


4.3 C程序实现FFTIFFT另一种算法

/*数组x存储时域序列的实部,数组y存储时域序列的虚部*/

/*n代表NFFTsign=1FFTsign=-1IFFT*/

void FFT(double x[],double y[],int n,int sign)

{

int i,j,k,l,m,n1,n2;

double c,c1,e,s,s1,t,tr,ti;

 

/*Calculate i = log2N*/

for(j = 1,i = 1; i<16; i++)

{

     m = i;

     j = 2*j;

     if(j == n)

         break;

}

 

/*计算每一级的输出,l为某一级,i为同一级的不同群,使用同一内存(即原位运算),将FFTIFFT流图作出来将看的很清晰。*/

n1 = 1;

for(l=1; l<=m; l++)

{

    n1 = 2*n1;    n2 = n1/2;    e = 3.1415926/n2;    c = 1.0;    s = 0.0;

    c1 = cos(e);

    s1 = -sign*sin(e);

    for(j=0; j<n2; j++)

    {

        for(i=j; i<n; i+=n1)        

        {

            k = i + n2;

            tr = c*x[k] - s*y[k];

            ti = c*y[k] + s*x[k];

            x[k] = x[i] - tr;

            y[k] = y[i] - ti;

            x[i] = x[i] + tr;

            y[i] = y[i] + ti;       

        }

        t = c;

        c = c*c1 - s*s1;

        s = t*s1 + s*c1;

    }

}

/*如果是求IFFT,再除以N*/

if(sign == -1)

{

for(i=0; i<n; i++)

{

   x[i] /= n;

   y[i] /= n;

}

}

}

int main()

{

double x[8] = {1,2,3,4,5,6,7,8};

double y[8] = {0};

int i;

for(i=0; i<8; i++)

printf("%d %f %f\n",i,x[i],y[i]);

FFT(x,y,8,1);

for(i=0; i<8; i++)

printf("%d %f %f\n",i,x[i],y[i]);

FFT(x,y,8,-1);                                                   

for(i=0; i<8; i++)

printf("%d %f %f\n",i,x[i],y[i]);

return 1;

 

4.1 录入程序

4.2 程序运算结果

上图4.2所示结果,实现了蝶形运算每一级的输出的运算,改更加直观的展现了FFTIFFT的运行结果,一目了然。

 

4.4 DSPFFT算法的C程序实现

1ICETEK-F2812-A的实验板的介绍

4.3 ICETEK-F2812-A实验板

2、实验目的

1.熟悉FFT快速傅叶特性

2.掌握FFT快速傅叶的原理和方法

3.通过C程序编译实现FFT中的算法

3ICETEK-F2812-A的实验板调试步骤

1.实验准备

(1)连接实验设备:

(2)准备信号源进行AD 输入。

取出2 根实验箱附带的信号线

1 根信号线连接实验箱底板上信号源I模块(4.4中单实线框中部分)波形输出插座(4.4中的3 4)和“A/D 输入”模块(4.4中虚线框中部分)的“ADCIN0”插座(4.4 中的A),注意插头要插牢、到底。这样,信号源I的输出波形即可送到ICETEK-F2812-A评估板的AD 输入通道0

1 根信号线连接实验箱底板上信号源II模块(4.4中双实线框中部分)的“波形输出”插座(4.4 中的cd)和“A/D 输入”模块的“ADCIN1”插座(4.4中的B),注意插头要插牢、到底。这样,信号源II的输出波形即可送到ICETEK-F2812-A评估板的AD 输入通道1

             

4.4 实验设备

设置信号源I -调整拨动开关频率选择(4.4 中的5)拨到“100Hz1KHz”档(4.410)-将“频率微调”(4.4 中的6)顺时针调到头(最大)。调整拨动开关“波形选择”(4.4中的7)拨到“三角波”档(4.4 中的11)。将“幅值微调”(图4.4中的8)顺时针调到头(最大)。

设置信号源II -调整拨动开关“频率选择”(4.4 中的e)拨到“100Hz1KHz”档(图4.4 中的j)。将“频率微调”(图4.4 中的f)顺时针调到头(最大)。-调整拨动开关“波形选择”(图4.4中的g)拨到“正弦波”档(图10-1 中的k)。-将“幅值微调”(图4.4 中的h)顺时针调到头(最大)。

将两个信号源的电源开关(4.4 中的2b)拨到的位置。

2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行。

3.启动Code Composer Studio 2.21。选择菜单DebugReset CPU4.打开工程文件工程目录:C:\ICETEK-F2812-A-EDUlab\DSP281x_examples\Lab0305AD\ ADC.pjt。在项目浏览器中,双击adc.c,打开adc.c 文件,浏览该文件的内容,理解各语句作用。

5.编译、下载程序。

6.打开观察窗口选择菜单“View”、“ Graph”、“ Time/Frequency”做如下设置,然后单击OK按钮;

选择菜单“View”、“ Graph”、“ Time/Frequency”做如下设置(4.4),然后单击OK按钮;在弹出的图形窗口中单击鼠标右键,选择Clear Display。通过设置,我们打开了两个图形窗口观察两个通道模数转换的结果。

7. 设置信号源由于模数输入信号未经任何转换就进入DSP,所以必须保证输入的模拟信号的幅度在0-3V之间。必须用示波器检测信号范围,保证最小值0V最大值3 V,否则容易损坏DSP芯片的模数采集模块。

8.运行程序观察结果

单击“Debug”菜单,“Run”项,运行程序;

停止运行,观察“ADCIN0”“ ADCIN1”、窗口中的图形显示;

适当改变信号源,按F5 健再次运行,停止后观察图形窗口中的显示。注意:输入信号的频率不能大于10KHz,否则会引起混叠失真,而无法观察到波形,如果有兴趣,可以试着做一下,观察采样失真后的图形。

9.选择菜单Fileworkspacesave workspacs As,输入文件名SY.wks

10.退出CCS

程序录入:

/*****************fft programe*********************/

#include "typedef.h"

#include "math.h"

struct compx EE(struct compx b1,struct compx b2)

 {

    struct compx b3 ;

    b3.real=b1.real*b2.real-b1.imag*b2.imag ;

    b3.imag=b1.real*b2.imag+b1.imag*b2.real ;

    return(b3);

 }

void FFT(struct compx*xin,int N)

 {

    int f,m,nv2,nm1,i,k,j=1,l ;

    /*int f,m,nv2,nm1,i,k,j=N/2,l;*/

    struct compx v,w,t ;

    nv2=N/2 ;

    f=N ;

    for(m=1;(f=f/2)!=1;m++)

    {

       nm1=N-1 ;

    }

        /*变址运算*/

for(i=1;i<=nm1;i++)

    {

        if(i<j)

        {

            t=xin[j];

            xin[j]=xin[i];

            xin[i]=t ;

        }
        k=nv2 ;

        while(k<j)

        {

            j=j-k ;

            k=k/2 ;

        }

        j=j+k ;

    }

   

    {

        int le,lei,ip ;

        float pi ;

        for(l=1;l<=m;l++)

        {

            le=pow(2,l);

            // 这里用的是L而不是1//

            lei=le/2 ;

            pi=3.14159 ;

            v.real=1.0 ;

            v.imag=0.0 ;

            w.real=cos(pi/lei);

            w.imag=-sin(pi/lei);

            for(j=1;j<=lei;j++)

            {

                /*double p=pow(2,m-l)*j;

                  double ps=2*pi/N*p;

                  w.real=cos(ps);

                  w.imag=-sin(ps);*/

                for(i=j;i<=N;i=i+le)

                {
                    /*  w.real=cos(ps);

                      w.imag=-sin(ps);*/

                    ip=i+lei ;

                    t=EE(xin[ip],v);

                    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 ;

                }

                v=EE(v,w);

            }

        }

    }

    return ;

 }

/*****************main programe********************/

#include<math.h>

#include<stdio.h>

#include<stdlib.h>

#include "typedef.h"

float result[257];

 struct compx s[257];

 int Num=256 ;

 const float pp=3.14159 ;

main()

{

    int i=1 ;

for(;i<0x101;i++)

    {

        s[i].real=sin(pp*i/32);

        s[i].imag=0 ;

    }

   

FFT(s,Num);

for(i=1;i<0x101;i++)

    {

result[i]=sqrt(pow(s[i].real,2)+pow(s[i].imag,2));

    }

}

 

4DSP板调试结果之波形及波形分析

DSP板有多种调试方法,下面使用的一种为观测其示波器波形的方法,通过波形,我们可以看出此板子的性能。使用通用定时器Timer1/2/3/4产生PWM,选择连续计数模式可以产生如下图所示的非对称PWM波形选择连续增/减计数模式可以产生中心或对称PWM波形如下:

http://www.hellodsp.com/bbs/futu/c2000/pwm/3.JPG

                                            4.5PWM波形

同样,采用连续增计数模式可以产生一对带有死区的互补的非对称PWM波形

                                     4.6 非对称PWM波形

采用连续增/减计数模式可以产生一对带有死区的互补的对称PWM波形

4.7互补的对称PWM波形

http://www.hellodsp.com/bbs/futu/c2000/pwm/6.JPG

4.8互补的对称PWM波形

实现的方法如下:

1)采用通用定时器Timer1Timer2产生两路PWM波形;

2)为了产生对称波形,使两个定时器都工作于连续增/减计数模式;

3 从上图可以看出,S1的上升延和S2的上升延始终相差半个Ts,及半个周期,为了实现相移,可以让T1先开始计时工作,当T1到达第一个周期中断的时候打开T2,让T2也开始工作,同时需要去使能T1中断,或者通过置标志位等方法使得以后T1周期中断的时候不会再去打开T2定时器。这样就可以使的T1T2输出的波形满足上图的要求,即既是互补,又是导通时间对称的PWM波形,只要占空比不足50%,就相当于留有一段死区时间。可以参看下面的示意图4.9所示。

         

                               4.9 波形图


5 结论

5.1工作总结

通过本次论文设计的学习,可使我掌握有关快速傅立叶变换与快速傅立叶反变换的基本概念、基础理论极其典型的算法通过C程序语言实现。通过该系列实验教学与实践,深入的了解了按时间抽选的基2FFT算法、按频率抽选的基2FFT算法、离散IFFT的快速计算方法、分裂基FFT算法、并分析算法的物理意义;了解快速傅立叶变换的基本原理、VC6.0软件编程环境及构成DSP的典型的应用,为将来的研究和应用打下良好的基础。通过自己对VC6.0FFT算法的实现的流程有了比较深刻的体会,同时也了解了一般软件设计的过程。在设计过程中碰到了很多的问题,通过这些问题,使自己分的析问题和解决问题的能力得到了较大的提高。

5.2技术展望

FFT/IFFT是时域信号与频域信号之间转换的基本运算,是数字信号处理的核心工具之一,因此,它广泛地应用于许多领域。在数字化的今天,对数字信号处理的速度、精度和实时性要求不断提高。当今,FFT算法在国外的发展已经相当成熟。在数字信号处理方面,国外的FFT算法处于领先地位,尤其是DSP芯片。目前,FFT算法通过C程序的实现为国际上的很多领域的发展提供了便利,也为其他领域的相关发展提供了应用基础。由于国际上的芯片处理技术的飞速发展,使得应用VC++6.0操作环境,大大提高了数字信号处理应用系统关于FFT算法的可操作性和可靠性。这项工作对于实时数字信号应用系统的处理具有举足轻重作用。


致谢

感谢导师杨亚东教授的关心、指导和教诲。杨亚东教授追求真理、献身科学、严以律己、宽已待人的崇高品质对学生将是永远的鞭策。

作者在攻读学士学位期间的工作自始至终都是在杨亚东教授全面、具体的指导下进行的。杨老师渊博的学识、敏锐的思维、民主而严谨的作风,使学生收益匪浅,终生难忘。

感谢薛凯老师在课题研究中所给予的帮助。

感谢实验室的田杰老师老师的关心和帮助。

感谢我的学友和朋友们对我的关心和帮助。


参考文献

[1] 方艳梅等编,数字信号处理(第四版)[M],电子工业出版社,2005

[2] 张贤达编,现代信号处理(第二版)[M],清华大学出版社,1994

[3] 周利清编,数字信号处理基础,(第二版)[M],北京邮电大学出版社,2001

[4] 胡学龙等编,数字信号处理教学指导(第四版)[M],高等教育出版社,2004

[5] 张强远等编,快速傅叶变换和卷积算法[M],上海科学技术文献出版社,1999

[6] Rabbani M Jones P W.Digital Image Compression Techniques[M].Washington:SPIE Optical Engineering Press.2005.

[7] 蒋勇等编,快速傅叶变换及其C程序(第五版)[M],中国科技大学出版社,2004

[8] 冷建华编,叶变换[M],清华大学出版社,2004

[9] 沈乃汉编,快速傅叶变换及沃尔什变换(第五版)[M]航空工业出版社,2004

[10] 吴林峰编,一种实序列FFT新算法与C语言实现(第三版)[M],四川大学出版社,2004

[11] 蒋勇编,快速傅叶变换及C程序(第三版)[M],中国科技大学出版社,2004

[12] 潘德嘉编,快速傅叶变换(第三版)[M]水利部条件勘测设计院研究院,2009

[13] Rabbani M Jones P WD.J.Digital Image Compression Techniques[M].Washington:SPIE Optical Engineering Press.2000.

[14] 高西全等编,数字信号处理(第三版)[M],西安电子科技大学出版社,2008

[15] 程佩青编,数字信号处理教程(第三版)[M],清华大学出版社,2008


Implementation of FFT and IFFT algorithm with C Language

1.Developing of FFT

Finite sequence of discrete Fourier transform by (DFT) will be separated into its frequency domain are finite sequences. But its calculation is too big, difficult to deal with the problem in real time, it leads to a fast Fourier transform (FFT). In 1965, Cooley and Tukey proposed calculation of discrete Fourier transform (DFT) of the fast algorithm, the DFT computation to reduce the number of orders of magnitude. Since then, the fast Fourier transform (FFT) algorithm will continue in-depth, digital signal processing with this emerging disciplines, with the FFT and the emergence and development of rapid development. Based on the sequence of decomposition and the different selection methods produced a variety of FFT algorithms, the basic algorithm is based 2DIT and base 2DIF. FFT in the Fourier inverse transform, linear convolution and linear correlation also has important applications.
Fast Fourier Transform (FFT), discrete Fourier Transform Algorithm, which is the discrete Fourier transform of the odd and even, true, real and other properties, on the discrete Fourier transform algorithm was modified to obtain. Fourier transform theory it is not a new discovery, but for the computer systems or digital systems using discrete Fourier transform, can be said that a big step into.
Fourier transform is a kind of digital signal processing algorithm is very important. Fourier transform algorithm to know the meaning, we must first understand the meaning of Fourier theory. Fourier theory shows that: any continuous measurement of the timing or signal, can be expressed as a sine wave signals of different frequencies superimposed unlimited. Established under the principle of direct measurement using Fourier transform algorithm to the original signal to additive approach to calculating the signal sine wave signals of different frequency, amplitude and phase. And the corresponding Fourier transform algorithm is anti-Fourier transform algorithm. The inverse transform in essence is also a cumulative treatment, so that you can change the individual sine wave signals into a signal.
Therefore, we can say, Fourier transform, difficult to deal with the original time domain signal is converted into easy-to-frequency domain signal analysis (frequency spectrum), can use some tools to deal with these frequency domain signal processing. Finally, can use the Fourier frequency domain inverse transform of these signals into time domain signal.
From the perspective of modern mathematics, the Fourier transform is a special integral transform. It will meet some conditions expressed as a function of a linear combination of sinusoidal basis functions or integration. In different fields of study, Fourier transform has many different variations, such as the continuous Fourier transform and discrete Fourier transform.C language to provide software support, FFT and IFFT can be implemented by C language.

2.Use

1.convolution
Convolution is a filtering on the signal response network terminology, that is used to describe the filter in the convolution integral function of the impact of the signal response. If x (t) for the signal, h (t) response, the convolution integral representation are as follows:
h (t) • x (t) = ∫ x (τ) h (t-τ) dτ, range: - ~ +
Each convolution is the signal function with the reverse and post-translational product of the network function in the region.

Related
Relevant for small-signal noise detection method. If there is a known signal and noise wave correlation, can be detected with this method, a non-zero result that found a correlation between the results more obvious, the greater the relevance. And the convolution integral in the form similar to the following:
z (t) = ∫ x (τ) h (t + τ) dt, range: - ~ +
Autocorrelation is used to describe a signal associated with the extent of its own, its value is the signal of the PSD, the power spectral density.
2, filter
This is probably the most widely used FFT, and it allows the frequency components of the wave filter becomes very simple. For example, after FFT of the sampled signal, get rid of unwanted frequency components, further FFT inverse transform, we get the filtered desired signal.
3, signal analysis
Power monitoring systems such as harmonic analysis, we need the sampling data FFT computation, and then through the LCD screen or other man-machine interface to re-painting them, to facilitate the technical personnel in the quality of electricity.
Summary:
Fourier transform in the current related electronic products used very widely, it can be said, it is to describe the function in another language. Masterd Fourier transform,lean to air space and frequency domain while thinking, often allows us to use simple methods to solve complex problems.

3.FFT results of the physical meaning
    FFT is the Discrete Fourier Transform Algorithm, can be a signal into the frequency domain. Some of the signal in time domain is difficult to see what features, but if, after transformed into the frequency domain, it is easy to see the features of the. This is a lot of signal analysis by FFT transform reasons. In addition, FFT spectrum of a signal can be extracted, which in the spectrum analysis is often used.
    While many people know what FFT can be used to do, how to do it, but do not know the result of FFT is even after the meaning, how to decide how many points do you want to use FFT.
   An analog signal, after sampling ADC, the digital signal becomes. Sampling theorem tells us that the sampling frequency is greater than twice the signal frequency, which I was not in this wordy.
    Sampled digital signal, you can do FFT transformed. N sampling points, after FFT, you can get N-point FFT results. In order to facilitate the FFT computation, usually take two integer N th power.
    Suppose the sampling frequency is Fs, the signal frequency F, the sampling points for the N. So after the results of FFT is a complex for the N point. Each point corresponds to a frequency point on. Modulus of this point is the frequency range of properties under value. Specific range of the original signal with a relationship? Suppose the original signal's peak as A, then the FFT results of each point (except the first point outside the DC component) of the modulus value is A, N / 2 times. The first point is the DC component, and its modulus is the DC component of the N-fold. Each point of the phase, that is, the frequency of the signal phase. The first point that DC component (ie, 0Hz), and the last point of N, then the next point (in fact this point does not exist, here is the assumption that the first N +1 points, can be seen as the first point divided to two and a half hours, the other half moved to the last) is that the sampling frequency Fs, the middle of which is N-1-point average is divided into N equal parts, each point in turn increases the frequency. Such a point expressed by the frequency n:. As can be seen from the above formula, Fn can tell the frequency of Fs / N, if the sampling frequency Fs is 1024Hz, the sampling points to 1024 points, you can tell to 1Hz. 1024Hz sampling rate of 1024 sample points, just 1 second, meaning that the signal sampling time of 1 second and do FFT, the result can be analyzed to 1Hz, if the signal sampling time of 2 seconds and do FFT, the result can be analyzed to 0.5Hz. If you want to improve the frequency resolution, you must increase the sampling points, ie sampling time. Frequency resolution and sampling time are reciprocal relations. After assuming a point FFT with n said complex a + bi, then the plural of the model is that phase is. Based on the above results, we can calculate the n points (n ≠ 1, and n <= N / 2) corresponding to the signal expression is: that. For n = 1 point signal is DC component, amplitude shall be A1 / N. As the FFT result of symmetry, usually we only use the first part of the results, that is, the result is less than half the sampling frequency.

4. Summary

 Summary: Suppose the sampling frequency is Fs, the sampling points for the N, after doing FFT, a point n (n starting from 1) that the frequency is: Fn = (n-1) * Fs / N; that point divided by the modulus value N / 2 is the frequency of the signal should be the rate (for direct current signal is divided by N); the point should be the phase that is the phase of the signal frequency. Calculation of the phase function can be used atan2 (b, a) calculations. atan2 (b, a) is the pursuit of coordinates (a, b) point the angle values ranging from-pi to pi. To be accurate to xHz, you need to sample length of 1 / x seconds of the signal, and do FFT. To improve the frequency resolution, we need to increase the sampling points, which in some practical applications, is unrealistic in the short time needed to complete the analysis. Methods to solve this problem frequency subdivision, relatively simple method is to sample relatively short Xin Hao, and then refill a certain amount of 0 in the back, so 长度 level that requires the number of points, do FFT, which to some extent Nenggou improve the frequency resolution.

 

 

 

 

 

 

 

FFT算法的C程序实现

1FFT的发展

有限长序列可以通过离散傅立叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速算法傅立叶变换(FFT). 1965年,CooleyTukey提出了计算离散傅立叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。从此,对快速傅立叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIFFFT在离散傅立叶反变换、线性卷积和线性相关等方面也有重要应用。

快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。

因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。

从现代数学的眼光来看,傅立叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。C语言为其提供软件支持,FFTIFFT均可通过C语言来实现。

2.运用

1.卷积

卷积是滤波网络对信号响应的术语,即用卷积积分来描述滤波网络对冲击函数信号的反应。若x(t)为信号,h(t)为响应,则卷积积分表示如下:

h(t)·x(t) = ∫x(τ)h(t-τ)dτ, 区间:-∽+∽

每一个卷积点是信号函数与反转和平移后的网络函数的乘积中的区域。

相关

 

相关是用于小信号噪声检测的一种方法。如果有已知信号与一个噪声波形相关,用这个方法可以检测出来,有非零的结果表示发现了相关性,结果越明显,相关性越大。其在形式上与卷积积分相似,如下:
                z(t) = ∫x(τ)h(t+τ)dt, 区间:-∽+∽

自相关是用来描述一个信号与它自己的相关程度,其值为信号的PSD,即功率谱密度。

2.滤波

这可能是FFT最广泛的应用了,它使对波形的频率分量滤波变得十分简单。比如对采样信号进行FFT后,干掉不需要的频率分量,再进行FFT反变换,就得到滤波后的期望信号。

3.信号分析

比如电力监控系统的谐波分析,就需要对采样数据进行FFT运算,然后通过液晶屏或其它人机界面重新绘画出来,以方便技术人员掌握电力的质量。

小结:

傅立叶变换在目前的相关电子产品中用得非常广泛,可以说,它是描述函数的另一种语言。掌握傅立叶变换,学会在空域和频域中同时思考问题,很多时候可以让我们使用简单的方法来解决复杂的问题。

3.FFT结果的物理意义

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

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

   一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。

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

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

4. 总结

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


 

 


(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容