MATLAB程序算法

2024-10-12

MATLAB程序算法(共7篇)

MATLAB程序算法 篇1

0 引言

蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在其博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为[1]。

1 蚁群算法

1.1 基本原理

蚂蚁在路径上前进时会根据前边走过的蚂蚁所留下的分泌物选择其要走的路径。其选择一条路径的概率与该路径上分泌物的强度成正比。因此,由大量蚂蚁组成的群体的集体行为实际上构成一种学习信息的正反馈现象:某一条路径走过的蚂蚁越多,后面的蚂蚁选择该路径的可能性就越大。蚂蚁的个体间通过这种信息的交流寻求通向食物的最短路径[2]。

蚂蚁的群体协作功能是通过一种遗留在其来往路径上的具有挥发性的化学物质——信息素(Pheromone)来进行通信协作的。通过研究发现,整个蚂蚁群体就是通过信息素相互通信、相互协作来共同完成对路径的寻找[3]。

1.2 数学模型

蚁群算法最早应用于解决旅行商问题,即TSP问题(Traveling Salesman Problem)。这是数学领域中著名问题之一,其可以简单描述为:给定n个城市,有一个旅行商从某一城市出发,访问各城市一次且仅有一次后再回到原出发城市,要求找出一条最短的巡回路径[4]。

设蚂蚁的数量为m只,随机的放在n个城市上, dij(j,j=1,2,…,n)表示城市i和城市j之间的距离,τij(t)表示t时刻城市i和城市j之间路径上信息素的浓度,初始时刻(即t=0时)为τij(0)=C(C为常数),某只蚂蚁选择下一个访问城市是根据各个城市间路径上的信息素浓度来决定的,设Pkij(t)为t时刻蚂蚁k(k=1,2,…,n)从城市i访问城市j的转移概率:

Ρijk(t)={[τij(t)]a[ηij(t)]βSallowk[τij(t)]a[ηij(t)]β,jallowk0,jallowk(1)

式(1)中,ηij(t)为启发函数,这里取为1/dij;α为信息素启发因子,其值越大说明信息素的浓度在转移中起的作用越大;β为期望启发因子,其值越大说明启发函数在转移中起的作用越大;allowk(k=1,2,…,m)表示蚂蚁k下一步允许访问的城市集合。

ρ为信息素的挥发系数,则可通过下式来进行信息素的更新:

{τij(t+1)=(1-ρ)τij(t)+ΔτijΔτij=k=1mΔτijk0Ρ1(2)

式(2)中,τij(t+1)表示t+1时刻城市i和城市j之间信息素的浓度,其值等于上一时刻(即t时刻)所残留的信息素浓度加上这一时刻(即t+1时刻)所有蚂蚁刚释放的信息素浓度,Δτijk表示第k只蚂蚁在城市i和城市j之间的路径上所释放的信息素的浓度,则Δτij表示m只蚂蚁在城市i和城市j之间所释放的信息素浓度之和。

关于Δτijk的计算,M.Dorigo等人给出了三种算法模型,这里选择第一种,即ant-cycle system模型:

Δτijk={QLk,ki访j0,(3)

式(3)中,Q为常数,表示蚂蚁循环一次所释放的信息素的总量;Lk为蚂蚁k经过的路径长度。

2 用Matlab实现蚁群算法

Matlab是一个功能强大的科学计算和工程计算软件,集成了计算、分析、仿真和可视化等诸多功能,特别是其强大的矩阵运算功能,对于编写蚁群算法有很大的优势[5]。

2.1 基本步骤

用蚁群算法解决TSP问题的步骤如图1所示。

2.1.1 数据的初始化

这个步骤主要完成以下数据的初始化:①通过已知的n个城市坐标,求得每两个城市间的距离并保存在距离矩阵中;②初始化信息素矩阵;③初始化算法参数;④初始化记录数据的变量及矩阵。

2.1.2 通过算法寻找最优路径

运行算法,通过迭代来计算最优路径,直到满足终止条件。

2.1.3 结果分析

通过运行程序,对输出的结果数据进行分析,通过修改不同的参数值,从而得到一组最优的参数组合。

2.2 具体实现

蚁群算法的具体实现如下:

Step 1 参数初始化。

Step 2 随机分布m只蚂蚁于n个城市。使用Matlab中的随机函数将m只蚂蚁随机的放在n个城市中。

Step 3 构建禁忌表。构建禁忌表tabu,将已经访问的城市放入tabu中。

Step 4 计算转移概率选择下一访问城市。根据式(1)来选择下一个要访问的城市。

Step 5 计算各蚂蚁路径距离。每一次迭代都要计算一次各蚂蚁的本次路径长度。

Step 6 计算最短路径距离和平均距离。计算当前迭代次数的最短路径距离和平均距离。

Step 7 更新信息素。根据式(2)更新信息素。

Step 8 迭代次数加1。

Step 9 判断迭代次数是否小于等于最大迭代次数,若迭代次数小于等于最大迭代次数,则跳转到Step 2,否则输出结果。

整个步骤的算法框图如图2所示。

2.3 运行结果及分析

结果数据以图表的形式展示出来,如图3和图4所示分别为蚁群算法最短路径和各代的收敛情况。

从图中可以看出,本算法得到的最短距离为15601.9195km,而最短距离在迭代了100次以后基本上就接近最短路径了,平均距离也在迭代次数达到100次后趋于平缓。程序运行的输出结果为:

Elapsed time is 119.372972 seconds

最短距离:15601.9195

最短路径:14 12 13 11 23 16 5 6 7 2 4 8 9 10 3 18 17 19 24 25 20 21 22 26 28 27 30 31 29 1 15 14

从理论上来讲,蚂蚁个数的不同,会导致运行的结果不同。在其他参数不变的情况下,蚂蚁越多,最后运行的结果越接近最优值。这里就蚂蚁个数m对结果的影响进行了试验,蚂蚁数分别为5,10,15,…,100,每组都运行程序30次,对所得结果分析,取出最大值、最小值和平均值,结果如表1所示。

使用Matlab将表1所得平均最短距离和蚂蚁个数生成图表可以清晰的反映出蚂蚁个数对平均最短距离的影响,如图5所示。

从图5可以看出,随着蚂蚁数量的增多,所取得的平均最短距离也在趋于平缓,接近15602。

3 结束语

通过在Matlab上运行蚁群算法,实现了蚁群算法解决TSP问题的目的,调整程序中的蚂蚁个数,得到了不同数量蚂蚁情况下的最短距离,验证了蚂蚁数量的增多更利于求解最优解的想法,为以后的实际问题如车辆运输问题、人员疏散问题提供了依据。

摘要:蚁群算法是近些年来兴起的一种智能算法,具有较强的鲁棒性。介绍了蚁群算法的工作原理和数学模型,并提出了基于Matlab的算法程序步骤,以旅行商问题进行了算法实现,给出了运行的最优结果。就蚂蚁个数的不同对结果的影响进行了深入研究,为蚁群算法在实际问题中的改进提供了借鉴。

关键词:蚁群算法,信息素,旅行商问题

参考文献

[1]高尚,杨静宇.群智能算法及其应用[M].北京:中国水利水电出版社,2006:34-36.

[2]段海滨.蚁群算法原理及其应用[M].北京:科学出版社,2005:1-18.

[3]多里戈,施蒂茨勒.蚁群优化[M].北京:清华大学出版社,2007:98-110.

[4]段海滨,张祥银,徐春芳.仿生智能算法[M].北京:科学出版社,2011:36-48.

[5]史峰,王辉,郁磊,等.MATLAB智能算法30个案例分析[M].北京:北京航空航天大学出版社,2011:205-215.

MATLAB程序算法 篇2

关键词:层次分析法,Excel,matlab

1层次分析法(AHP法)的原理和解决思路

层次分析法是对定性问题进行定量分析的一种简便、灵活而又实用的多准则决策方法。它的原理是模拟人的决策过程,具有思路清晰、方法简便、适用面广、系统性强等特点。是解决多目标、多准则、多层次复杂问题决策或者大型工程风险分析的有力工具。

层次分析法解决问题的思路就是用下一次因素的相对排序求得上一次因素的相对排序。按照因素之间的相互影响和隶属关系将各层次因素聚类组合,形成一个递进有序的层次结构模型。

2层次分析法的应用难点

2.1合适的判断矩阵构造不易

模型确定后,按照模型层次结构和模型的各因素的相对重要性,综合专家群体咨询意见,采用标度法[1],从数字1/9一9中选取恰当值,构造各层的判断矩阵,并使之尽量符合一致性检验,这一步成为问题的关键。但实际上系统越复杂,判定矩阵的阶数就会越高,计算就会越困难。

2.2计算量大,步骤繁琐

层次分析法首先要求的就是判断矩阵的最大特征值λmax,及其正规化的特征向量w,向量w的分量wi是相应因素的单层次权值,这部分计算理论上基于线性代数知识,不用计算机也可以将其计算出来。但实际上,当矩阵的阶数高于4阶时,人工计算就变得相当困难且易出错,如使用计算机计算,就容易得多,常用的方法有Basic语言,电子表格Excel等方法。但计算量都有待改进。

2.3不符合一致性检验时,数据调整变得困难

层次分析法的计算是要得到一个符合一致性检验的结果,否则排序结果没有实际意义。一旦计算结果不满足一致性检验,就得调整数据重新算一遍,令人不胜其烦,工作量增加一倍,出错的可能性也大大增加。实际构造高阶矩阵的过程中,一次成功符合一致性检验的机会并不多,“返工”是常态。

2.4以上难点对层次分析法的影响

使用层次分析法如果不能很好的处理其中的计算,那么就会给该方法的学习、推广和应用带来困难。使人失去学习该方法的耐心,在弄不清,算不出来的心理影响下,减少了层次分析法在各领域的应用。

3用Matlab程序实现层次分析法的步骤

为了解决以上难题,简化层次分析法的计算,让该方法变得简单易学,我们使用Matlab软件,设计简单的程序,输入数据即可得到相应的单层次排序和总层次排序,以及一致性检验的结果。

3.1使用层次分析法步骤简介

使用层次分析法步骤,建立层次结果模型、构造判断矩阵、计算特征向量w,最大特征值,一致性指标、随机一致性指标、随机一致性比例CI,RI,CR(RI为随机计算10次得到的平均值为已知)[1],并判断是否满足一致性。

3.2用实例说明计算过程

例:某房地产投资公司准备在某市内建一高档社区,现对市中心、外三环、市郊三种可供选择的地理位置进行选取,其中要考虑的因素包括居住、消费、价格、交通、建筑质量,请问哪种选址企业的收益最大?

(1)根据题意建立层次分析模型如下:

(2)判断矩阵的特征值和一致性检验的计算:

(3)使用Matlab软件编程

判断矩阵B1(方案层的三个方案对第一个准则居住)的特征值和一致性检验

按上述方法我们可以对判断矩阵B2,B3,B4,B5求最大特征值和进行一致性检验

(3)方案层C(三种方案)对准则层B(其他四个准则B2,B3,B4,B5)的权重

(4)将影响决策的各因素对各方案的权重加权取平均数可得三个方案综合评价排序结果,总排序w=(0.38876,0.38202,0.21664),可知方案C3优于方案C2,更优于方案C1。

4层次分析法Matlab算法的总结

层次分析法Matlab算法可以使用目前广泛使用的Matlab软件作为运算平台,多数人都会使用,不需要掌握Matlab知识,只需把本文应用程序换上数字即可运算。运算速度快、效率高、计算结果精确,误差小,计算最大特征值的同时可进行一致性检验,如果不符合一致性检验,重新调整数据非常简单。

本文的方法解决了层次分析法看起来简单,但计算难度大的问题,克服了传统算法应对高阶矩阵的无奈,同时还解决了传统算法不利于反复检验的问题,使得大量数学计算不再是层次分析法学习使用者的障碍,对层次分析法在各学科中的推广和应用可以起到一定的积极作用。

参考文献

[1]Saaty T L.层次分析法[M].许树柏译.北京:煤炭工业出版社,1998.

[2]于晶.基于AHP的太阳能建筑应用项目风险管理[J].科技经济市场.2016,2(1):212-213

[3]先锋.电子表格(Excel)实现层次分析法(AHP)的简捷计算[D].广州:华南农业大学,2004.

MATLAB程序算法 篇3

关键词:认证水印,MATLAB,篡改检测

1 图像认证水印算法设计

基于分块的认证算法是一种常见的认证技术, 本文设计的算法是:图像2×2不重叠分块, 提取图像分块的灰度均值并量化为8比特的精确值, 经混沌logistic映射加密和确定嵌入位平面后, 嵌入到原始图像所有像素的2个最低有效位中;在图像需要认证时, 提取图像中水印信息和重新计算图像分块灰度均值, 经加密和确定嵌入位平面后生成参考水印, 比较提取的水印信息与参考水印, 若相同则通过认证, 反之判定为篡改。在认证检测过程中, 不需要原始图像和任何有关水印的附加信息, 保证了水印的安全性和保密性, 实现对图像内容完整性认证和篡改的精确定位。

为便于算法描述, 我们考虑一幅静止灰度图像I, 其大小为M×N像素, 其中M和N都为2的整数倍。水印的生成和嵌入框图如图1所示。

对于认证水印系统而言, 因为一般用户得到的是己经过篡改的图像, 原始图像用户是没有办法知道的, 一般情况下如果已经知道原始图像的话就没有必要再进行完整性检验了, 所以水印的检测必须实现盲检测。水印检测及定位过程如下:

2 认证水印的MATLAB程序实现

2.1 MATLAB特点

MATLAB是一种面向科学与工程计算的高级语言, 具有的优点有: (1) 编程效率高; (2) 扩充能力强, 交互性好; (3) 方便的绘图功能; (4) 功能强大的工具箱。提供了图像处理工具箱、小波分析工具箱; (5) 移植性和开放性好; (6) MATLAB与C语言具有良好的接口。

2.2 认证水印的MATLAB程序实现

2.2.1 水印的生成和嵌入

2.2.2 水印的检测和定位

2.2.3 水印的不可见性

使用峰值信噪比 (PSNR, Peak Signal to Noise Ratio) 来评价嵌入水印后的图像和原始图像之间的差别, 代码如下:

下面表1是不同图像嵌入水印前后PSNR的实验结果。

从表1中可以看出所有图像的峰值信噪比都达到了44d B以上, 完全满足了认证水印对不可见性的要求。

2.3 实验结果

对图像大小为512×512像素的“lena.tif”8位灰度图, 图3给出了实验结果, 其中 (a) 为原始图像; (b) 是嵌入水印后的图像, 与原图像相比在视觉效果上看不出差别也看不出降质。 (c) 是在 (b) 中进行篡改, 加上一幅墨镜和“lena”字样, 即篡改含水印的图像; (d) 是其篡改定位结果 (白色区域表示篡改位置) 。

另外, 我们对算法进行改进, 应用于对24位真彩色图像的认证。下面对图像大小为320×256像素“football.bmp”的进行进行篡改检测实验, 如图4所示。在图4中原始图像 (a) 和嵌入水印信息后的图像 (b) 在人类主观观察效果上看不出它们的差别;图像 (c) 是把 (b) 中的字母‘G’改为‘C’;经检测认证得出图像 (d) 是其篡改定位结果。

从以上图3和图4中可以看出由于采用了8比特位来精确地表示图像块的灰度均值, 因此, 在图像块中哪怕有一个比特的细微改变都能够检测出来, 即能准确定位到图像改变的块, 完全满足了认证水印敏感性要求。

参考文献

[1]张宪海, 杨永田.基于脆弱水印的图像认证算法研究[J].电子学报, 2007 (1) .

[2]ZHU B B, SWANSON M D, TEWFIK A H.When seeing isn't believing[J].IEEE Signal Process Mag, 2004 (10) .

[3]OUDA A H, El-SAKKA M R.Localization and security enhanceme-nt of block-based image authentication[C].Proceedings of IEEE International Conference on Image Processing.2005.

MATLAB程序算法 篇4

在进行电路分析和设计时,常使用Proteus、Multisim、EWB、OrCAD(Spice)、Protel等电路分析工具。但用这些软件来分析电路,所得数据精度难以提高,且软件界面固定,设计出的模型很难脱离分析环境独自运行。现代电路分析提供了一种用矩阵方式分析电路问题的解决方法,这种方法也是以上电路分析软件的基础,Matlab包含许多矩阵函数,可以快速地验证自己的模型和算法。虽然Matlab作为一种解释性语言,运行效率较低。但如果使用VC++6.0调用Matlab C++数学库,就可以编写出具有良好人机界面、运行效率较高、个性化的电路分析程序。

现代电路分析把基本的电路定律,即基尔霍夫电流定律(KCL)、基尔霍夫电压定律(KVL)和元件支路方程结合起来,建立网络方程组,主要用于研究线性时不变网络。该分析方法利用拓扑学的基本原理将电路图转换成矩阵形式,在电路图和计算机之间架起一座桥梁,即实现电路信息的计算机化。Matlab语言是一种解释型的高级语言,它包含自己的数据结构、程序流控制及文件输入输出等功能,并能很好地处理矩阵运算。其次,为了使程序的人机界面友好,Windows操作系统能支持的程序是较佳的选择,VC++6.0是Microsoft公司推出的可视化编程环境。主要适合在Windows下进行32位应用程序的开发。开发一个Win32应用程序是一件耗费时间的事,MFC即微软基础类是一种VC++语言类库,这样,利用VC++6.0的MFC功能来编制Win32程序时,程序员就能利用标准的类库来提高编程效率和程序的质量。Matlab6.5版本带有Matlab C++数学库,使程序员用VC++和Matlab混合编程更加容易。文中将具体介绍如何根据现代电路分析理论,采用节点分析法,使用VC++6.0和Matlab混合编程来编制Win32程序,有效解决线性电路电参数的计算机分析问题。

2 步骤

2.1 有向图

将电路转换成矩阵形式的第一步是要画出与电路对应的拓扑图,图1为示范用的电路。绘制该电路的拓扑图时,保留了电路的节点,并用线代替全部支路。有向图就是在拓扑图中加入表示对应支路电流方向的箭头,有向图表明节点和支路的连接关系,而不表明电路元件。图2就是与图1对应的有向图。

将电路转换成矩阵形式的第二步是要选择一个树。树是连接图的全部节点而不包含任何回路的支路的集合,组成树的支路叫树枝,不组成树的支路叫连支。在大部分网络中,存在着许多可能的树。由于树中无回路,基尔霍夫电压定律不能用来描述树枝电压之间的关系。因此,树枝电压是独立的。可以断定,在无独立电压源的情况下,网络中独立电压的个数等于树枝数。假定全部独立压源都包括在树里面,显然,每个独立压源都约束着一个节点相对于另一个节点的电压,因而使网络中独立电压的数目减少一个。同样,当每个连支加到图上而建立起一个回路时,该连支电流只在此回路中环流,因此连支电流是独立的。假定全部独立流源都作为连支包括进来,显然,每个独立流源都约束着一个连支电流,因此使网络中独立电流的数目减少一个。选择网络的树为选择独立变量最小集合提供了方法,根据这些变量能够求得全部网络电压和电流。

在利用树枝电压和连支电流的分析方法中,独立电源都假定他们与有限阻抗串联,或与有限阻抗并联。虽然有需要利用等效电路来处理的例外情况,但这在实践中是可行的。两种分析方法都要求定义如图3所示的标准支路。为了给下面的矩阵分析做准备,用下标r表示电路中第r支路的自阻抗或自导纳。

连支电流分析要求独立流源必须跨接在支路两端,树枝电压分析要求独立压源必须与阻抗Zrr相串联。对后面介绍的分析方法,戴维南定理可以用来将标准支路转化成简单等效电流源(Ir-YrrEr)或简单等效电压源(Er-ZrrIr),这时伪节点就没有了。对第r支路,欧姆定律表明Vr=Zrr·Ir对全部支路,可以同时用矩阵方程

式中,vT=[v1,v2,…,vb](vT为v的转置矩阵)

同样j=Yv(2-2)

式中

把基尔霍夫定律用到第r标准支路,得jr=Ir+ir和vr=Er+er或者对全部支路写成矩阵形式

式中

代入方程(2-1)和(2-2),并整理得

这些方程可逐个用到各支路上去,下面的矩阵分析法将利用这些方程,研究电路连接对支路电压和电流的约束。

将电路转换成矩阵形式的第三步是用基本切割方法切割第二步选择的树。所谓基本切割是指恰好切断一根树枝的切割,方向是被切断树枝的方向。通过基本切割获得割集矩阵,这种矩阵的元素由1、0或-1组成。首先把树枝由1开始编号,矩阵的行数对应于具有相同号数的电路支路。同样,矩阵的每一列对应于一个切割。图4即是与示例电路对应的一个树,和对该树所做的3个基本切割。

分块使矩阵分成上下两部分,上面部分用DT表示,它与树枝对应;下面部分DL则对应于连支。因为割集的切割数等于树枝数,且基本切割只能切断一根树枝,所以DT必然是单位矩阵。如果按行号数标记的支路被按列号数标记的切割所交割,并且支路电流方向与该切割的树枝电流方向相同,那么矩阵取值为+1;如果支路电流取相反方向,那么矩阵取为-1;如果支路不被切割,则取值为0。

2.2 求解电路各参数

根据上面步骤得到方程式(2-7),它是示范图割集基尔霍夫电流定律的矩阵表示形式。将该矩阵方程用字母方式表示为DTi=0。

矩阵D被称为割集矩阵,并由1、0或-1组成,图4中电路图的割集矩阵D重写为如下方程:

首先把树枝由1开始编号(如图4中的编号),矩阵的行数对应于具有相同号数的电路支路。同样,矩阵的每一列对应于一个切割。分块使矩阵分成上下两部分,上面部分用DT表示,它与树枝对应;下面部分DL则对应于连支。因为割集的切割数等于树枝数,且基本切割只能切断一根树枝,所以DT必然是单位矩阵。

割集矩阵的另一个特性是可用表示式DeT加以说明,其中eT是e与树枝有关的部分,完全展开得

在后面的分析中,将通过方程表示式v=E+e把独立压源包括进来。

割集分析的两个主要步骤是:将基尔霍夫电流定律用于割集和将连支电压用树枝电压来表示。这两步都已用割集矩阵来完成了,所以电路分析是能够表示成矩阵形式的。重写式(2-6)的支路相互关系为:

等式两边左乘DT,得到:

由前所知,根据基尔霍夫电流定律,DTi=0(见矩阵方程式(2-7)的字母表示形式)。用方程(2-10)的e代换,得到:

要把解表示成独立树枝电压的集合,需将矩阵DTYD求逆,得到:

网络中其余的电压和电流,都可将其代入式(2-3)、式(2-4)、式(2-10)和式(2-11)去求得,即:

支路电压e=DeT

支路电流i=Ye-(I-YE)

矩阵元电压v=e+E

矩阵元电流j=i+I

至此,已经可以对只有两端元件的电路进行矩阵分析了。只要用Matlab等数学软件对矩阵进行分析便可得到相应电路的V-I特性了。

3 电路分析程序

以求解图1示范电路为例,介绍运用VC++和Matlab混合编程实现电路分析程序。

3.1 运行环境

对话框是VC++6.0中重要的应用程序模式之一。对话框可以接收用户输入的信息或数据,一般是通过在对话框上添加控件来实现对话框的操作,对话框依靠这些控件与用户进行交互。

(1)启动Visual C++6.0,选择“文件”菜单的“新建”命令,在弹出的“新建”对话框中选择“工程”页面,在该页面下选择“MFC AppWizard(exe)”选项,并单击。在静态文本“工程”下的编辑框中输入程序的名称。在“位置”下的编辑框中输入程序项目的保存地址,然后单击“确定”按钮,进入创建工程向导界面。

(2)创建工程向导的第一步选择Dialog based(基本对话框)选项,同时还可以选择支持的语言,单击“Next”按钮,进入向导的第二步。

(3)在MFC向导的第二步,保持默认选项不变,直接单击“Finish”按钮后即出现对工程整体描述的对话框,单击“OK”按钮,进入开发界面。

(4)在资源窗口中单击鼠标右键,在弹出的对话框中选择Import,集成开发环境随即弹出导入资源对话框,在该对话框中选择图1示范电路,单击“Import”按钮,即把该示范电路加入到了程序工程环境中。使用该图作为程序界面使程序直观、易用。

(5)在图上添加编辑框控件,作为人机进行数据交流的接口。在VC++6.0中对话数据交换(DDX)和对话数据确认(DDV)是两个非常简单而又非常强大的功能。它们使得在MFC中从对话框字段或任何其他CWnd的派生类中插入和抽取数据变得非常容易。因此本程序将使用对话框的DDX和DDV功能具体进行人机数据交流。

3.2 矩阵运算

要在VC++中调用Matlab的功能,需要按照下面3个步骤改变VC++工程创建时的默认设置。

第一步,在VC++工程设置中加入的静态链接库:libmatpm.lib,libmx.lib,libmatlb.lib,libmat.lib,libmmfile.lib,sgl.lib和libmwsglm.lib。其中,sgl.lib和libmwsglm.lib只有在用到Matlab C++图形库的时候才需要在VC++工程设置中加入。

第二步,设置C/C++标签中的选项,在VC++6.0的IDE中选择Project菜单,在弹出的菜单中选择Project Settings(工程设置)选项,将出现Project Settings对话框,选择C/C++选项,将Category的下拉列表框内容设置位Code Generation,又将Use run-time library选项设置为Multithreaded DLL。将Category选项设置为Preprocessor,并且在Preprocessor definitions选项中增加如下内容:MSVC,MSWIND,IBMPC,D__STDC_,_AFXDLL。

第三步,在工程中包含相应的头文件。在Visual C++工程中如果不用Mablab C++图形库的时候,只需要包含头文件"matlab.hpp”;如果要用到Matlab C++图形库的时候,则需要包含头文件“matlab.hpp”和“libmwsglm.hpp”。

在做完以上三步的设置后,就可以在VC++工程中通过Matlab C++数学库调用Matlab的矩阵运算函数了。

3.3 难点问题及处理方法

由于平时使用的软件开发平台的数据存储格式与Matlab的数据存储格式不同,要将Matlab的功能运用于自己的程序中,就要解决好两种编程语言的沟通问题。对于多维数组,与C语言的数组元素在内存中按行的排列顺序不同,所有Matlab阵列在内存中都是按列排列的。因此,在程序中需要专门设置程序来实现两种编程语言的矩阵数据存储格式的相互转化。

其次,由于Matlab所有的运算都是采用双精度浮点型,因而整型阵列如果要参加运算,必须先转化为双精度型。Matlab C++数据库只有Matlab阵列一种数据类型。Matlab C++数据库中用mwArray类封装了Matlab阵列的数据及其基本操作函数。因此,可以使用mwArray类作为C++语言和Matlab语言的沟通桥梁。

如何将mxArray转化为C++语言可以直接使用的基本数据类型,或者如何将C语言的基本数据类型转化为mxArray类型?这个问题由Matlab通过提供一系列操作mxArray的API函数解决了。例如:

int mxGetM(const mxArray*array_ptr)函数可以得到Matlab阵列的行数,

int mxGetN(const mxArray*array_ptr)函数可以得到Matlab阵列的列数,

double*mxGetPr(const mxArray*array_ptr)函数可以得到Matlab双精度数值阵列的实部数据指针。

GetData()函数放回一个mxArray结构的指针,通过这个mxArray结构,开发人员可以通过Matlab C数学库的函数进行数据访问操作。使用GetData()函数需要注意的是,不要释放GetData()函数放回的mxArray指针指向的内存及mxArray中包含的数据。

ToString()函数可以将字符类型mwArray中的字符数据转化为C/C++语言字符串数据。

4 结语

在理解矩阵电路分析方法之后,就可以根据具体的线性电路运用网络拓扑的方法作出有向图,并选出一棵树,依顺序进行基本切割,获得割集矩阵,再利用VC++和Matlab混合编程实现人机界面友好的Win32电路分析应用程序。经过与EWB,PSPICE等电路分析软件比对,按该方法设计出的程序,其计算结果与这两款软件分析同一线性电路所得数据一致。这表明这种电路分析程序设计方法能够实际运用于工作之中。

摘要:在分析和设计电路时,常使用Proteus、Multisim、EWB、OrCAD(Spice)、Protel等电路分析工具,但要想得到更精确的电路分析数据或者个性化的电路模型,以上工具却难以应付。现代电路分析提供了一种用矩阵方式分析电路问题的解决方法,这种方法也是以上电路分析软件的基础。Matlab提供了许多矩阵运算函数,使用VC++6.0能够设计出接口良好的Windows程序。因此,使用VC++6.0和Matlab混合编程就能编写出矩阵电路程序,解决个性化的电路分析问题。

关键词:矩阵分析,VC++6.0,Matlab,混合编程

参考文献

[1]杜普选,等.现代电路分析[M].北京:北方交通大学出版社,2002.

[2]刘维.精通Matlab与C/C++混合程序设计[M].北京:北京航空航天大学出版社,2005.

[3]Marshall Brain,Lance Lovette,译星翻译.MFC开发人员指南[M].北京:机械工业出版社,1999.

[4]阮宇.Visual C++6.0基础教程[M].北京:清华大学出版社.

蚁群算法在MATLAB中的实现 篇5

蚁群优化算法(ant colony optimization,ACO)是意大利学者Dorigo等人在20世纪90年代通过模拟蚁群觅食行为而提出的一种新型进化算法[1]。该算法是继神经网络、遗传算法、模拟退火算法、粒子群算法、免疫算法等仿生搜索算法以后的又一种应用于组合优化问题的启发式搜索算法。由于蚁群算法采用分布式并行计算机制,具有较强的鲁棒性,容易与其它算法结合等优点,一经提出,立即受到各个领域学者的重视,展开了对其的研究。目前蚁群算法已经被广泛的应用于求解旅行商问题(traveling salesman problem ,TSP)[2]、定量构效方法(QSAR)[3]、网络路径最优问题[4]、聚类[5,6]、分类[7]等领域。但对蚁群算法的具体实现却较少有文献提及,本文以TSP问题为解决问题的目标,详细阐述了蚁群算法在MATLAB中的实现过程。

1 问题描述与算法思想

旅行商问题又被称为旅行推销员问题、货郎担问题。它是一个多局部最优的最优化问题:有n个城市,一个推销员要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线。旅行商问题已经被证明是一个NP难问题,具有O(n!)的时间复杂度,使用传统的算法较难解决。

在蚂蚁寻找食物的过程中,总能找到一条从蚁穴到距离很远的食物之间的最短路径。每个蚂蚁事先并不知道食物在什么位置,只是在本身能够看得见的局部范围内搜索,在搜索过程中将以一定的概率向其他蚂蚁留下的信息素浓度高的方向移动,同时自己也释放信息素,信息素的浓度与经过的路径长度成反比,同时所有蚂蚁的信息素将会以一定的速率挥发,经过一段时间的搜索,最短路径上的信息素将会越来越浓,按照最短路径移动的蚂蚁将会越来越多,进而形成一个正反馈,使得它们可以找到最短路径。所以在蚁群算法的实现过程中,关键的步骤有三个:①蚂蚁的移动操作,②释放自身的信息素,③信息素的更新操作。

文献[2]使用蚁群算法解决TSP问题,获得了较好的效果。其算法思想是在一个二维的平面上分布着n个城市,所有城市在该平面的坐标构成了一个n×2的矩阵City,按照城市坐标在矩阵City中的位置(行号)进行编号,分别是1号城市节点,2号城市节点,……等,城市之间的距离使用欧式距离表示。现将m个蚂蚁随机放到x个城市节点,每个蚂蚁访问过的城市节点放入到Visited表中,作为禁忌搜索列表,除去Visited表中已经访问过的结点,其余节点都是该蚂蚁尚未访问的结点集合,放入No_Visited表中,每个蚂蚁在向新的城市节点移动时,新的节点必须是No_Visited表中的结点,防止蚂蚁在原地打转。每个蚂蚁在向新节点移动前,使用公式(1)计算到达No_Visited表中每个节点的概率P。

Ρi,jk(t)={[τij(t)]α[ηij(t)]βsΝo_Visited(t)k[τis(t)]α[ηis(t)]β,jΝo_Visited(t)k0jVisited(t)k(1)

其中,Pijk(t)表示t时刻蚂蚁ki节点移动到j节点的概率,τij(t)表示t时刻i节点到j节点之间路径上的信息素,ηij(t)表示t时刻希望蚂蚁ki节点移动到j节点的期望度,其表达式使用公式(2)来表示。

ηij(t)=1dij(2)

其中,dij表示节点i与节点j之间的距离。No_Visited(t)k表示t时刻蚂蚁k未访问的城市节点集合,相应的Visited(t)k表示t时刻蚂蚁k已经访问过的结点的集合。α,β分别表示蚂蚁在运动过程中信息因子与期望因子,表示信息素与期望度在蚂蚁选择路径中起作用的重要程度,它们一般是一个常数。如果在t时刻,蚂蚁k已经访问过结点j,那么移动到j节点的概率为0。计算出t时刻蚂蚁k未访问过的所有节点的移动概率集合P,使用轮盘赌的方法从未访问节点中选择一个概率较大的节点作为下一步移动的目的地。按照这个方法蚂蚁k依次遍历完所有节点。

计算每个蚂蚁所经历的路径的总长度L={Lk|k=1…m},在其中找到最小的长度及与之对应的最短路径,然后进行信息素的更新,信息素的更新采用公式(3)-(4)进行。

τij(t+1)=(1-ρ)*τij(t)+Δτij(t) (3)

Δτij(t)=k=1mΔτijk(t)(4)

其中,ρ表示信息素的挥发系数,取值范围为[0,1),Δτijk(t)表示第k只蚂蚁在路径上释放的信息素的量。Δτijk(t)使用公式(5)来计算。

Δτijk(t)={QLk(t)ki,j0,ki,j(5)

其中,Q表示一只蚂蚁所携带的信息素的强度,Lk(t)表示蚂蚁kt时刻经过的路径的总长度。

2 实现步骤

假设城市数为n,蚂蚁数目为m,迭代的最大次数为Loop_Max,信息素因子为Alpha,期望因子为Beta,信息素挥发系数为Volatile,信息素强度为Q,实现的算法能够记录每次迭代的最优路径Route_Best,最优长度Length_Best和平均长度Length_Average,能够记录算法运行结束时的最优路径Shortest_Route及最优路径长度Shortest_Length和算法的运行时间Time。

根据上述的算法思想,蚁群算法在MATLAB中详细的实现步骤如下:

①根据城市矩阵City计算各城市节点之间的距离矩阵Distance,Distance为一个n×n的对称矩阵。

②根据Distance计算期望矩阵Expectation,Expectation=1/Distance。

③设置信息素矩阵T_Pheromone为n×n的全1矩阵,然后设置计时器。

④检测迭代次数是否达到Loop_Max,如果到达Loop_Max次,算法停止,否则转步骤⑤。

⑤将m只蚂蚁随机放到x个城市节点上,x个城市节点随机产生。

⑥对每只蚂蚁找到其没有访问过的节点列表No_Visited,并按照公式(1)计算从当前节点转移到未访问的所有节点的转移概率列表P

⑦使用轮盘赌方法选中某个节点j,并将j节点加入到已访问节点列表Visited中,直到所有节点被全部访问。

⑧计算所有蚂蚁所走过的路径长度集合L,L为一个m×1的矩阵。找到其中的最小值,并记录该最小值对应的蚂蚁走过的路径,将最小值与最短路径分别记录在Length_Best与 Route_Best中,将路径长度的平均值记录在Length_Average中。Length_Best与Length_Average为Loop_Max×1的矩阵,而Route_Best为Loop_Max×n的矩阵。

⑨按照公式(4)-(5)计算Δτi,j(t),其中t为本次的循环次数。

⑩按照公式(3)进行信息素矩阵T_Pheromone的更新。

(11)转到步骤④

(12)停止计时器,并记录运行时间到Time中。

(13)将算法找到的最优路径记录在Shortest_Route,最优路径长度记录在Shortest_Length。

3 算法验证及结论

在MATLAB中实现的蚁群算法使用德国海德堡大学的TSPLIB95数据库[8]进行验证,共使用了6个数据库,它们分别是Gr17,Gr21,Gr24,Gr48,Eil51,St70,数据名后面的数字表示该数据中包含的城市数。根据文献[9],算法采用的参数是迭代次数为40,蚂蚁个数为5,信息素因子为1,期望因子为10,信息素挥发因子为0.5,信息素强度是100。每个数据使用实现的算法单独运行50次。运行的结果如表1所示。

图1-2分别是Eil51、St70数据运行的结果。

通过对算法的实际运行,可以看出在MATLAB中实现的算法符合蚁群算法的思想,运行良好,由于本算法是标准的蚁群算法的实现,从图1-2中可以看出,算法存在比较严重的“早熟”现象,这将是今后进一步研究的方向,本算法的实现为以后的研究提供了良好的基础。

参考文献

[1]Dorigo M,Maniezzo V,Colorni A.Ant system:optimization by a col-ony of cooperating agents[J].IEEE Transactions on SMC,1996,26(1):12-41.

[2]Dorigo M,Gambardella L M.Ant colony system:a cooperativelearning approach to the traveling salesman problem[J].IEEETransactions on Evolutionary Computing,1997,(1):53-66.

[3]费红琳,张永清.新蚁群算法在烷基酚类化合物的QSAR中变量选择的研究[J].计算机与应用化学,2009,26(6):803-806.

[4]薛明昊,杨淮清.基于改进蚁群算法的铁路路网最优路径规划[J].计算机工程与应用,2010,46(3):189-192.

[5]张丽,刘希玉,李章泉.基于蚁群算法的聚类优化[J].计算机工程,2010,36(9):190-192.

[6]朱峰,陈莉.一种改进的蚁群聚类算法[J].计算机工程与应用.2010,46(6):133-135.

[7]宋军涛,周铜,杜庆灵.支持向量机和蚁群算法的网页分类研究[J].计算机工程与应用.2009,45(17):122-124.

[8][EB/OL]http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/.

MATLAB程序算法 篇6

数据输入

VB版本程序的试验报告编号是由试验人员输入, 每个试验人员的编码规则是不一致, 导致仅以编号查找试验报告没有规律可循。MATLAB版本程序的试验报告编号是由软件按照年月日加当天的流水号规律自动生成的, 非常方便日后的试验报告查找。MATLAB版本程序的试验人员名单的输入项最多可加三个名额, 一般是两个名额, 实验员和电机方案设计员, 方便设计员很容易在数据库中找到自己设计电机的试验报告, 并且增加了一个记事本功能, 用来记录做此次电机试验的目的。例如:此次试验相对上次试验仅做了硅钢片材料的更改, 对比电机性能参数的变化。VB版本程序的试验参数字符没有中文含义的解说, 熟悉程序操作需要更久的时间。MATLAB版本程序对每个试验参数字符都进行了中文含义的解说, 对程序的操作更加友好, 并且对一些试验中用到的修正系数, 进行了提示。VB版本程序取样点的数据输入是采用每个取样点对应一个窗口, 但是要按顺序输入, 一旦发现某点输入有误, 需要一直按上一点才能到达目标点。MATLAB版本程序也是采用每个取样点对应一个窗口, 但是只要点击每个取样点窗口就能切换。

数据处理

MATLAB版本程序对试验参数的计算公式是按照“GB/T1032-2012三相异步电动机试验方法”[3]标准编写, 从而保证了计算公式的正确性, 要编制出三相异步电动机的空载、堵转、负载等试验过程的计算源程序, 关键是如何按以求得的空载试验数据求出铁耗Pfe和机械耗Pj, 只用解决这个问题, 才能计算出负载试验时各参数值。参照“MATLAB数值计算方法”书中介绍的算法, 采用“拉格朗日二次插值的方法”求取正确的铁耗和机械耗数据。

试验特性曲线绘制

VB版本程序的曲线显示不美观, 因为取样点之间是通过直线连接。参照“计算机辅助三相异步电机试验数据处理和试验曲线绘制”书中的理论, 应用计算机绘制试验曲线的关键是如何根据已知的一组试验数据 (离散的试验点) 建立“数学模型”, 由于三相异步电动机所给的试验点一般为7~10点, 根据这些有限的离散点拟合出曲线方程, 绘制曲线, 此曲线必须较正确的反映电机特性的真实趋势, 要求误差最小, 采用多项式y=Pm (x) 及指数函数式y=a*ebx进行拟合, 采用“最小二乘法”控制误差, 经过验证, 最后证明用“二次多项式较”为逼近, 较好的满足了试验要求。用MATLAB软件调用二次多项式拟合公式命令绘制曲线, 数据区间内取样点数较多, 使得曲线绘制的比较光滑。可以显示单条曲线, 也可以显示多条曲线, 即同一个横坐标、显示多个纵坐标, 例如在一幅图中绘制负载试验的I1=f (P2) 曲线, s=f (P2) 曲线, P1=f (P2) 曲线, η=f (P2) 曲线, cosφ=f (P2) 曲线。并且可以将曲线上的数据以文件形式导出, 方便查找曲线上任何点的数据。

试验项目

VB版本程序可处理的试验项目很少, 只包含空载试验、堵转试验、热试验、负载试验、圆图计算项目, 满足不了客户的各种试验要求。MATLAB版本程序按照“电机试验技术及设备手册”书中的格式和“GB/T1032-2012三相异步电动机试验方法”标准, 增加了绕组冷态和热态绝缘电阻测定、绕组直流电阻的测定、绕组匝间耐冲压电压试验、绕组对地耐冲击电压试验、绕组对地及相间绝缘耐电压试验、最大转矩的测定试验、起动过程中最小转矩的测定试验、振动的测定试验、噪音的测定试验、超速试验、短时过转矩试验、短时升高电压试验、转动惯量的测定、偶尔过电流试验、外壳防护试验、轴电压的测定。极大的丰富了试验报告的内容, 满足了客户需要各种试验报告的要求, 规范了电机各种试验报告的形式、也方便管理了电机各种试验报告的存档。

数据库管理

VB版本程序数据库管理的快速查找方式单一, 只能按照试验报告完整的编号查找, 否则只能翻阅整个数据库列表了, 相当的不方便。并且全部数据都储存在一个数据库文件中, 如果这个文件损坏了, 里面的数据就全部丢失。MATLAB版本程序数据库管理采用多种快速查找方式, 例如:可以按照设计员或试验员的名称查找, 方便设计员快速的找到自己的试验报告。可以按照电机型号查找, 方便快速的找到同种类型电机的试验报告。还可以按照试验报告编号、关键字等方式查找。MATLAB版本程序储存数据的方式按照一个试验报告对应一个数据文件, 统一通过数据库管理窗口调用数据文件, 如果某个数据文件损坏或丢失不会影响其它文件, 同时也可以将所有的数据文件备份, 防止系统崩溃时, 数据丢失, 列表各种试验报告之间相同参数的数值, 方便设计人员从多种相类似试验报告中筛选最优的设计方案。

报告形式

VB版本程序没有试验报告封面, 需要试验人员自己制作封面, 可能会出现不同的试验人员喜欢用各自的试验报告封面, 导致试验报告格式不统一的现象, 并且数据处理页都是英文参数和数据形式, 只有专业人士才能读懂。MATLAB版本程序有试验报告封面, 数据取样和数据处理结果都是以表格的形式, 并且带有中文解说, 报告的表现形式直观易懂。

打印

VB版本程序打印的内容较少只有五项试验的数据取样和计算结果, 并且曲线打印效果不美观, 因为曲线是点与点之间通过直线连接, 显示效果不好。MATLAB版本程序可以打印一份完整的报告, 包括试验报告封面、数据输入表格、数据处理结果表格、试验特性曲线等。

帮助

VB版本程序没有帮助内容。MATLAB版本程序帮助内容包括:1、“GB/T1032-2012三相异步电动机试验方法”标准资料;2、各种试验项目的数据输入操作说明;3、试验项目的数据处理结果的说明;4、试验报告打印操作说明;5、数据库的使用操作说明;6、程序的新建、保存、退出、复制、粘贴等基本操作说明;7、各种试验项目的调用操作说明;8、各种试验特性曲线的绘制、特性曲线上数据的导出等操作说明。

MATLAB程序算法 篇7

本论文通过对手机连续按键音的时域和频域分析, 来识别手机按键号码。

语音信号处理一直是一个重要的研究领域, 已经有很长的研究历史。其中重要的原因就是, 它能够始终与信息科学中最活跃的前沿学科保持密切的联系。语音信号处理算法的复杂性和实时处理的要求, 促使人们在软硬件方面不断的进行探索。鉴于大部分的现有文献资料都缺乏详尽的底层描述和具体的实现过程, 不适合初学者的入门学习。本文针对此问题, 仅仅在连续DTMF信号检测的具体实现方面进行探讨, 并在matlab语言环境下加以编程实现, 以期对初学者能有很好的启发作用。

要实现对连续DTMF信号的检测, 主要有两大任务:端点检测和信号解码。其中端点检测主要利用声音信号的短时能量或短时过零率两项基本指标, 设置信号识别门限值, 对连续的按键音进行区域分割, 找出每一个按键音的时域范围。信号解码主要针对前一步分割好的声音信号, 利用Goertzel算法在相应的频点上进行快速傅里叶变换, 提取出频谱信息, 找到信号编码时的行频和列频。然后在DTMF信号的编码对照表中查找。找出组合频率对应的数字号码, 将结果显示出来。

2、几个基本概念:

DTMF (Dual Tone Multi Frequency) :即双音多频信号, 广泛的使用在全世界范围内的按键式电话机上。现今应用于通过电话发送信号来选择菜单操作的各种系统中。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两个预分配的频率组:行频组和列频组。每一对这样的音频信号唯一表示一个数字或符号。为了产生DTMF信号, 可以产生两个正弦波叠加在一起后发送。解码时可以采用Goertzel算法, 从频域搜索两个正弦波的存在, 从而解调出DTMF信号。信号编码如图1所示:

短时能量 (Short Term Energy) :音频信号时域分析的重要参数, 对信号的帧内样本求和, 是区分信号和噪声的一项技术指标。用下面的公式表示: (N为帧长度)

过零率 (Zero Crossing Rate) :音频信号时域分析的又一重要参数, 表示一帧语音中信号波形穿过横轴 (零电平) 的次数。对于连续信号, 过零率意味着时域波形通过时间轴;而对于离散信号, 如果相邻的采样值改变符号则称为过零。定义短时过零率的公式为:

其中:

3、信号检测的实现过程:

要识别出连续的DTMF信号, 首先要进行的就是端点检测, 即从输入音频信息中将信号音和背景噪声区分开来。然后信号解码就是要对每一段单独的信号声音做fft变换, 在频域中找到信号编码时的两个组合频率。这里采用Goertzel算法从输入信号中提取频谱信息。最后将找到的行频和列频与CCITT的国际标准频率进行比照, 从而找出具体按的按键号码。

3.1 端点检测:

所谓端点检测, 就是从一段连续的按键音中找出每一个单独声音的起点和终点。在音频识别系统中, 端点检测起着十分重要的作用。好的端点检测不仅能减少计算量和处理时间, 而且能够提高信号识别的正确率。研究表明即使在高信噪比的情况下, 识别系统中一半以上的错误率来自端点检测。端点检测的主要指标有短时能量, 短时平均幅度, 短时过零率, 倒谱特征和子带能量等。其中倒谱特征主要应用于高级别的语言语音识别等系统。本程序仅用短时能量和短时过零率便可以有效的进行断点检测。

在实际应用中, 背景噪声较低时用短时能量识别较为方便, 而背景噪声较大时用短时过零率识别则更为有效。这是因为背景噪声较小时, 时域波形分布平坦, 短时过零率门限和部分噪声门限区分度小, 容易将噪声识别为信号。当背景噪声较大时, 短时能量对高电平的异常敏感性, 使得无法设置门限将噪声的高电平从有效信号中区别出来。

3.2 信号解码:

信号的解码主要将时域里分割好的信号进行fft变换, 在频域里找出编码时的组合频率, 并与编码表进行对照, 从而找出对应的按键号码。这里主要应用Goertzel算法提取频谱信息。不仅编写程序简单, 而且更重要的是运算速度快, 更能满足快速实时处理的要求。

Goertzel算法实质是一个两极点的IIR滤波器。其系统函数形式为:

利用Goertzel算法解码DTMF信号十分方便快捷, 因为要被检测的信号只有8种可能的单音, 运算过程中完全消除了复数的运算, 这样使运算大大的被简化了, 运算速度也很自然的得到了大幅度提高。

3.3 算法实时性分析

好的程序必然应用好的算法, 而好的算法必然是时间复杂性和空间复杂性的完美结合。语音信号处理的实时性对程序运行的速度提出了很高的要求。本程序在速度上的提高得益于两个方面。

第一, 时域信号的分帧处理。根据AT&T技术规范: (1) 数字号码最大传输速度为每秒10个, 即一个号码不超过100ms时间片。 (2) 在100ms时间片内双音多频信号持续不少于45ms且不多于55ms的时间。这里取50ms为一帧。帧长度的计算公式为:

第二, 没有直接用MATLAB中的快速傅里叶变换函数fft。而是应用Goertzel算法函数goertzel。这因为MATLAB中提供的fft函数是用一种混合基算法写成。如果变换点数N是2的某个幂, 那么就使用一个高速的基-2FFT算法。如果N不是2的某个幂, 那么就将N分解为若干素数因子, 并用一个较慢的混合基FFT算法。最后, 如果N是某个素数, 那么fft函数就蜕化为原始的DFT算法。还因为goertzel算法仅仅在按键号码对应的组合频率进行傅里叶变换, 计算量得到了最大程度上的化简, 速度得到了质的提升。

3.4 实现步骤流程图:

4、实验结果及其分析:

输入信号为1234567890十个简单的音频信号。

从时域图形上看, 在1-2, 5-6采样范围之间有相对较大的噪声。

从短时能量上看, 时域上较大的噪声在能量上影响较大, 以至于无法设置能量门限对其进行分割, 所以这个信号不适合用短时能量的方法进行断点检测。

从过零率的图形上看, 信号和噪声的区分度良好, 所以本信号适合用过零进行端点检测。

程序运行结果:

telnumber=1234567890语

5、结语:

本文详细阐述了手机按键号码识别的原理和方法, 并通过实验证明了方法的可行性。在MATLAB下编写程序, 实现手机号码识别的功能。并对算法的实时性进行了简要的讨论。附录中给出了程序的源代码。

参考文献

[1].程佩青.数字信号处理[M].北京:清华大学出版社, 2005.

[2].赵力.语音信号处理[M].北京:机械工业出版社, 2008.

[3].Vinay K.Ingle&John G.Proakis.Digital Signal Processing using MAT-LAB.刘树棠译.数字信号处理[M].西安:西安交通大学出版社, 2008.

[4].徐靖涛王金根.《基于MATLAB的语音信号分析和处理》[J].重庆科技学院学报, 2008, 2

[5].吴志雄.《利用MATLAB仿真DTMF音频的产生及其解码》[J].福建商业高等专科学校学报, 2002, 6

[6].刘华平姜宁.《语音信号端点检测方法综述及展望》[J].计算机应用研究, 2008, 8

上一篇:胸腔置管下一篇:船舶定位监控系统