当前位置:文档之家› 基-2FFT算法的软件实现

基-2FFT算法的软件实现

基-2FFT算法的软件实现
基-2FFT算法的软件实现

实验二 基-2FFT 算法的软件实现

一、实验目的

1、 加深对DFT 算法原理和基本性质的理解;

2、 熟悉FFT 算法的流程;

3、 了解FFT 算法的应用。

二、基本原理

1、 DFT 算法原理 (见教材第三章)

2、按时间抽取(DIT )的-2FFT 算法

(1)算法原理

序列x (n )的N (N =2-M )点DFT 为

kn

N

N n N W n x n x DFT k X ∑-===1

0)()]([)(点,k =0, 1, …, N -1 (2.1) 将式(2.1)按n 的奇偶性分解为

)12(1

2/212/)12()2()()()(+-=-===∑∑∑∑++

=

+

=

l k N

N n l k N

N n kn N

n kn

N

n W

l x W

l x W

n x W

n x k X 奇数

偶数

奇数

偶数

(2.2)

令)2()(1l x l x =, )12()(2+=l x l x ,因为kl

N l k N W W 2/2=, 所以式(2.2)可写成

)12(2

/1

2

2

/1

2/0

12)()()(+--=-=∑∑+=

l k N M n k N

kl

N N l W

l x W

W

l x k X 奇数

(2.3)

式(2.3)说明,按n 的奇偶性将x (n )分解为两个N /2长的序列x 1(l )和x 2(l ),则N 点DFT 可分解为两个N /2点DFT 来计算。用X 1(k )和X 2(k )分别表示

12

,...,

1,0 )()]([)(1

2/0

2

/12/11-==

=∑-=N

k W

l x l x DFT k X N l kl N N 点

(2.4) 12

,...,

1,0 )()]([)(1

2/0

2/22/22-==

=∑-=N

k W l x l x DFT k X N l kl N N 点

(2.5)

将(2.4)式和(2.5)式代入(2.31)式,并利用k

N

N

k N W W -=+

2

和X 1(k )、 X 2(k )的隐含周期性可得到:

12,...1,0)()()2()

()()(2121-=?

?

?

??

-=++=N k k X W k X N k X k X W k X k X k

N k

N (2.6) 这样,将N 点DFT 的计算分解为计算两个N/2点离散傅立叶变换X 1(k )和X 2(k ),再计算(2.6)式。为了将如上分解过程用运算流图表示,以便估计其运算量,观察运算规律,总结编程方法,先介绍一种表示(2.6)式的蝶形图。

图2.1蝶形运算图

图2.2 8点DFT 一次时域抽取分解运算流图

根据图2.2可以求得第一次分解后的运算量。图2.2包括两个N/2点DFT 和N/2个蝶形,每个N/2点DFT 需要2

)2/(N 次复数乘法和2/)12/(N N -次复数加法运算,每个蝶形只有一次复数乘法运算和两次复数加法运算。所以,总的复数乘法次数为

总的复数加法次数为

2

|)1(222)2(2

12N N N N N N ≈+=+?>> (2.7)

2

2222)12(2N N N N =?+??- (2.8) N=8点DIT-FFT 的运算流图如图2.3(a)所示。根据W k N/m =W km N ,将图2.3(a)转换成

如图2.3(b)所示的标准形式的运算流图

图2.3 N=8点DIT-FFT 的运算流图

(2)算法效率

由图2.3可见,N =2M 时,DIT-FFT 运算流图由M 级蝶形构成,每级有N/2个蝶形。

因此,每级需要N/2次复数乘法运算和N 次复数加法运算,M 级形共需复数乘法次数C M (2)和复数加法次数C A (2)分别为

lbN N

M N C M 2

2)2(=?=

(2.9) C A (2) =N ·M =N lb N (2.10)

式中,lb N=log 2 N 。直接计算N 点DFT 的复数乘法次数为N 2,复数加法次数为(N -1)N 。当N 1时, N 2/C M(2)>>1,所以N 越大,DIT-FFT 运算效率越高。DIT-FFT 算法与DFT 所需乘法次数与N 的关系曲线如图2.4所示。例如,N =210=1024时,DIT-FFT 的运算效率为

8.204102

10241024)2(2

2=?==-M C N FFT DIT DFT 的乘法次数的乘法次数 (2.11)

而当N=211=2048时,

37.372112048

222

)2(22≈?==?=M N M N N C N M (2.12)

图2.4 DIT-FFT 与DFT 所需乘法次数比较曲线

(3)运算规律

r

N

W 的确定 第m 级运算,一个DIT 蝶型运算的的两接点“距离”为1

2

-m ,所以

r N

m m m m m r

N

m m m m W

k X k X k X W k X k X k X )2

()()2

()2()()(1

111

111-------+-=+++= (2.13)

r 的求解:(1)将式(2.13)中第一个节点的标号k 表示成L (L

N 2=)位二进制数;(2)把此二进制数乘上m

L -2

,即将L 位二进制数左移m L -位(注意m 是第m 级运

算),把右边空出的位置补0,此数即为所求r 的二进制数。

序列的倒序

DIT-FFT 算法的输入序列的排序看起来似乎很乱,但仔细分析就会发现这种倒序是很有规律的。由于L

N 2=,因此顺序数可用L 位二进制数(0121n n n n L L --)表示。M 次偶奇时域抽选过程如图2.5所示。

第一次按最低位0n 的0和1将x(n)分解为偶奇两组,第二次又按次低位1n 的0、 1值

分别对偶奇组分解; 依次类推,第L 次按1-L n 位分解,最后所得二进制倒序数如图2.5所示。

图2.5 形成例序的树状图(N =23)

形成倒序J 后,将原存储器中存放的输入序列重新按倒序排列。设原输入序列x (n )先

按自然顺序存入数组A 中。例如,对N =8, A (0),A (1),A (2),…,A (7)中依次存放着x (0),

x (1), …, x (7)。对x(n)的重新排序(倒序)规律如图2.6所示。

图2.6倒序规律

三、实验仪器

计算机

四、实验要求及内容

用所学过的编程语言,自行设计出一个按时间抽取的、输入倒位序、输出顺序的基-2 FFT 算法程序。

五、实验报告

(1)简述实验目的及原理;

(2)画出程序流程框图;

(3)主要给出实验内容的程序(要求程序模块化并加注释)。

程序流程框图

实验的程序

#include #include

#include

#define PI 3.1415926 class Plural//复数类{

float real;//实部

float img;//虚部

public:

Plural(float r,float i)

{

real=r;

img=i;

}

Plural(float r)//通过构造函数重载使用数与复数乘法

{

real=r;

img=0;

}

Plural()

{

real=0;

img=0;

}

friend Plural* fft(float X[],int n); //fft();

friend Plural operator *(Plural p1,Plural p2);//重载乘法运算符

friend Plural operator -(Plural p1,Plural p2);//重载减法运算符

friend Plural operator +(Plural p1,Plural p2);//重载加法运算符

friend Plural* daoxu(Plural* x[],int n); //倒序

Plural operator =(Plural p) ; //重载赋值符号

friend Plural W(int N,int i) ; //生成旋转因子

void show() ; //输出real+imgi

};

Plural operator *(Plural p1,Plural p2)//复数乘法

{

return Plural(p1.real *p2.real -p1.img *p2.img ,p1.real *p2.img +p1.img *p2.real ); }

Plural operator +(Plural p1,Plural p2)//复数加法

{

return Plural(p1.real+p2.real,p1.img +p2.img );

}

Plural operator -(Plural p1,Plural p2)//复数加法

{

return Plural(p1.real-p2.real,p1.img -p2.img );

}

Plural Plural::operator =(Plural p) //重载赋值符号

{

real=p.real ;

img=p.img ;

return *this;

}

//********************生成旋转因子***************************

Plural W(int N,int i)

{

float r;

float im;

r=(float)cos(2*PI*float(i)/float(N));

im=(float)sin((-1)*2*PI*float(i)/float(N));

return Plural(r,im);

}

//*********************输出函数show()************************* void Plural::show() //输出real+imgi

{

if(real==0){

if(img==0)

cout<<0<<" ";

else

cout<

}

else{

if(img<0)

cout<

else

if(img==0)

cout<

else

cout<

}

}

/************2的n次方*******************/

int mi2(int n)

{

int m=1;

for(int i=0;i

m*=2;//m=2^n

}

return m;

}

/*************由二进制数转化为十进制数******************/

int twoten(int xu[],int i)

{

int m=0;

for(int j=0;j

m+=xu[j]*mi2(i-j-1);//m=xu[0]*1+xu[1]*2+xu[2]*4+xu[3]*8+xu[4]*16+...

}

return m;

}

/*************对二进制数倒序加一*****************/

void add(int xu[],int i)

{

xu[0]++;

for(int j=0;j

if(xu[j]==2){

xu[j]=0;

xu[j+1]++;//例如xu[]=0000,1000,0100,1100,0010......

}

}

}

/*************倒序**********************************/

void daoxu(Plural x[],int n)

{

float m=float (n);

int i=0;

for(i=0;m>1;i++)//得到n是2的多少次方

{

m/=2;//m=log(n)/log(2)

}

int M=mi2(i);

int* xu=new int[i];//定义一个长度为i的数组,当做2进制数

for(int j=0;j

xu[j]=0;

}

Plural* jia=new Plural[M];//定义一个长度为M的数组jia,以保存倒序for(j=0;j

int mm;

mm=twoten(xu,i);//得到数组xu[]所对应的十进制数

jia[j]=x[mm];

add(xu,i);//二进制数组最左端加1

}

for(j=0;j

{

x[j]=jia[j];

}

if(jia)

delete[] jia;

}

//***************快速傅里叶变换FFT()************************* Plural* fft(Plural X[],int m)

{

int n=1;

for(;m>mi2(n);n++);//得到m等于n次方

Plural* A=new Plural[m];

for(int i=0;i

{

for(int j=0;j

{

for(int k=0;k

{

int m,n;

m=k+j*mi2(i+1);

n=k+mi2(i)+j*mi2(i+1);

Plural a1,a2;

if(i==0){

a1=X[m]+W(mi2(i+1),k)*X[n]; //蝶形运算

a2=X[m]-W(mi2(i+1),k)*X[n];//蝶形运算

A[m]=a1;

A[n]=a2;

}

else{

a1=A[m]+W(mi2(i+1),k)*A[n]; //蝶形运算

a2=A[m]-W(mi2(i+1),k)*A[n];//蝶形运算

A[m]=a1;

A[n]=a2;

}

}

}

}

for(i=0;i

{

X[i]=A[i];

}

delete[] A;

return X;

}

/****************************主函数*******************/ void main()

{

int N=0;

cout<<"输入变换的点数N:"<

cin>>N;

Plural *x=new Plural[N] ;

cout<<"数据实部:虚部(少于N点时以#结束):"<

for(int i=0;i

char s;

float x1,x2;

cin>>x1;

s=(char)x1;

if(s=='#')

{ break;}

else{

cin>>x2;

x[i]=Plural(x1,x2);

}

x1=0;

x2=0;

}

cout<< "您输入的数组:"<

for( i=0;i

x[i].show();

if((i+1)%4==0)

cout<

}

cout<

daoxu(x,N);//调用倒序daoxu()函数

cout<< "倒序后的数组:"<

for( i=0;i

x[i].show();

if((i+1)%4==0)

cout<

}

cout<

x=fft(x,N);//调用fft()函数

cout<< "FFT变换后数组"<

for( i=0;i

x[i].show();

if((i+1)%4==0)

cout<

}

if(x)

delete[] x;

}

通过本次实验:

1、加深了对DFT算法原理和基本性质的理解;

2、熟悉了FFT算法的流程;

3、了解FFT算法的应用。

软件开发报价和报价材料模板的计算方法

软件开发报价的计算方法 1.软件开发价格估算方法软件开发价格与工作量、商务成本、国家税收和企业利润等项有关。为了便于计算,给出一个计算公式: 软件开发价格=开发工作量× 开发费用/人·月 1.1 开发工作量软件开发工作量与估算工作量经验值、风险系数和复用系数等项有关:软件开发工作量=估算工作量经验值× 风险系数× 复用系数 1.1.1 估算工作量经验值(以A 来表示)软什开发工作量的计算,曾有人提出以源代码行或功能点来计算,这些方法实施起来均有不少难度。目前国际上仍旧按以往经验的方式加以计算,国内各软件企业也是采用经验的方式加以估算工作量。 1.1.2 风险系数(以σ 来表示)估算工作量经验值亦会存在较大风险,造成软件危机的因素很多,这也是一个方面的因素。特别当软件企业对该信息工程项目的业务领域不熟悉或不太熟悉,而且用户又无法或不能完整明白地表达他们的真实的需求,从而造成软件企业需要不断地完善需求获取,修改设计等各项工作。因此: l ≤风险系数≤1.5 根据我们对软件企业的了解,超过估算工作量经验值的一半,已是不可接受,所以我们确定“ 1.5 ”为极限值。当然这既要看企业的能力,也要看用户能接受的程度。 1.1.3 复用系数(以τ 来表示)估算工作量经验值是软件企业承担一般项目来估算的,但如果软件企业已经采用“基于构件的开发方法” ,并己建立起能够复用的构件库(核心资产库),或者已有一些软件产品,仅作二次开发,从而使软件开发工作量减少。因此: 0.25 ≤复用系数≤1 根据国内外软件企业在实施基于构件开发方法(软件产品线)的经验数据,提高工作效率达到25%(最高值)。 1.2 开发费用/人·月软件企业的商务成本、国家税收、企业利润、管理成本和质量成本。均可摊分到各个软件开发人员头上。 开发费用/人·月=(P+Q+R)× S× τ 1.2.1 P (人头费)人头费主要是员工的工资、奖金和国家规定的各项按人计算的费用。其总量在软件企业中的商务成本占70%-80%。 P =B × 1.476 国家规定的公积金7%,医疗保险金12%,养老金22%,失业金2%(即通常所说的四金),另外还有按工资总额计征的工伤保证金0.5%,生育保证金0.5%,残疾基金 1.6%,工会基金2%,累计为47.6%。 B 为平均工资,即企业支付给员工的工资、奖金、物质奖励等多项总和,除以企业员工数,分摊到每个月。 1.2.2 Q (办公费)办公费包括企业办公房屋租赁费和物业管理费、通信费、办公消耗品、水电空调费、设备折旧、差旅费,另外也包括企业对员工的在职培训所支付的费用,其总量在软件企业中的商务成本占20%-30%。 Q =B/3 此处办公费用按商务成本的25%计算。 1.2.3 R (国家税收和企业利润)由于国家实施发展软件产业的优惠政策,故不单独列出计算,但软件企业仍需承担缴纳国家税收的义务,可一并与企业利润一起考虑。另外,软件企业的员工不可能全年满负荷地工作,即使一年十二个月都安排工作,但也需抽出时间进行在职培训和提职的岗前培训。据我们的了解,软件企业的员工一

大林控制算法与其软件实现

3.4 大林(Dahlin)算法 前面介绍的最少拍无纹波系统的数字控制器的设计方法只适合 于某些随动系统,对系统输出的超调量有严格限制的控制系统它并不理想。在一些实际工程中,经常遇到纯滞后调节系统,它们的滞后时间比较长。对于这样的系统,往往允许系统存在适当的超调量,以尽可能地缩短调节时间。人们更感兴趣的是要求系统没有超调量或只有很小超调量,而调节时间则允许在较多的采样周期内结束。也就是说,超调是主要设计指标。对于这样的系统,用一般的随动系统设计方法是不行的,用PID算法效果也欠佳。 针对这一要求,IBM公司的大林(Dahlin)在1968年提出了一种针对工业生产过程中含有纯滞后对象的控制算法。其目标就是使整个闭环系统的传递函数相当于一个带有纯滞后的一阶惯性环节。该算法具有良好的控制效果。 3.4.1 大林算法中D(z)的基本形式 设被控对象为带有纯滞后的一阶惯性环节或二阶惯性环节,其传递函数分别为: (3-4-1) (3-4-2)

其中为被控对象的时间常数,为被控对象的纯延迟时间,为了简化,设其为采样周期的整数倍,即N为正整数。 由于大林算法的设计目标是使整个闭环系统的传递函数相当于 一个带有纯滞后的一阶惯性环节,即 ,其中 由于一般控制对象均与一个零阶保持器相串联,所以相应的整个闭环系统的脉冲传递函数是 (3-4-3)于是数字控制器的脉冲传递函数为 (3-4-4)D(z)可由计算机程序实现。由上式可知,它与被控对象有关。下面分别对一阶或二阶纯滞后环节进行讨论。 3.4.2 一阶惯性环节的大林算法的D(z)基本形式 当被控对象是带有纯滞后的一阶惯性环节时,由式(3-4-1)的传递函数可知,其脉冲传递函数为 将此式代入(3-4-4),可得

10大算法R实现

10大算法R实现 国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART. 不仅仅是选中的十大算法,其实参加评选的18种算法,实际上随便拿出一种来都可以称得上是经典算法,它们在数据挖掘领域都产生了极为深远的影响。 1. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. C4.5算法继 承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足; 2) 在树构造过程中进行剪枝; 3) 能够完成对连续属性的离散化处理; 4) 能够对不完整数据进行处理。 C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过 程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。 2. The k-means algorithm即K-Means算法 k-means algorithm算法是一个聚类算法,把n的对象根据他们的属性分为k个分割,k < n。它与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。它假设对象属性来自于空间向量,并且目标是使各个群组内部的均方误差总和最小。 3. Support vector machines 支持向量机,英文为Support Vector Machine,简称SV机(论文中一般简称SVM)。它 是一种監督式學習的方法,它广泛的应用于统计分类以及回归分析中。支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面

SM4算法软件实现

SM4算法实现 说明:该SM4算法是8位单片机Keil C51纯软件实现

目录 SM4算法手册 (1) 目录 (2) 1.数据类型定义 (3) 2.函数接口说明 (3) 3.1 初始化SM4模块 (3) 3.2 关闭SM4模块 (4) 3.3 SM4加解密 (4) SM4算法的工作模式图解 (4) 源码SM4算法例程 (6)

1.数据类型定义 typedef unsigned char U8; typedef singed char S8; typedef unsigned int U16; typedef signed int S16; typedef unsigned long U32; typedef signed long S32; 2.函数接口说明 SM4算法库包含的函数列表如下: 表2-1 SM4算法库函数表 3.1初始化SM4模块 SM4_Init 初始化SM4模块 函数原型void SM4_Init( U8 *key) 参数说明 key 输入,指向密钥的指针 注意事项SM4加解密前,先调用此函数,进行密钥扩展例程见附录一SM4算法库函数调用例程。

3.2关闭SM4模块 SM4_Close 关闭SM4模块 函数原型void SM4_Close(void) 参数说明 注意事项SM4加解密后,调用此函数 例程见附录一SM4算法库函数调用例程。 3.3S M4加解密 SM4_Crypto SM4加解密 函数原型void SM4_Crypto(U8*in, U32 inLen, U8 En_De, U8 mode, U8 *iv,U8*out) 参数说明 in 输入,指向输入数组的指针 inLen 输入,输入的字节长度,必须为16的倍数,否则填充in使其长度为16的倍数 En_De 输入,指加密或是解密0:加密1:解密 mode 输入,0--ECB模式,1--CBC模式 iv 输入,指向扰乱向量的指针 out 输出,指向输出的指针 注意事项:大量数据分多块进行CBC模式加密或解密时,需注意: (1) 若是加密,则第X块数据(X>1)调用本函数进行加密,使用的初始向量IV 一定要更新为第X-1块数据调用本函数进行加密得到的密文的最后一个分组(16字节)。 (2) 若是解密,则第X块数据(X>1)调用本函数进行解密,使用的初始向量IV 一定要更新为第X-1块数据的最后一个分组(16字节)。 图解分析详如下 SM4算法的工作模式图解 SM4算法的工作模式有以下两种: 1.ECB(Electronic Code Book)

软件程序算法之间的关系

软件程序算法之间的关 系 文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-

软件—程序—算法之间的关系与区别 首先,要明白 软件 = 程序+文档 = 数据结构+算 法+文档(如右图所示) 另外,软件是包含程序 的有机集合体,程序是软件 的必要元素。任何软件都有可运行的程序,至少一个。比如:操作系统给的工具软件计算器等,很多都只有一个可运行程序。而Office 是一个办公软件包,却包含了很多可运行程序...... 严格来说程序指用编程语言编制的完成特定功能的软件.程序从属于软件.软件除包含程序外,一般把各种资料文档等也包括在内。 软件是程序以及开发、使用和维护所需要的所有文档的总称,而程序是软件的一部分。 算法就是程序的灵魂,一个需要实现特定功能的程序,实现它的算法可以有很多种,所以算法的优劣决定着程序的好坏。程序员很熟练的掌握了程序设计语言的语法,进行程序设计,软件开发的时候就是设计好的算法,加上软件工程的 理论才能做出较好的系统。 软件是包含程序的有机集合体,程序是软件的必要元素。任何软件都有可运行的程序,至少一个。比如:操作系统给的工具软件,很多都只有一个可运行程序。而Office 是一个办公软件包,却包含了很多可运行程序 软件 程序 算法之间的

软件是程序以及开发、使用和维护所需要的所有文档的总称,而程序是软件的一部分。 一般一款软件具有起自身的各种各样的功能,而程序一般执行专一的命令。软件一般都是由很多程序组成的,每条程序在其中做着比较固定的工作。软件就好比是工程,程序就好比是工人 程序是通过计算机语言写出来的具有许多算法的摸板,是实现软件功能的底层推手(推手的意思可以理解为动力)。所以,程序是软件的内在因子,而软件是一个或多个程序通过编译器编译出来的成品。 打个比方,软件是一件衣服,那程序就是材料。软件是由许多能实现某些固定任务的程序的集合 也就是说,软件是由许许多多的程序组合而成的。程序是由编程人员通过某种编程语言,编写出来能实现某些固定任务的代码。 可这么说,编程人员能过通过C语言或其他某种语言,编写出一些能实现任务某些固定任务的函数,再把这些函数集合起来,通过编译程序编成软件,也就是我们通常在电脑上用的各种软件了。

算法的程序实现

第三单元算法的程序实现 一、知识内容 (一)枚举算法及程序实现考试要求:对所列知识要理解其确切含义及与其它知识的联系,能够用所学的信息技术知识和操作方法解决实际问题,熟练应用信息技术进行信息的处理。 枚举算法的基本思想是根据问题的本身性质,一一列举出该问题所有可能的情况,并根据题目的条件逐个作出判断,从中挑选出符合条件的解答。 枚举算法属于搜索策略,适用于那些解变量确定的连续值域的问题。设置枚举算法要列举出所有可能的情况,不能遗漏,也不能重复。 (二)解析算法及程序实现考试要求:对所列知识要理解其确切含义及与其它知识的联系,能够用所学的信息技术知识和操作方法解决实际问题,熟练应用信息技术进行信息的处理。 解析算法的基本思想是用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表达式,并通过数学表达式的计算来实现问题的求解。 (三)排序算法及程序实现考试要求:对所列知识要理解其确切含义及与其它知识的联系,能够用所学的信息技术知识和操作方法解决实际问题,熟练应用信息技术进行信息的处理。 1.冒泡排序 冒泡排序的基本思想是在待排序的数据中,先找到最小(大)的数据将它放到最前面,再从第二个数据开始,找到第二小(大)的数据将它放到第二个位置,以此类推,直到只剩下最后一个数据为止。 2.选择排序 选择排序的基本思想是在所有的记录中选出最小(大)的数据,把它与第一个数据交换,然后在其余的记录中再选出最小(大)的数据与第二个数据交换,依此类推,直至所有数据排序完成。 (四)查找算法及程序实现考试要求:对所列知识要理解其确切含义及与其它知识的联系,能够用所学的信息技术知识和操作方法解决实际问题,熟练应用信息技术进行信息的处理。 1.顺序查找 顺序查找的基本思想是从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较,若某个数据和给定值相等,则查找成功,找到所查数据的位置;反之,查找不成功。 2.对分查找 对分查找的基本思想是在有序的数据列中,首先将要查找的数据与有序数组内处于中间位置的数据进行比较,如果两者相等,则查找成功;否则根据数组元素的有序性,就可确定该数据应该在数组的前半部分还是后半部分继续进行查找;在新确定的范围内,继续按上述方法进行查找,直到找到要查找的数据,使查找成功,或直到子表不存在,查找不成功。 对分查找的条件是被查找的数据必须是有序的。 (五)递归算法 考试要求:对所列知识要知道其内容及含义,并能用自己的语言或动作进行表达、判断和直接运用。

基-2FFT算法的软件实现

实验二 基-2FFT 算法的软件实现 一、实验目的 1、 加深对DFT 算法原理和基本性质的理解; 2、 熟悉FFT 算法的流程; 3、 了解FFT 算法的应用。 二、基本原理 1、 DFT 算法原理 (见教材第三章) 2、按时间抽取(DIT )的-2FFT 算法 (1)算法原理 序列x (n )的N (N =2-M )点DFT 为 kn N N n N W n x n x DFT k X ∑-===1 0)()]([)(点,k =0, 1, …, N -1 (2.1) 将式(2.1)按n 的奇偶性分解为 )12(1 2/212/)12()2()()()(+-=-===∑∑∑∑++ = + = l k N N n l k N N n kn N n kn N n W l x W l x W n x W n x k X 奇数 偶数 奇数 偶数 (2.2) 令)2()(1l x l x =, )12()(2+=l x l x ,因为kl N l k N W W 2/2=, 所以式(2.2)可写成 )12(2 /1 2 2 /1 2/0 12)()()(+--=-=∑∑+= l k N M n k N kl N N l W l x W W l x k X 奇数 (2.3) 式(2.3)说明,按n 的奇偶性将x (n )分解为两个N /2长的序列x 1(l )和x 2(l ),则N 点DFT 可分解为两个N /2点DFT 来计算。用X 1(k )和X 2(k )分别表示 12 ,..., 1,0 )()]([)(1 2/0 2 /12/11-== =∑-=N k W l x l x DFT k X N l kl N N 点 (2.4) 12 ,..., 1,0 )()]([)(1 2/0 2/22/22-== =∑-=N k W l x l x DFT k X N l kl N N 点 (2.5)

Dijkstra算法完整实现源代码

Dijkstra算法的完整实现版本,算法的源代码 /* Dijkstra.c Copyright (c) 2002, 2006 by ctu_85 All Rights Reserved. */ #include "stdio.h" #include "malloc.h" #define maxium 32767 #define maxver 9 /*defines the max number of vertexs which the programm can handle*/ #define OK 1 struct Point { char vertex[3]; struct Link *work; struct Point *next; }; struct Link { char vertex[3]; int value; struct Link *next; }; struct Table /*the workbannch of the algorithm*/ { int cost; int Known; char vertex[3]; char path[3]; struct Table *next; }; int Dijkstra(struct Point *,struct Table *); int PrintTable(int,struct Table *); int PrintPath(int,struct Table *,struct Table *); struct Table * CreateTable(int,int); struct Point * FindSmallest(struct Table *,struct Point *);/*Find the vertex which has the smallest value reside in the table*/ int main() { int i,j,num,temp,val; char c; struct Point *poinpre,*poinhead,*poin; struct Link *linpre,*linhead,*lin; struct Table *tabhead;

控制系统的基本算法及软件实现

本文由tk_06贡献 pdf1。 雯野寻孤 控 制 系统 的 基 本 算 法 及 软 件 实现 B a s ic A l g o r ith m a n d S o f tw a r e Im ple m e n ta t io n o f Co n tr o l S y s te m 吕卫 阳 男 , 工 学博士 , 副 教授 , 现 就 职干 北 京科 , 技 大 学 机 械 工 程 学 院 机 械 电子 工 程 系 电 系统 技 术 主 要 研 究 方 向 为 工 业 控 制 及 自动 化 和 先 进 机 . 摘 要 : 本 文 讨 论 了 有 关 控 制 系 统 的 基 本算 法 及 软 件 实 现 的 若 干 问 题 绍 块 了 线性 控 制 系统 的 8 . . 介 同 的 数学 模型 , 亦即具 有相 同 的 动态特性 . 在控制 工 程 中 , 个典 型环 节 ,

常 常将 具 有 某 种 确 定 信 息 传 递 关 系 的 元 件 一 , 元 件组 或 元 件 的 . 介绍 T P ID a s 控 制 的 基 本 原 理 及 离 散算 法 , 给 出 了 能 够 实现 P l D 基 本算法 部分称为 , 一 个环 节 , 经 常 遇 到 的 环 节 则 称 为典 型 环 节 一 这 , 的 功 能块 B ic P ID 并 举 例说 明 P ID . 样 化 任 何复杂的 系统 总 可 以 归结 为 由 些 典 型 的 环 节组 成 , 关键 词 ; 典型 环 节 ; 算法 ; 软 件 实现 从 而 为建立 系统 模 型 和 研 究 系统特性带 来方便 . 使 问题 简 A bs tr c o n tr o c o n a c t s : So m e m to p ic s o n th e b a s ic a lg o r

相关主题
文本预览
相关文档 最新文档