数字信号处理课程设计Word文件下载.docx

上传人:b****3 文档编号:18460886 上传时间:2022-12-16 格式:DOCX 页数:18 大小:144.42KB
下载 相关 举报
数字信号处理课程设计Word文件下载.docx_第1页
第1页 / 共18页
数字信号处理课程设计Word文件下载.docx_第2页
第2页 / 共18页
数字信号处理课程设计Word文件下载.docx_第3页
第3页 / 共18页
数字信号处理课程设计Word文件下载.docx_第4页
第4页 / 共18页
数字信号处理课程设计Word文件下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数字信号处理课程设计Word文件下载.docx

《数字信号处理课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字信号处理课程设计Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。

数字信号处理课程设计Word文件下载.docx

DFT使计算机在频域处理信号成为可能,但是当N很大时,直接计算N点DFT的计算量非常大。

快速傅里叶变换(FFT,FastFourierTransform)可使实现DFT的运算量下降几个数量级,从而使数字信号处理的速度大大提高,工程应用成为可能。

人们已经研究出多种FFT算法,它们的复杂度和运算效率各不相同。

快速傅里叶变换就是不断地将长序列的DFT分解为短序列的DFT,并利用的周期性和对称性及其一些特殊值来减少DFT运算量的快速算法。

FFT算法分类:

1.时间抽选法DIT:

Decimation-In-Time

2.频率抽选法DIF:

Decimation-In-Frequency

时间域抽取:

基2时间抽取(Decimationintime)DIT-FFT算法

频率域抽取:

基2频率抽取(Decimationinfrequency)DIF-FFT算法

第二章基2DIT-FFT算法

2.1按时间抽取的基2DIT-FFT算法:

1、按时间抽取的基2DIT-FFT算法原理

先设序列点数为N=2M,M为整数。

如果不满足这个条件,可以人为地加上若干零值点,使之达到这一要求。

这种N为2的整数幂的FFT称基-2FFT。

设输入序列长度为N=2M(M为正整数),将该序列按时间顺序的奇偶分解为越来越短的子序列,称为按时间抽取(DIT)的FFT算法。

序列x(n)的N点DFT为

将上面的和式按n的奇偶性分解为

令x1(l)=x(2l),x2(l)=x(2l+1),因为,所以上式可写成

上式说明,按n的奇偶性将x(n)分解为两个N/2长的序列x1(l)和x2(l),则N点DFT可分解为两个N/2点DFT来计算。

用X1(k)和X2(k)分别表示x1(l)和x2(l)的N/2点DFT,即

有上述公式,及X1(k)、X2(k)的隐含周期性得到:

这样,就将N点DFT的计算分解为计算两个N/2点离散傅里叶变换X1(k)和X2(k),再计算上式。

蝶形图:

2、按时间抽选的FFT算法的特点:

(1) 

原位运算

由图4.2.4可以看出,DIT-FFT的运算过程很有规律。

N=2M点的FFT共进行M级运算,每级由N/2个蝶形运算组成。

同一级中,每个蝶形的两个输入数据只对计算本蝶形有用,而且每个蝶形的输入、输出数据结点又同在一条水平线上,这就意味着计算完一个蝶形后,所得输出数据可立即存入原输入数据所占用的存储单元。

这样,经过M级运算后,原来存放输入序列数据的N个存储单元中便依次存放的N个值。

这种利用同一存储单元存储蝶形计算输入、输出数据的方法称为原位计算。

原位计算可节省大量内存,从而使设备成本降低。

(2)倒序规律

按原位计算时,FFT的输出是按正常顺序排列在存储单元中,但是这时输入x(n)却不是、按自然顺序存储的,而是按x(0),x(4),…,x(7)的顺序存入存储单元,看起来好象是“混乱无序”的,实际上是有规律的,我们称之为倒序。

第三章基于C语言设计16点基2DFT-FFT程序及运行结果

设计参数及要求:

本次试验要求利用C语言设计16点基2DIT-FFT程序,并对如下程序进行分析,给出输出结果并画出信号的幅值图和相位谱。

n

1

2

3

4

5

6

7

8

9

10

X(n)

1.22

2.23

2.85

2.98

2.60

1.76

0.62

-0.62

-1.76

-2.60

11

12

13

14

15

-2.98

-2.85

-2.23

-1.22

3.1按时间抽取的基2DFT-FFT程序:

/*时间抽选基2FFT算法C语言实现*/

#include<

stdio.h>

math.h>

stdlib.h>

conio.h>

#defineN1000

#include<

graphics.h>

/*定义复数类型*/

typedefstruct

{

doublereal;

doubleimg;

}complex;

complexx[N],*W;

/*输入序列,变换核*/

intsize_x=0;

/*输入序列的大小,在本程序中仅限2的次幂*/

doublePI;

/*圆周率*/

intz;

floatw[N],p[N];

charstr[N];

/*初始化变换核*/

voidinitW()

inti;

W=(complex*)malloc(sizeof(complex)*size_x);

for(i=0;

i<

size_x;

i++)

{

W[i].real=cos(2*PI/size_x*i);

W[i].img=-1*sin(2*PI/size_x*i);

}

}

/*加法*/

voidadd(complexa,complexb,complex*c)

c->

real=a.real+b.real;

img=a.img+b.img;

/*乘法*/

voidmul(complexa,complexb,complex*c)

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

img=a.real*b.img+a.img*b.real;

/*减法*/

voidsub(complexa,complexb,complex*c)

real=a.real-b.real;

img=a.img-b.img;

/*除法*/

voiddivi(complexa,complexb,complex*c)

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

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

/*变址计算,将x(n)码位倒置*/

voidchange()

complextemp;

unsignedshorti=0,j=0,k=0;

doublet;

k=i;

j=0;

t=(log(size_x)/log

(2));

while((t--)>

0)

j=j<

<

1;

j|=(k&

1);

k=k>

>

if(j>

i)

temp=x[i];

x[i]=x[j];

x[j]=temp;

/*快速傅里叶变换*/

voidfft()

inti=0,j=0,k=0,l=0;

complexup,down,product;

change();

log(size_x)/log

(2);

{/*一级蝶形运算*/

l=1<

i;

for(j=0;

j<

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;

/*快速傅里叶逆变换*/

voidifft()

inti=0,j=0,k=0,l=size_x;

complexup,down;

(int)(log(size_x)/log

(2));

l/=2;

add(x[j+k],x[j+k+l],&

up.real/=2;

up.img/=2;

sub(x[j+k],x[j+k+l],&

down.real/=2;

down.img/=2;

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

/*输出傅里叶变换的结果和幅值结果*/

voidoutput()

clrscr();

printf("

Theresultareasfollows\n\n"

);

%.4f"

x[i].real);

if(x[i].img>

=0.0001)printf("

+%.4fj\n"

x[i].img);

elseif(fabs(x[i].img)<

0.0001)printf("

\n"

elseprintf("

%.4fj\n"

for(z=0;

z<

16;

z++)

{

w[z]=sqrt((x[z].real)*(x[z].real)+(x[z].img)*(x[z].img));

\n\nTheAmplitudesareasfollows\n\n"

for(z=0;

%.4f\n"

w[z]);

/*输出傅里叶变换相位的结果*/

voidoutput2()

setbkcolor(0);

p[z]=atan((x[z].img)/(x[z].real));

\n\n\nThePhaseareasfollows\n\n"

setcolor

(1);

p[z]);

voiddraw(intn)/*作幅值图*/

intk,driver,mode,step,x,y;

inti,j,xstep=512/n,ystep=55;

charbuffer[10],buffera[N];

step=512/n;

driver=VGA;

mode=VGAHI;

x=64;

y=400;

initgraph(&

driver,&

mode,"

"

setbkcolor(15);

/*绘制坐标及刻度*/

moveto(200,30);

outtext("

TheFigureofAmplitudeisasfollow!

line(x,80,x,400);

/*画纵坐标*/

line(x-4,100,x,80);

line(x,80,x+4,100);

line(40,y,600,y);

/*画横坐标*/

line(600,y,580,y+4);

line(600,y,580,y-4);

j=400;

settextjustify(CENTER_TEXT,CENTER_TEXT);

/*纵坐标刻度*/

=25;

i+=5)

line(64,j,54,j);

itoa(i,buffer,10);

outtextxy(30,j,buffer);

j-=ystep;

outtextxy(x,70,"

Amplitude"

/*纵坐标标注*/

j=64;

settextjustify(CENTER_TEXT,TOP_TEXT);

/*画横坐标刻度*/

=15;

line(j,400,j,410);

outtextxy(j,415,buffer);

j+=xstep;

}

outtextxy(600,y+10,"

x[n]"

/*横坐标标注*/

/*绘制频谱图*/

n;

setcolor(4);

setlinestyle(0,0,3);

line(x,y,x,(y-(w[k])*11));

x+=step;

sprintf(buffera,"

w[k]);

if(w[k]>

=0)

outtextxy(x-step+2,(y-(w[k])*12)-10,buffera);

else

outtextxy(x-step+2,(y-(w[k])*12)+10,buffera);

getch();

cleardevice();

voiddraw2(intn)/*作相位图*/

floatkd;

inti,j,xstep=512/n,ystep=30;

charbuffer[10],bufferp[N],bufferkd[N];

y=250;

TheFigureofphaseisasfollow!

line(x,50,x,450);

line(x-4,70,x,50);

line(x,50,x+4,70);

j=250;

outtextxy(15,j,"

0"

for(kd=0.5;

kd<

=3.0;

kd+=0.5)

line(64,j-ystep,54,j-ystep);

sprintf(bufferkd,"

kd);

outtextxy(30,j-ystep,bufferkd);

line(64,j+ystep,54,j+ystep);

-kd);

outtextxy(30,j+ystep,bufferkd);

j+=ystep;

outtextxy(x,40,"

Phase"

line(j,240,j,250);

outtextxy(j+10,265,buffer);

/*绘制相位图*/

line(x,y,x,(y-(p[k])*60));

sprintf(bufferp,"

p[k]);

if(p[k]>

outtextxy(x-step+2,(y-(p[k])*60)-10,bufferp);

outtextxy(x-step+2,(y-(p[k])*60)+5,bufferp);

intmain()

inti,method;

voidfft();

/*快速傅里叶变换*/

voidifft();

voidinitW();

/*初始化变换核*/

voidchange();

/*变址*/

voidadd(complex,complex,complex*);

/*复数加法*/

voidmul(complex,complex,complex*);

/*复数乘法*/

voidsub(complex,complex,complex*);

/*复数减法*/

voiddivi(complex,complex,complex*);

/*复数除法*/

voidoutput();

voidoutput2();

/*输出结果*/

system("

cls"

PI=atan

(1)*4;

Pleaseinputthesizeofx:

scanf("

%d"

&

size_x);

Pleaseinputthedatainx[N]:

%lf%lf"

x[i].real,&

x[i].img);

initW();

UseFFT(0)orIFFT

(1)?

method);

if(method==0)

fft();

ifft();

output();

/*画频谱图*/

draw(size_x);

output2();

draw2(size_x);

closegraph();

3.2程序运行结果:

PleaseinputthesizeofX:

16

PleaseinputthedatainX[N]:

xn=

01.22002.23002.85002.98002.60001.76000.6200-0.6200-1.7600-2.6000-2.9800-2.8500-2.2300-1.22000

4.49118667428684-22.5787201341516i

-0.863137084989848+2.08379725676967i

-0.708894177324789+1.06093511090429i

-0.660000000000000+0.660000000000000i

-0.667400913065437+0.445943033038161i

-0.636862915010152+0.263797256769669i

-0.634891583896613+0.126287787982296i

-0.640000000000000

-0.634891583896613-0.126287787982296i

-0.636862915010152-0.263797256769669i

-0.667400913065437-0.445943033038161i

-0.660000000000000-0.660000000000000i

-0.708894177324789-1.060

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1