文档库 最新最全的文档下载
当前位置:文档库 › 基于dsp的快速傅里叶变换程序设计

基于dsp的快速傅里叶变换程序设计

基于dsp的快速傅里叶变换程序设计
基于dsp的快速傅里叶变换程序设计

课程设计

设计题目:快速傅里叶变换程序设计

系别:自控系

班级:测控本091班

学号: 2009308120

学生姓名:刘礼旭

指导教师:吕勇军

职称:教授

起止日期:2012 年 7 月 2 日起——2012年7月6日止

沈阳工程学院

课程设计任务书

课程设计题目:快速傅里叶变换程序设计

系别自控系班级测控本091班

学生姓名刘礼旭学号 2009308120 指导教师吕勇军职称教授

课程设计进行地点:实训F430 任务下达时间: 12年 7月2日

起止日期: 12年7月2日起——至12年7月6日止教研室主任吕勇军 2012年 7月 2 日批准

快速傅里叶变换程序设计

1.设计主要内容及要求;

要求:1)掌握DSP A/D转换器使用方法。

2)研究FFT原理以及利用DSP实现的方法。

3)编写A/D采样和FFT程序,调试,观察结果。

2.对设计论文撰写内容、格式、字数的要求;

(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。

(2).学生应撰写的内容为:中文摘要和关键词、目录、正文、参考文献等。课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。应做到文理通顺,内容正确完整,书写工整,装订整齐。

(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。

(4). 课程设计论文装订顺序为:封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。

3.时间进度安排;

顺序阶段日期计划完成内容备注

1 7月2日教师讲解题目,学生查阅相关资料

2 7月3日确定FFT算法以及程序流程

3 7月4日编写程序

4 7月5日调试程序

5 7月6日撰写论文,程序验收

沈阳工程学院

DSP技术课程设计成绩评定表系(部):自控系班级:测控本091班学生姓名:刘礼旭

指导教师评审意见

评价内容具体要求权重评分

加权

调研论证能独立查阅文献,收集资料;能制定

课程设计方案和日程安排。

0.1 5 4 3 2

工作能力态度工作态度认真,遵守纪律,出勤情况

是否良好,能够独立完成设计工作。

0.2 5432

工作量按期圆满完成规定的设计任务,工作

量饱满,难度适宜。

0.2 5432

说明书的质量说明书立论正确,论述充分,结论严

谨合理,文字通顺,技术用语准确,

符号统一,编号齐全,图表完备,书

写工整规范。

0.5 5432

指导教师评审成绩

(加权分合计乘以12)

分加权分合计

指导教师签名:年月日

评阅教师评审意见

评价内容具体要求权重评分

加权

查阅文献查阅文献有一定广泛性;有综合归纳

资料的能力。

0.25432

工作

工作量饱满,难度适中。0.55432

说明书的质量说明书立论正确,论述充分,结论严

谨合理,文字通顺,技术用语准确,

符号统一,编号齐全,图表完备,书

写工整规范。

0.35432

评阅教师评审成绩

(加权分合计乘以8)

分加权分合计

评阅教师签名:年月日课程设计总评成绩分

摘要

数字信号处理 (Digital Signal Processing,DSP)是一门应用十分广泛的学科。数字信号处理是指利用计算机技术,以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。数字信号处理器也称为DSP芯片,是一种用于进行数字信号处理运算的微处理器,其主要功能是实时快速地实现各种数字信号处理算法及各种复杂控制算法。

TMS320C2000系列DSP集微控制器和高性能DSP的特点于一身,具有强大的控制和信号处理能力,能够实现复杂的控制算法。TMS320C2000系列DSP片上整合了Flash存储器、快速的A/D转换器、增强的CAN模块、事件管理器、正交编码电路接口、多通道缓冲串口等外设,此种整合使用户能够以很便宜的价格开发高性能数字控制系统。

傅立叶变换是一种将信号从时域变换到频域的变换方式,是声学、语音、电信和信号处理等领域中一种重要的分析工具。离散傅里叶变换(DFT)是连续傅里叶变换在离散系统中的表现形式,但由于DFT的计算量很大,因此在很长一段时间内其应用受到很大的限制。快速傅里叶变换(FFT)是离散傅里叶变换的一种高效运算方法。FFT使DFT的运算大大化简,运算时间一般可以缩短1至2个数量级,FFT的出现大大提高了DFT的运算速度,从而使DFT得到广泛的应用。

快速傅里叶变换(Fast Fourier Transform)是实现离散傅里叶变换(DFT)的一种快速高效的运算方法,是数字信号处理中最为重要的工具之一。它使DFT的运算效率提高1~2个数量级,为数字信号处理技术应用于各种高速信号的实时处理创造了良好的条件,从而大大推动了数字信号处理技术的发展。

关键词DSP;微处理器;离散傅里叶变换(DFT);FFT

目录

课程设计任务书...................................................... I DSP技术课程设计成绩评定表................................... III 摘要............................................................... IV 1 设计任务描述 (1)

1.1设计题目 (1)

1.2设计主要内容及要求 (1)

1.2.1设计目的 (1)

1.2.2基本要求 (1)

1.2.3发挥部分 (1)

2 设计思路 (2)

2.1 功能实现 (3)

2.1.1 位置倒码 (3)

2.1.2 蝶距 (3)

2.1.3 旋转因子 (4)

3 设计流程图 (5)

4 各部分程序设计及参数计算 (6)

4.1 驱动程序的配置 (6)

4.2 程序的初始化 (8)

4.3 主程序 (8)

4.4 旋转因子的软件实现 (10)

4.5 FFT初始化 (10)

4.6 按时间抽取法的FFT程序 (11)

4.7 功率谱的计算实现 (12)

4.8 倒序运算函数 (12)

4.9 定时器2中断子程序及AD转换子程序 (13)

5 工作过程分析 (15)

5.1 程序调试 (15)

5.1.1 在CCS下调试程序步骤 (15)

5.1.2 输入信号时域波形 (15)

5.1.3 输出信号功率谱 (16)

5.2 功率谱的计算 (18)

6实验系统介绍 (19)

6.1 SEED-DTK2812 的原理框图 (19)

6.2 实验箱整体配置 (19)

6.3 实验箱特点 (20)

小结 (21)

致谢 (22)

参考文献 (23)

附录1 源程序清单 (24)

附录2 程序运行图 (28)

1 设计任务描述

1.1设计题目

快速傅里叶变换程序设计。

1.2设计主要内容及要求

1.2.1设计目的

(1)掌握DSP芯片的使用方法。

(2)根据FFT的原理确定其程序流程。

(3)学习用FFT对连续信号和时域信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确运用。

1.2.2基本要求

(1)研究FFT原理以及利用DSP实现的方法。

(2)编写FFT程序。

(3)调试程序,观察结果。

1.2.3发挥部分

用AD采集信号,可以对多种信号进行FFT变换。

2 设计思路

在进行设计程序之前首先要弄清楚快速傅里叶变换(FFT )的变换原理,然后根据快速傅里叶变换的方法,编写相对应的程序来实现其功能。所以快速傅里叶变换算法的原理和实现成为了整个设计的核心部分。

傅立叶变换是一种将信号从时域到频域的变换形式,是声学、语音、电信和信号处理等领域中的一种重要分析工具。离散傅立叶变换(DFT )是连续傅立叶变换在离散系统中的表现形式,由于DFT 的计算量很大,因此在很长时间内其应用受到很大的限制。快速傅立叶变换(FFT )是离散傅立叶变换的一种高效运算方法。FFT 使DFT 的运算大大简化,运算时间一般可以缩短一至两个数量级,FFT 的出现大大提高了DFT 的运算速度,从而使DFT 在实际应用中得到广泛的应用。在数字信号处理系统中,FFT 作为一个非常重要的工具经常使用,它甚至成为DSP 运算能力的一个考核因素。

对于有限长离散数字信号{x[n]},0≦n ≦N-1,其离散谱{x[k]}可以由离散付氏变换(DFT ) 求得。DFT 的定义为

1

,1,0,][)(1

)2(

-==

-=-N k e

n x k X N n nk

N

j π

可以方便的把它改写为如下形式:

1,1,0,][)(1

-==

∑-=N k W

n x k X N n nk N

即N j N e W /22π-=称为蝶形因子式旋转因子。 对于旋转因子N W 来说,有如下的对称性和周期性: 对称性:2/N k N k N W W +-= 周期性:N k N k N W W +=

FFT 就是利用了旋转因子的对称性和周期性来减少运算量的。

FFT 算法将长序列的DFT 分解为短序列的DFT 。N 点的DFT 先分解为两个N/2 点的DFT ,每个N/2 点的DFT 又分解为两个N/4 点的DFT 等等,最小变换的点数即基数,基数为2 的FFT 算法的最小变换是2 点DFT 。

一般而言,FFT 算法分为时间抽选(DIT )FFT 和频率抽选(DIF )FFT 两大类。时间抽取FFT 算法的特点是每一级处理都是在时域里把输入序列依次按奇/偶一分为二分解成较短的序列;频率抽取FFT 算法的特点是在频域里把序列依次按奇/偶一分为二分解成较短的序列来计算。

DIT 和DIF 两种FFT 算法的区别是旋转因子k N W 出现的位置不同,,(DIT )FFT 中旋转因子k N W 在输入端,(DIF )FFT 中旋转因子k N W 在输出端,除此之外,两种算法是一样的。在本设计中实现的是基2 的时间抽取FFT 算法,具体的实现过程可参见源程序及其注释。

首先定义N=128,当然也可以更改程序,将N 值改为256或1024等等,前提是相应的数组大小也得更改。然后用模数转换器采集信号(正弦信号,方波信号等等),最后将采集到的信号进行FFT 变换即可。

2.1 功能实现

2.1.1 位置倒码

当进行原位运算时,发现当运算完成后,FFT 的输出X(k)按正常顺序排列

在存储单元中,即按X(0),X(1),…,X(7)的顺序排列,但是这时输入x(n)却不是按自然顺序存储的,而是按x(0),x(4), …, x(7)的顺序存入存储单元,看起来好像是“混乱无序”的,实际上是有规律的,称之为倒位序。

当用二进制表示顺序时,它正好是“位码倒置”的顺序。例如,原来的自然顺序应是x(1)的地方,现在放着x(4),用二进制码表示这一规律时,则是在x(0 0 1)处放着x(1 0 0),x(0 1 1) 处放着x(1 1 0),即将自然循序的二进制码位倒置过来,第一位码变成最末位码,这样倒置以后的顺序正是输入所需要的顺序,其结果与按时间抽样算法FFT 流程图中的输入顺序是一致的。

需要注意当进行原位运算时,输入输出序列为倒位序的关系,若不为原位运算,则这种关系不一定成立。在实际运算中,一般直接将输入数据x(n)按码位倒置的顺序排好输入很不方便,总是先按自然顺序的存储,然后进行FFT 的原位计算。

表2-1 码位倒置顺序

自然顺序

二进码表示

码位倒置 倒位序 0 000 000 0 1 001 100 4 2 010 010 2 3 011 110 6 4 100 001 1 5 101 101 5 6 110 011 3 7

111

111

7

2.1.2 蝶距

设N=2L

,则整个运算流图中包含L 级蝶形运算,每一级则有N/2个蝶形单元。蝶距等于每个蝶形单元两个输入(出)节点的序列号,即第m 级蝶形单元的蝶距为:1

2

m -。

2.1.3 旋转因子

由FFT 算法原理过程可知,若N =2L ,则共有L 级蝶形运算,各级蝶形运算中旋转因子分别如下:第L 级的旋转因子为r N W (r =0,1,…,/21N -);第L -1级的旋转因子为/2r N W (r =0,1,…,2/21N -);…;第一级的旋转因子为1

/2L r N W -(r =0,1,…,/21L N -)。由此可见, 第m 级蝶形运算中旋转因子为/2

L M

r N W -,

r

=0,1,…,1/21L M N -+-。

3 设计流程图

开始

程序初始化

开中断

初始化ADC

等待中断发生

是否发生中

断?

AD采样

采样结束否?

将采集到的数据进行FFT变换

计算功率谱

图形输出

结束

4 各部分程序设计及参数计算

4.1 驱动程序的配置

1.双击桌面上的Setup CCStudio v3.3。“Clear”原有的设备驱动程序配置。

2.根据DSP的型号选择相应的TI原装驱动程序,根据DSP的型号选择相应的TI驱动程序,本实验箱采用SEED_DEC2812,故选择F2812 XDS510 Emulator。如4.1图所示。

图4.1 目标板选择

3.点中F2812 XDS510 Emulator驱动后,鼠标右键,在弹出的菜单中点击Properties。设置完成后如下图所示。

4.点击Next,作如下图所示的设置。

5.保存并启动CCS调试界面。

4.2 程序的初始化

#include "math.h"

#define PI 3.1415926

#define N 128 //采样次数

#include "DSP28_Device.h"

#include "comm.h"

interrupt void ISRTimer2(void); //声明定时器2中断子程序

interrupt void ad(void); //声明ad中断子程序

unsigned int Ad_data[128]={0};

unsigned int convcount = 0;

volatile unsigned int adconvover =0;

unsigned int i;

//void InitForFFT(void); //FFT初始化函数

void finv(int N1,float *xr,float *xi); //倒序运算函数,对输入序列倒序int INPUT[N],DATA[N];

float fWaveR[N],fWaveI[N],w[N];

float sin_tab[N],cos_tab[N]; //正余弦函数表

int Mum; //Mum为蝶形运算的级数

程序初始化部分的详细信息见上面所列程序。

4.3 主程序

void main(void)

{

for(i=0;i

{

sin_tab[i]=sin(PI*2*i/N);//建立正余弦函数表

cos_tab[i]=cos(PI*2*i/N);

}

/*初始化系统*/

InitSysCtrl();

/*关中断*/

DINT; //禁止可屏蔽中断

IER = 0x0000; //禁止CPU中断

IFR = 0x0000; //清CPU所有中断标志

/*初始化PIE中断*/

InitPieCtrl();

/*初始化PIE中断矢量表*/

InitPieVectTable();

//初始化cputimer

InitCpuTimers();

/*设置中断服务程序入口地址*/

EALLOW; // This is needed to write to EALLOW protected registers

PieVectTable.TINT2 = &ISRTimer2; //取ISRTimer2地址赋给中断 //向量TINT2(CPU-Timer2)PieVectTable.ADCINT = &ad; //取ad地址赋给中断向量ADCINT

EDIS; // This is needed to disable write to EALLOW protected //registers

/*开中断*/

IER |= M_INT1;//ADC中断,使能第一组中断!!

//已经定义"#define M_INT1 0x0001"

EINT; // Enable Global interrupt INTM

ERTM; // Enable Global realtime interrupt DBGM

adconvover=0;

DINT;

/*设置CPU*/

ConfigCpuTimer(&CpuTimer2, 150, 22);

StartCpuTimer2(); //已经定义 "#define StartCpuTimer2() //CpuTimer2Regs.TCR.bit.TSS = 0"

/*开中断*/

IER |= M_INT14; // 使能第14组中断(CPU定时器2(RTOS))!!

//已经定义"#define M_INT14 0x2000" ; IER是CPU中断使能寄存器EINT;

InitAdc();

for(;;){ //等待AD采样结束!!!

if (adconvover==1){ //adconvover==1表示AD采样 // 结束!!!见ad中断子程序

for(i=0;i<128;i++){

INPUT[i]=Ad_data[i];}

for(i=0;i

{

fWaveR[i]=INPUT[i];

fWaveI[i]=0.0;

w[i]=0.0;

}

Mum=(int)(0.5+log(N)/log(2)); //N=2^Mum

FFT(fWaveR,fWaveI);

for(i=0;i

}

adconvover=0; }

}

一般而言,编写一个能运行在操作系统上的程序,都需要一个主函数。主函数意味着建立一个独立进程,且该进程成为了程序的入口,对其它各

函数进行调用,当然其它被调用函数也可以再去调用更多函数,这样整个程序的运行轨迹就像一种栈,有时我们称之为调用栈。

主函数既是程序的入口,又是程序的出口。由于主函数肩负着入口和出口的重任,所以最好不要把太多的细节方面的逻辑直接放在主函数内,这样不利于维护和扩展。主函数应该尽量简洁,具体的实现细节应该封装到被调用的子函数里面去。

在这个主程序中,可以调用后续的FFT 初始化函数程序,时间抽取法FFT 程序,以及倒序运算函数程序,是整个程序的中转站。

4.4 旋转因子的软件实现

for(m=1;m<=Mum;m++) {

B=(int)(pow(2,m-1)+0.5); //B=2^(m-1)

for(j=0;j

for(k=j;k<=N-1;k+=(int)(pow(2,m)+0.5)) {

X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S];//采用循环寻址方式对正弦 Y=Xi[k+B]*cos_tab[S]-Xr[k+B]*sin_tab[S];//表和余弦表进行寻址 Xr[k+B]=Xr[k]-X; Xi[k+B]=Xi[k]-Y; Xr[k]=Xr[k]+X; Xi[k]=Xi[k]+Y; } } }

旋转因子是复数,可表示为:

2/cos(2/)sin(2/)k

j k N

N W e

k N j k N πππ-==- (4-1)

由式(4-1)可以看出旋转因子的实部为余弦函数,虚部为正弦函数。为了获得FFT 运算中需要的全部旋转因子,需要分别存储正弦表和余弦表,且每个表长度为N ,对应于0°~180°,同时,采用循环寻址方式对正弦表和余弦表进行寻址。

4.5 FFT 初始化

void InitForFFT() //FFT 初始化函数,建立正余弦函数表 {

int i;

for(i=0;i

{

sin_tab[i]=sin(PI*2*i/N);//建立正余弦函数表

cos_tab[i]=cos(PI*2*i/N);

}

}

为了获得FFT运算中需要的全部旋转因子,需要分别存储正弦表和余弦表,且每个表长度为N,对应于0°~180°。

4.6 按时间抽取法的FFT程序

void FFT(float Xr[N],float Xi[N]) //时间抽取法FFT程序,要求采样 //点数N为2的整数幂次方

{ //Xr[],Xi[]分别为输入序列的实 //部和虚部

int S,B; //S为旋转因子的幂数,B为蝶形运算输入数据的距离,也即各 //旋转因子的个数

int m,j,k;

float X,Y;

finv(N,Xr,Xi); //倒序运算函数,对输入序列倒序

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

{

B=(int)(pow(2,m-1)+0.5); //B=2^(m-1)

for(j=0;j

{S=j*(int)(pow(2,Mum-m)+0.5);

for(k=j;k<=N-1;k+=(int)(pow(2,m)+0.5))

{ //结果的实部和虚部分别存储在原实部和虚部位置

X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S];

Y=Xi[k+B]*cos_tab[S]-Xr[k+B]*sin_tab[S];

Xr[k+B]=Xr[k]-X;

Xi[k+B]=Xi[k]-Y;

Xr[k]=Xr[k]+X;

Xi[k]=Xi[k]+Y;

}

}

}

在这个时间抽取法FFT程序中,要求采样点数N为2的整数幂次方,每级需要进行B种蝶形运算,每种蝶形运算在某一级中需要进行N/pow(2,m)次蝶形运算,结果的实部和虚部分别存储在原实部和虚部位置。

对于任何一个2的整数幂N=2M,总是可以通过M次分解最后完全成为2点的DFT运算。这样的M次分解,就构成从x(n)到X(k)的M级运算过程。从上面的

流图可看到,每一级运算都由N/2个蝶形运算构成。因此每一级运算都需要次复乘和N次复加(每个结作加、减各一次),这样,经过时间抽取后M级运算总共需要的运算:

复乘

复加 N

当然,实际情况与这个数字稍有出入,因为

这几个系数实际上都不用乘法运算,因此在上面N=8的例子中,实际上只有两个

系数W及W是需要乘法运算的。用时间抽取法所需的计算量,不论是复乘还是复加都与Nlog2N成正比,而直接运算时则与N2成正比。

例N=2048,N2=4194304,(N/2)log2N=11264,N2/[(N/2)log2N]=392.4倍。FFT 显然要比直接法快得多。

4.7 功率谱的计算实现

for(m=0;m

{

w[m]=sqrt(Xr[m]*Xr[m]+Xi[m]*Xi[m]); //计算功率谱

}

为了便于观察FFT的运算结果,需要求出信号的频谱。经过第三级到最后一级蝶形运算之后,已经得到式(4-2)所示:

=+(4-2)

A k A R k A I k j

()()()

故功率谱可以通过式(4-3)计算得到:

22

+(4-3)AR k AI k

()()

通过软件仿真,可以观察到输入信号的时间波形和频谱波形以及输出信号的功率谱波形。

4.8 倒序运算函数

void finv(int N1,float *xr,float *xi)

{

int m,n,N2,k; //m为正序数;n为倒序数;k为各个权值;N2为最高位的权值

float T; //临时变量T

N2=N1/2; //最高位加1相当于十进制加上最高位的权N1/2

n=N2; //第一个倒序值

for(m=1;m<=N1-2;m++) //第0个和最后一个不倒序

{

if(m

{

T=xr[m];xr[m]=xr[n];xr[n]=T;

T=xi[m];xi[m]=xi[n];xi[n]=T;

}

k=N2; //最高位权值

while(n>=k)

{

n=n-k; //次高位位1,继续上下进位,满2置0

k=(int)(k/2+0.5); //向下权值依次比上级减半

}

n=n+k; //得到下一倒序值

}

}

倒序运算函数finv(N1,Xr,Xi),对输入序列倒序,N1为序列长度,Xr[],Xi[]分别为输入序列的实部和虚部。

倒序原理:倒序数的加1是在最高位加1,满2向次高位进1,最高位变0,依次往下。

从当前倒序值可求下一倒序值。

4.9 定时器2中断子程序及AD转换子程序

interrupt void ad(void)

{

IFR=0x0000; //CPU级中断标志寄存器IFR=0,即无CPU级中断请求

PieCtrl.PIEACK.all=0xffff;//PIEACK置1,禁止外部中断向CPU发起中断 //请求

if(adconvover==0){

Ad_data[convcount] = AdcRegs.RESULT0; // 将结果寄存器中的AD //转换结果放到Ad_data数组中convcount++; //convcount的初始值为0

}

if (convcount==(128)) //即convcount=128,即Ad_data包含采样值的最 //后一位为Ad_data[128]

{

convcount=0;

adconvover=1;//接满标志,即AD采样结束

}

}

interrupt void ISRTimer2(void)

{

AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除INT SEQ1标志

//位,SEQ1转换结束时INT_SEQ1中断标志位置1 AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //启动SEQ1,触发模数转换!

}

通过“ConfigCpuTimer(&CpuTimer2, 150, 22);”设定定时器2产生中断的时间。当进入定时器2中断子程序后,启动SEQ1,触发模数转换,进入AD中断子程序。

傅里叶变换到计算机实现

傅里叶变换到计算机实现 2013/8/16 Guan Jun 就拿我自身的例子来说,开始接触FFT (快速傅里叶变换)的时候并不是很熟悉,但是这种计算方法的确实很好用。那么,这个doc 我想说的就是,如何从三角变换到FFT 。 01 11 ()(c o s ()s i n ()) n n n f x a a n t b n t ωω+∞ ==++∑,这是说一个周期性函数(T 1)可以分解为不同频率的三角函数的叠加,1 1 1 1 11cos()(e e )/2,sin()(e e )/2jn t jn t jn t jn t n t n t j ωωωωωω--=+=-,带到原函数中,经过整理,令1()()/2n n F n a jb ω=-,1 1()()e jn t f x F n ωω+∞-∞ =∑,再把,n n a b 的表达式(高数书或者 信号与系统说的很清楚)带入1()F n ω中,我们就可以得到11 111 ()()e jn t T F n f x dt T ωω-= ?。以上是周期性函数的傅里叶变换,注意的是1()F n ω画出来的图是:在x 轴上频率ω的坐标为 11111...2,1,0,1,2... n ωωωωωω==--,即一系列间隔为1ω的点,另外也就是说,周期函数的傅里叶变换为频域之后,是分立的频谱,不是连续的。举个栗子,cos(2)x π函数是周期性函数吧,其频率(角频率)为2π,也可写成1,也就是在11f ω±±或者会有值,其余地方就没有。其实到这里,真的不难,因为求1()F n ω也就是带入公式的事么,不借助软件我们都能算好。但是,偏偏有那么一些人没事干非要去研究非周期性函数的傅里叶函数,然后搞出一大堆理论,让我们去学… 废话不多说,如果是非周期性,是不是可以理解为周期无限大?这里的非周期函数也可由周期函数组成,例如在-1x ≤≤1上,()cos(2)f x x π=,其余等0.这是不是非周期性函数?答案很显然.如果非周期性,那么公式不再适用,为什么?这得问数学系的人了。怎么办,把公式变变,1T 移到左边,1n ωω写成(此时频谱是连续的了,为什么,我也不晓得…)那么我 们就将看到最为熟悉的函数:+-()()e j t F f x dt ωω∞ -∞ = ? ,+-1 ()()e 2j t f x F d ωωωπ ∞ ∞ = ?(也有书本写成: +2-()()e j ft F f f x dt π∞ -∞ = ? ,+2-()()e j ft f x F f d f π∞ ∞ = ?).就是把f ωπ写成2,而()() F F f ω中的坐标换成 自此,我们就开始学习一大堆公式,性质啊,我觉得这些性质不是不重要,而是没有实际的 应用!为什么我这么说,因为我们用傅里叶变换,是为了什么?服务于我们的数据,没错,是数据!一堆数据给你,你能看出这函数包含的频率?你能提炼出原函数吗?Okay ,你什么都没有,怎么办,望洋兴叹。 最近写的论文中,我就用到了FFT ,我有图像的曲线,有曲线的数据,而且曲线明显是正余弦函数(只相差/2π相位).大概的频率我也能看出来,但是!这个曲线并不完美,有瑕疵,但是我束手无策,这时计算机粉墨登场了,经过分析我也看出原来还是有很小的其他频率成分包含在里面。也许对傅里叶变换感兴趣的童鞋看过不少人的介绍,说时间连续,时间不连续,频谱连续,频谱不连续。2?2=4,这4种绕来绕去足以崩溃你(这里崩溃作动词).其实,时间连续,就是我上面讲的两种,但一个是周期性函数,一个是非周期,对应的频谱就是分立,连续。那么时间(有时候不一定是时间,也可能是位置)不连续怎么办,其实大多数应用的就是这种方法,就是我们说的采谱,说简单点就是每隔一段时间(距离)采一个点,采点间隔相同,一个点一个值.

实验八 利用快速傅里叶变换(FFT)实现快速卷积(精选、)

实验八 利用FFT 实现快速卷积 一、 实验目的 (1) 通过这一实验,加深理解FFT 在实现数字滤波(或快速卷积)中的重要作用,更好的利用FFT 进行数字信号处理。 (2) 进一步掌握循环卷积和线性卷积两者之间的关系。 二、 实验原理与方法 数字滤波器根据系统的单位脉冲响应h(n)是有限长还是无限长可分为有限长单位脉冲响应(Finite Impulse Response )系统(简记为FIR 系统)和无限长单位脉冲响应(Infinite Impulse Response )系统(简记为IIR 系统)。 对于FIR 滤波器来说,除了可以通过数字网络来实现外,也可以通过FFT 的变换来实现。 一个信号序列x(n)通过FIR 滤波器时,其输出应该是x(n)与h(n)的卷积: ∑+∞ -∞ =-= =m m n h m x n h n x n y )()()(*)()( 或 ∑+∞ -∞ =-= =m m n x m h n x n h n y ) ()()(*)()( 当h(n)是一个有限长序列,即h(n)是FIR 滤波器,且10-≤≤N n 时 ∑-=-=1 0) ()()(N m m n x m h n y 在数字网络(见图6.1)类的FIR 滤波器中,普遍使用的横截型结构(见下图6.2 图6.1 滤波器的数字网络实现方法 图6.2 FIR 滤波器横截型结构 y(n) y(n) -1-1-1-1

应用FFT 实现数字滤波器实际上就是用FFT 来快速计算有限长度列间的线性卷积。 粗略地说,这种方法就是先将输入信号x(n)通过FFT 变换为它的频谱采样 值X(k),然后再和FIR 滤波器的频响采样值H(k)相乘,H(k)可事先存放在存储器中,最后再将乘积H(k)X(k)通过快速傅里叶变换(简称IFFT )还原为时域序列,即得到输出y(n)如图6.3所示。 图6.3 数字滤波器的快速傅里叶变换实现方法 现以FFT 求有限长序列间的卷积及求有限长度列与较长序列间的卷积为例来讨论FFT 的快速卷积方法。 (1) 序列)(n x 和)(n h 的列长差不多。设)(n x 的列长为1N ,)(n h 的列长为2N ,要求 )()(n x n y =N ∑-=-==1 ) ()()(*)()(N r r n h r x n h n x n h 用FFT 完成这一卷积的具体步骤如下: i. 为使两有限长序列的线性卷积可用其循环卷积代替而不发生混叠,必须选择循环卷积长度121-+≥N N N ,若采用基2-FFT 完成卷积运 算,要求m N 2=(m 为整数)。 ii. 用补零方法使)(n x ,)(n h 变成列长为N 的序列。 ?? ?-≤≤-≤≤=10 10)()(11N n N N n n x n x ?? ?-≤≤-≤≤=10 1 0)()(22N n N N n n h n h iii. 用FFT 计算)(),(n h n x 的N 点离散傅里叶变换 )()(k X n x FFT ??→? )()(k H n h FFT ??→? iv. 做)(k X 和)(k H 乘积,)()()(k H k X k Y ?= v. 用FFT 计算)(k Y 的离散傅里叶反变换得 y(n)

傅里叶变换在信号处理中的应用

傅里叶变换在信号处理中的应用 傅里叶变换在物理学、电子类学科、数论、组合数学、信号处理、

概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用(例如在信号处理中,傅里叶变换的典型用途是将信号分解成幅值谱——显示与频率对应的幅值大小)。 尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅立叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感叹造物的神奇: 1.傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子; 2.傅立叶变换的逆变换容易求出,而且形式与正变换非常类似; 3.正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取; 4.著名的卷积定理指出:傅立叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段; 5.离散形式的傅立叶变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT)). 正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。

有関傅立叶变换的FPGA实现 傅立叶变换是数字信号处理中的基本操作,广泛应用于表述及分析离散时域信号领域。但由于其运算量与变换点数N的平方成正比关系,因此,在N较大时,直接应用DFT算法进行谱变换是不切合实际的。然而,快速傅立叶变换技术的出现使情况发生了根本性的变化。本文主要描述了采用FPGA来实现2k/4k/8k点FFT的设计方法。 离散傅里叶变换的应用 DFT在诸多多领域中有着重要应用,下面仅是颉取的几个例子。需要指出的是,所有DFT的实际应用都依赖于计算离散傅里叶变换及其逆变换的快速算法,即快速傅里叶变换(快速傅里叶变换(即FFT)是计算离散傅里叶变换及其逆变换的快速算法。)。 1.频谱分析 DFT是连续傅里叶变换的近似。因此可以对连续信号x(t)均匀采样并截断以得到有限长的离散序列,对这一序列作离散傅里叶变换,可以分析连续信号x(t)频谱的性质。前面还提到DFT应用于频谱分析需要注意的两个问题:即采样可能导致信号混叠和截断信号引起的频谱泄漏。可以通过选择适当的采样频率(见奈奎斯特频率)消减混叠。选择适当的序列长度并加窗可以抑制频谱泄漏。 2.数据压缩 由于人类感官的分辨能力存在极限,因此很多有损压缩算法利用

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

C语言实现FFT(快速傅里叶变换) 函数原型:空快速傅立叶变换(Struct Compx *xin,Intn) 函数函数:对输入复数组执行快速傅立叶变换(FFT)输入参数:*xin复结构组的第一个地址指针。结构输出参数:no * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *结构compx u,w,t。 nv2 =快速傅立叶变换_ N/2;nm1 =快速傅立叶变换_ N-1;(I = 0;i

实验一快速傅里叶变换

实验一 快速傅里叶变换之报告 一 、实验目的 1、在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解; 2、熟悉并掌握按时间抽取FFT 算法的程序; 3、了解应用FFT 进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、 栅栏效应等,以便在实际中正确应用FFT 。 二 实验内容 a ) 信号频率F =50Hz ,采样点数N=32,采样间隔T= matlab 程序代码为: F=50; T=; N=32; n=0:N-1; t=n*T; A=sin(2*pi*F*t); figure; Y = fft(A,N); h = (abs(Y)); h=h/max(h(1:N)); for n=1:N; string1=strcat('X(',num2str(n-1), ')=',num2str(h(n))); disp(string1); f=(n/T)/N; end stem([0:N-1]/N/T,h); xlabel('?μ?ê/HZ'); ylabel('??·ùX£¨ejw£?'); title('·ù?μì?D?'); 上述代码命令中,将FFT 变换后的数字变量K ,在画图时转换成频域中的频率f 。这主 要是根据数字频率与模拟域频率之间的关系: T Ω=ω 其中ω、Ω分别为数字和模拟域中的频率,且N k πω2= f π2=Ω 于是有: NT k f = 运算结果: X(1)=1 X(2)= X(3)= X(4)=

X(5)= X(6)= X(7)= X(8)= X(9)= X(10)= X(11)= X(12)= X(13)= X(14)= X(15)= X(16)= X(17)= X(18)= X(19)= X(20)= X(21)= X(22)= X(23)= X(24)= X(25)= X(26)= X(27)= X(28)= X(29)= X(30)= X(31)=1 b)信号频率F=50Hz,采样点数N=32,采样间隔T= 同理可将a)中F、N、T,参数改成要求值(以下均是如此),即可得,X(0)= X(1)= X(2)= X(3)= X(4)= X(5)= X(6)= X(7)= X(8)=1 X(9)= X(10)= X(11)= X(12)= X(13)= X(14)= X(15)= X(16)= X(17)= X(18)= X(19)= X(20)= X(21)= X(22)= X(23)= X(24)=1 X(25)= X(26)= X(27)= X(28)= X(29)= X(30)= X(31)=

快速傅里叶变换FFT的FPGA设计与实现--电科1704 郭衡

快速傅里叶变换FFT的FPGA设计与实现 学生姓名郭衡 班级电科1704 学号17419002064 指导教师谭会生 成绩 2020年5 月20 日

快速傅里叶变换FFT 的设计与实现 一、研究项目概述 非周期性连续时间信号x(t)的傅里叶变换可以表示为:= )(?X dt t j e t x ? ∞ ∞ --1 )(?,式中计算出来的是信号x(t)的连续频谱。但是,在实际的控制系统中能够式中计算出来的是信号x(t)的连续频谱。但是,在实际的控制系统中能够算信号x(t)的频谱。 有限长离散信号x(n),n=0,1,…,N-1的DFT 定义为: ∑-=-=-==1 02,1.....10)()(N n N j N kn N e W N k W n x K X π、、。 可以看出,DFT 需要计算大约N2次乘法和N2次加法。当N 较大时,这个计算量是很大的。利用WN 的对称性和周期性,将N 点DFT 分解为两个N /2点的DFT ,这样两个N /2点DFT 总的计算量只是原来的一半,即(N /2)2+(N /2)2=N2/2,这样可以继续分解下去,将N /2再分解为N /4点DFT 等。对于N=2m 点的DFT 都可以分解为2点的DFT ,这样其计算量可以减少为(N /2)log2N 次乘法和Nlog2N 次加法。图1为FFT 与DFT-所需运算量与计算点数的关系曲线。由图可以明显看出FFT 算法的优越性。 图1 FFT 与DFT 所需乘法次数比 较

X[1] 将x(n)分解为偶数与奇数的两个序列之和,即x(n)=x1(n)+x2(n)。 x1(n)和x2(n)的长度都是N /2,x1(n)是偶数序列,x2(n)是奇数序列,则 ∑∑=--=-=+2 )12(120 2)1.....,0()(2)(1)(N n k n N N n km N N k W n x W n x K X 所以)1...,0()(2)(1)(12 22120 -=+=∑∑-=-=N k W n x W W n x K X N n km N k N km N N n 由于km N N j km N j km N W e e W 2/2 /2222===--ππ ,则 )1.....,0)((2)(1)(2)(1)(12 2/120 2/-=+=+=∑∑-=-=N k k X W k X W n x W W n x K X k N N n km N k N N n kn N 其中X1(k)和X2(k)分别为x1(n)和x2(n)的N /2点DFT 。由于X1(k)和X2(k)均以N /2为周期,且WNk+N/2=-WNk ,所以X(k)又可表示为: )12/....,1,0)((2)(1)(-=+=N k k X W k X K X k N )12/....,1,0)((2)(1)2/(-=-=+N k k X W k X N K X k N

快速傅里叶变换实验报告..

快速傅里叶变换实验报告 班级: 姓名: 学号:

快速傅里叶变换 一.实验目的 1.在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解; 2.熟悉并掌握按时间抽取FFT 算法的程序; 3.了解应用FFT 进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT 。 二.实验内容 1.仔细分析教材第六章‘时间抽取法FFT ’的算法结构,编制出相应的用FFT 进行信号分析的C 语言(或MATLAB 语言)程序; 2.用FFT 程序分析正弦信号 ()sin(2)[()(*)],(0)1y t f t u t u t N T t u π=---∞<<+∞=设 分别在以下情况进行分析并讨论所得的结果: a ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.000625s b ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.005s c ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.0046875s d ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.004s e ) 信号频率 f =50Hz ,采样点数N=64,采样间隔T=0.000625s f ) 信号频率f =250Hz ,采样点数N=32,采样间隔T=0.005s g ) 将c ) 信号后补32个0,做64点FFT 三.实验要求 1.记录下实验内容中各种情况下的X (k)值,做出频谱图并深入讨论结果,说明参数的变化对信号频谱产生哪些影响。频谱只做模特性,模的最大值=1,全部归一化;

2.打印出用C 语言(或MATLAB 语言)编写的FFT 源程序,并且在每一小段处加上详细的注释说明; 3.用C 语言(或MATLAB 语言)编写FFT 程序时,要求采用人机界面形式: N , T , f 变量均由键盘输入,补零或不补零要求设置一开关来选择。 四.实验分析 对于本实验进行快速傅里叶变换,依次需要对信号进行采样,补零(要求补零时),码位倒置,蝶形运算,归一化处理并作图。 此外,本实验要求采用人机界面形式,N,T,F 变量由键盘输入,补零或不补零设置一开关来选择。 1.采样 本实验进行FFT 运算,给出的是正弦信号,需要先对信号进行采样,得到有限 长序列()n x , N n ...... 2,1,0= Matlab 实现: t=0:T:T*(N-1); x=sin(2*pi*f*t); 2.补零 根据实验要求确定补零与否,可以用if 语句做判断,若为1,再输入补零个数, 并将补的零放到采样得到的序列的后面组成新的序列,此时新的序列的元素个数等于原采样点个数加上补零个数,并将新的序列个数赋值给N 。 Matlab 实现: a=input('是否增加零点? 是请输入1 否请输入0\n'); if (a) ZeroNum=input('请输入增加零点的个数:\n'); else ZeroNum=0; end if (a) x=[x zeros(1, ZeroNum)];%%指令zeros(a,b)生成a 行b 列全0矩阵,在单行矩阵x 后补充0 end N=N+ZeroNum; 3.码位倒置 本实验做FFT 变换的级数为M ,N M 2log =

傅里叶变换在信号处理中的应用

傅里叶变换在信号处理中的应用 姓名董柱班级电气工程及其自动化学号1109141013 摘要: 傅里叶变换是一种特殊的积分变换。通过傅里叶变换把信号的从时域变换到频域研究,采用频域法较之经典时域的方法有很多突出的优点,虽然傅里叶分析不是信息科学与技术领域中唯一的变换域方法,但是不得不承认,在此领域中,傅里叶变换分析始终有着广泛的应用,通过傅里叶变换实现信号的滤波,调制,抽样是傅里叶变换在信号处理中最主要的作用。通过对信号的调制可以将信号的低频成分调制到高频,实现频谱搬移,减少马间串扰,提高抗噪声新能,有利于信号的远距离传输,另外,对信号采样可以使连续信号离散化,有利于用计算机对信号进行处理,总之,傅里叶变换在信号处理中有着非常重要的作用。傅里叶变换是学习其他频域变换的基础。 关键词: 傅里叶变换,时域,频域,信号处理,信息科学与技术,滤波,调制,抽样。 一傅里叶变换 1.定义 f(t)是t的函数,如果t满足狄里赫莱条件:具有有限个间断点;具有有限个极值点;绝对可积。则有下图①式成立。称为积分运算f(t)的傅立叶变换, ②式的积分运算叫做F(ω)的傅立叶逆变换。F(ω)叫做f(t)的像函数,f(t)叫做 F(ω)的像原函数。F(ω)是f(t)的像。f(t)是F(ω)原像。 ① 傅里叶变换 傅里叶逆变换 2.分类 连续傅立叶变换:一般情况下,若“傅立叶变换”一词的前面未加任何限定语,则指的是“连续傅立叶变换”。“连续傅立叶变换”将平方可积的函数f(t) 表示成复指数函数的积分或级数形式。 f(t) = \mathcal^[F(ω)] = \frac{\sqrt{2π}} \int\limits_{-\infty}^\infty F(ω)e^{iωt}\,dω.

快速傅里叶变换实验报告

快速傅里叶变换实验报告

————————————————————————————————作者:————————————————————————————————日期: ?

快速傅里叶变换实验报告 机械34班 刘攀 2013010558 一、 基本信号(函数)的FF T变换 1. 000()sin()sin 2cos36x t t t t π ωωω=+++ 1) 采样频率08s f f =,截断长度N =16; 取02ωπ=rad/s,则0f =1Hz ,s f =8Hz ,频率分辨率 f ?=s f f N ?= =0.5Hz 。 最高频率c f =30f =3Hz ,s f >2c f ,故满足采样定理,不会发生混叠现象。 截断长度02T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下:

幅值误差0A ?=,相位误差0??=。 2) 采样频率08s f f =,截断长度N=32; 取02ωπ=rad/s ,则0f =1Hz,s f =8Hz ,频率分辨率f ?=s f f N ?==0.25Hz 。 最高频率c f =30f =3H z,s f >2c f ,故满足采样定理,不会发生混叠现象。 截断长度04T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下:

幅值误差0A ?=,相位误差0??=。 2. 00()sin()sin116x t t t π ωω=++ 1) 采样频率08s f f =,截断长度N=16; 取02ωπ=ra d/s,则0f =1Hz ,s f =8Hz,频率分辨率f ?=s f f N ?==0.5H z。 最高频率c f =110f =11H z,s f <2c f ,故不满足采样定理,会发生混叠现象。 截断长度02T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图:

快速傅里叶变换实验报告

快速傅里叶变换实验报告 快速傅里叶变换实验报告 机械34班刘攀 2019010558 一、基本信号(函数)的FFT变换 1. x(t)=sin(ω0t+)+sin2ω0t+cos3ω0t 6 1) 采样频率fs=8f0,截断长度N=16; 取ω0=2πrad/s,则f0=1Hz,fs=8Hz,频率分辨率?f=?f=fs=0.5Hz。 Nπ最高频率fc=3f0=3Hz,fs>2fc,故满足采样定理,不会发生混叠现象。截断长度T=2T0,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下: 幅值误差?A=0,相位误差??=0。 2) 采样频率fs=8f0,截断长度N=32; 取ω0=2πrad/s,则f0=1Hz,fs=8Hz,频率分辨率?f=?f=fs=0.25Hz。 N最高频率fc=3f0=3Hz,fs>2fc,故满足采样定理,不会发生混叠现象。截断长度T=4T0,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下: 幅值误差?A=0,相位误差??=0。 2. x(t)=sin(ω0t+π 6)+sin11ω0t 1) 采样频率fs=8f0,截断长度N=16; 取ω0=2πrad/s,则f0=1Hz,fs=8Hz,频率分辨率?f=?f=fs=0.5Hz。 N最高频率 fc=11f0=11Hz,fs 漏,但在整周期截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图:

由上图可以看出,并未体现出11f0的成分,说明波形出现混叠失真。为了消除混叠 现象,应加大采样频率,使之大于等于 22Hz。 f0处的幅值误差?A=0,11f0处由于出现 了混叠现象,幅值误差没有意义;相位误差??=0。 2) 采样频率fs=32f0,截断长度N=32; 取ω0=2πrad/s,则f0=1Hz,fs=32Hz,频率分辨率?f=?f=fs=1Hz。 N最高频率 fc=11f0=11Hz,fs>2fc,故满足采样定理,不会发生混叠现象。 漏,但在整周期截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图: 该频谱图体现出了f0和11f0的成分,说明未失真,且幅值均为1,。幅值误差?A=0,相位误差??=0。 3. x(t)=0t 1) 采样频率fs=8f0,截断长度N=16; 取ω0=2πrad/s,则f0=1Hz,fs=8Hz,频率分辨率?f=?f=fs=0.5Hz。 N最高频率f cf 0Hz,fs>2fc,故满足采样定理,不会发生混叠现象。 频谱图: 在忽略旁瓣信号的情况下,可近似认为: x(t)≈0.9098cos(3ω0t+56.9520?) 故幅值误差?A=0.9096-1=-0.0904,相位误差??=56.9520?。 2) 采样频率fs=32f0,截断长度N=32; 取ω0=2πrad/s,则f0=1Hz,fs=32Hz,频率分辨率?f=?f=fs=1Hz。N最高频率f cf 0Hz,fs>2fc,故满足采样定理,不会发生混叠现象。 频谱图: 在忽略旁瓣信号的情况下,可近似认为:

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

#include #include /********************************************************************* 快速福利叶变换C函数 函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的 复数 使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的应该为2的N次方,不满足此条件时应在后面补0 函数调用:FFT(s); 时间:2010-2-20 版本:Ver1.0 参考文献: **********************************************************************/ #include #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)

快速傅里叶变换实验报告

快速傅里叶变换实验报告 机械34班 攀 2013010558 一、 基本信号(函数)的FFT 变换 1. 000()sin()sin 2cos36 x t t t t πωωω=+++ 1) 采样频率08s f f =,截断长度N=16; 取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ?=s f f N ?==0.5Hz 。 最高频率c f =30f =3Hz ,s f >2c f ,故满足采样定理,不会发生混叠现象。 截断长度02T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下:

幅值误差0A ?=,相位误差0??=。 2) 采样频率08s f f =,截断长度N=32; 取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ?=s f f N ?==0.25Hz 。 最高频率c f =30f =3Hz ,s f >2c f ,故满足采样定理,不会发生混叠现象。 截断长度04T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图如下:

幅值误差0A ?=,相位误差0??=。 2. 00()sin()sin116 x t t t πωω=++ 1) 采样频率08s f f =,截断长度N=16; 取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ?=s f f N ?==0.5Hz 。 最高频率c f =110f =11Hz ,s f <2c f ,故不满足采样定理,会发生混叠现象。 截断长度02T T =,整周期截取,不会发生栅栏效应。理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。 频谱图:

傅里叶变换及应用

傅里叶变换在MATLZB里的应用 摘要:在现代数学中,傅里叶变换是一种非常重要的变换,且在数字信号处理中有着广泛的应用。本文首先介绍了傅里叶变换的基本概念、性质及发展情况;其次,详细介绍了分离变数法及积分变换法在解数学物理方程中的应用。傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号,再利用傅立叶反变换将这些频域信号转换成时域信号。应用MATLAB实现信号的谱分析和对信号消噪。 关键词:傅里叶变换;MA TLAB软件;信号消噪 Abstract: In modern mathematics,Fourier transform is a transform is very important ,And has been widely used in digital signal processing.This paper first introduces the basic concepts, properties and development situation of Fourier transform ;Secondly, introduces in detail the method of separation of variables and integral transform method in solving equations in Mathematical Physics.Fourier transformation makes the original time domain signal whose analysis is difficult easy, by transforming it into frequency domain signal that can be transformed into time domain signal by inverse transformation of Fourier. Using Mat lab realizes signal spectral analysis and signal denoising. Key word: Fourier transformation, software of mat lab ,signal denoising 1、傅里叶变换的提出及发展 在自然科学和工程技术中为了把较复杂的运算转化为较简单的运算,人们常常采用所谓变换的方法来达到目的"例如在初等数学中,数量的乘积和商可以通过对数变换化为较简单的加法和减法运算。在工程数学里积分变换能够将分析运算(如微分,积分)转化为代数运算,正是积分变换这一特性,使得它在微分方程和其它方程的求解中成为重要方法之一。 1804年,法国科学家J-.B.-J.傅里叶由于当时工业上处理金属的需要,开始从事热流动的研究"他在题为<<热的解析理论>>一文中,发展了热流动方程,并且指出如何求解"在求解过程中,他提出了任意周期函数都可以用三角级数来表示的想法。他的这种

傅里叶变换在信号与系统系统中的应用

河北联合大学 本科毕业设计(论文) 题目傅里叶变换在信号与系统中的应用 院系理学院 专业班级07数学一班 学生姓名刘帅 学生学号200710050113 指导教师佟玉霞 2011年5月24日

题目傅里叶变换在信号与系统中的应用 专业数学与应用数学姓名刘帅学号200710050113 主要内容、基本要求、主要参考资料等 主要内容 傅里叶变换是一种重要的变换,且在与通信相关的信号与系统中有着广泛的应用。本文主要研究傅里叶变换的基本原理;其次,掌握其在滤波,调制、解调,抽样等方面中的应用。分析了信号在通信系统中的处理方法,通过傅里叶变换推导出信号调制解调的原理,由此引出对频分复用通信系统的组成原理的介绍。 基本要求 通过傅里叶变换实现一个高通滤波,低通滤波,带通滤波。用傅里叶变换推导出信号调制解调的原理。通过抽样实现连续信号离散化,简化计算。另外利用调制的原理推导出通信系统中的时分复用和频分复用。 参考资料 [1]《信号与系统理论、方法和应用》徐守时著中国科技大学出版社 2006年3月修订二版 [2]《信号与系统》第二版上、下册郑君里、应启珩、杨为理著高等教育出版社 [3]《通信系统》第四版 Simon Haykin 著宋铁成、徐平平、徐智勇等译沈 连丰审校电子工业出版社 [4]《信号与系统—连续与离散》第四版 Rodger E.Ziemer 等著肖志涛等译 腾建辅审校电子工业出版社 [5]《现代通信原理》陶亚雄主编电子工业出版社 [6]《信号与系统》乐正友著清华大学出版社 [7]《信号与线性系统》阎鸿森、王新风、田惠生编西安交通大学出版社 [8]《信号与线性系统》张卫钢主编郑晶、徐琨、徐建民副主编西安电 子科技大学出版社 [9] https://www.wendangku.net/doc/9d10955667.html,/view/191871.htm//百度百科傅里叶变换 [10]《通信原理》第六版樊昌信曹丽娜编著国防工业出版社 [11]A.V.Oppenheim,A.S.Willsky with S.H.Nawab.Siganals and systems(Second edition).Prentice-Hall,1997.中译:刘树棠。信号与系统。西安交通工业大学出版社 完成期限 指导教师 专业负责人

fft快速傅里叶变换 c语言实现

#include #include #include #define N 1000 /*定义复数类型*/ typedef struct{ double real; double img; }complex; complex x[N], *W; /*输入序列,变换核*/ int size_x=0; /*输入序列的大小,在本程序中仅限2的次幂*/ double PI; /*圆周率*/ void fft(); /*快速傅里叶变换*/ void initW(); /*初始化变换核*/ void change(); /*变址*/ void add(complex ,complex ,complex *); /*复数加法*/ void mul(complex ,complex ,complex *); /*复数乘法*/ void sub(complex ,complex ,complex *); /*复数减法*/ void output(); int main(){ int i; /*输出结果*/ 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

快速傅里叶变换实验

快速傅里叶变换实验

————————————————————————————————作者:————————————————————————————————日期: ?

实验七快速傅里叶变换实验 2011010541?机14 林志杭 一、实验目的 1.加深对几个特殊概念的理解:“采样”……“混叠”;“窗函数”(截断)……“泄漏”;“非整周期截取”……“栅栏”。 2.加深理解如何才能避免“混叠”,减少“泄漏”,防止“栅栏”的方法和措施以及估计这些因素对频谱的影响。 3.对利用通用微型计算机及相应的FFT软件,实现频谱分析有一个初步的了解。 二、实验原理 为了实现信号的数字化处理,利用计算机进行频谱分析――计算信号的频谱。由于计算机只能进行有限的离散计算(即DFT),因此就要对连续的模拟信号进行采样和截断。而这两个处理过程可能引起信号频谱的畸变,从而使DFT的计算结果与信号的实际频谱有误差。有时由于采样和截断的处理不当,使计算出来的频谱完全失真。因此在时域处理信号时要格外小心。 时域采样频率过低,将引起频域的“混叠”。为了避免产生“混叠”,要求时域采样时必须满足采样定理,即:采样频率fs必须大于信号中最高频率fc的2倍(fs>2fc)。因此在信号数字处理中,为避免混叠,依不同的信号选择合适的采样频率将是十分重要的。 频域的“泄漏”是由时域的截断引起的。时域的截断使频域中本来集中的能量向它的邻域扩散(如由一个δ(f)变成一个sinc(f),而泄漏的旁瓣将影响其它谱线的数值。时域截断还会引起“栅栏效应”,对周期信号而言,它是由于截断长度不等于周期信号的周期的整数倍而引起的。因此避免“栅栏”效应的办法就是整周期截断。 综上所述,在信号数字化处理中应十分注意以下几点: 1.为了避免“混叠”,要求在采样时必须满足采样定理。 为了减少“泄漏”,应适当增加截断长度和选择合适的窗 对信号进行整周期截取,则能消除“栅栏数应”。 增加截断长度,则可提高频率分辨率。 三、预习内容 熟悉Matlab语言、函数和使用方法;利用Matlab所提供的FFT函数编写程序。 四、实验内容及步骤 调通所编写的程序,对下列信号〔函数〕进行离散FFT变换,根据题目的要求……FFT变换点数〔截断长度〕及采样频率,计算各点的傅里叶变换值,画出频谱图,对典型的谱线标出其幅值及相角。 (-)内容: 1. t t t t x 3 cos 2 sin ) 6 sin( )(ω ω π ω+ + + = 代码: N=input('N='); n=input('n=');t=1:1:N;

相关文档
相关文档 最新文档