语音识别HTK代码学习手册(2)
Python与语音识别使用Python进行语音识别和转换

Python与语音识别使用Python进行语音识别和转换Python与语音识别随着科技的不断发展,语音识别技术越来越被广泛应用于各个领域。
Python作为一种强大的编程语言,在语音识别和转换方面也发挥了重要的作用。
本文将介绍使用Python进行语音识别和转换的一些方法和技巧。
一、语音识别技术的简介语音识别是一种将人类语言转化为机器可识别形式的技术。
它可以帮助计算机理解和处理人类的语言,实现人机交互。
语音识别技术在智能助理、语音搜索、语音输入等方面有着广泛的应用。
二、Python中的语音识别模块Python中有多个语音识别模块可供使用,其中最受欢迎的是SpeechRecognition。
这个模块提供了与一些常见的语音识别API进行交互的功能,并支持多种语音输入源。
使用SpeechRecognition模块,首先需要安装它,可以通过pip命令进行安装:```pip install SpeechRecognition```安装完成后,我们可以使用以下代码示例来实现简单的语音识别:```pythonimport speech_recognition as sr# 创建Recognizer对象r = sr.Recognizer()# 读取语音文件with sr.AudioFile('audio.wav') as source:audio = r.record(source)# 识别语音text = r.recognize_google(audio, language='en-US')# 打印识别结果print(text)```这段代码使用了Google的语音识别API,将语音文件"audio.wav"转换为文本。
你可以根据需要使用不同的语音识别API,如百度、讯飞等。
除了从语音文件中进行识别外,SpeechRecognition模块还支持从麦克风实时识别语音输入。
语音识别与合成系统使用手册

语音识别与合成系统使用手册第一章引言 (3)1.1 系统概述 (3)1.2 主要功能 (3)1.2.1 语音识别 (3)1.2.2 语音合成 (3)1.2.3 语音交互 (4)1.2.4 其他功能 (4)第二章系统安装与配置 (4)2.1 安装环境要求 (4)2.2 安装流程 (4)2.3 配置语音识别引擎 (5)2.4 配置语音合成引擎 (5)第三章语音识别操作指南 (5)3.1 语音输入设备准备 (5)3.2 识别流程与界面操作 (6)3.3 识别结果查看与编辑 (6)3.4 识别功能优化 (6)第四章语音合成操作指南 (7)4.1 语音输出设备准备 (7)4.2 合成流程与界面操作 (7)4.3 合成效果调整 (7)4.4 合成功能优化 (8)第五章语音识别与合成高级功能 (8)5.1 实时语音识别 (8)5.1.1 功能概述 (8)5.1.2 技术实现 (8)5.1.3 使用指南 (8)5.2 多人语音识别 (8)5.2.1 功能概述 (8)5.2.2 技术实现 (9)5.2.3 使用指南 (9)5.3 离线语音识别 (9)5.3.1 功能概述 (9)5.3.2 技术实现 (9)5.3.3 使用指南 (9)5.4 语音合成自定义 (9)5.4.1 功能概述 (9)5.4.2 技术实现 (9)5.4.3 使用指南 (10)第六章系统维护与管理 (10)6.1 识别与合成引擎更新 (10)6.1.2 更新方法 (10)6.1.3 更新注意事项 (10)6.2 系统参数配置与调整 (10)6.2.1 参数配置 (10)6.2.2 参数调整方法 (10)6.2.3 参数调整注意事项 (11)6.3 日志管理 (11)6.3.1 日志分类 (11)6.3.2 日志查看与导出 (11)6.3.3 日志清理 (11)6.4 故障排查与处理 (11)6.4.1 故障分类 (11)6.4.2 故障排查方法 (11)6.4.3 故障处理 (11)第七章语音识别与合成的应用案例 (11)7.1 客户服务 (12)7.2 智能家居系统 (12)7.3 车载语音 (12)7.4 教育辅助工具 (12)第八章安全性与隐私保护 (13)8.1 数据加密与保护 (13)8.1.1 数据传输加密 (13)8.1.2 数据存储加密 (13)8.1.3 数据访问控制 (13)8.2 用户权限管理 (13)8.2.1 用户角色划分 (13)8.2.2 权限控制 (13)8.2.3 权限变更审计 (13)8.3 隐私政策 (14)8.3.1 数据收集 (14)8.3.2 数据使用 (14)8.3.3 数据存储 (14)8.3.4 数据共享与传输 (14)8.4 法律法规遵循 (14)8.4.1 中华人民共和国网络安全法 (14)8.4.2 个人信息保护法 (14)8.4.3 计算机信息网络国际联网安全保护管理办法 (14)8.4.4 其他相关法律法规 (14)第九章常见问题解答 (14)9.1 识别与合成相关问题 (14)9.1.1 为什么识别准确率有时会较低? (14)9.1.2 如何提高语音合成质量? (14)9.1.3 识别与合成过程中出现中断或异常,怎么办? (15)9.2.1 如何安装和配置语音识别与合成系统? (15)9.2.2 如何更新系统? (15)9.2.3 系统出现故障,如何进行故障排查? (15)9.3 应用场景与功能疑问 (15)9.3.1 语音识别与合成系统适用于哪些场景? (15)9.3.2 如何实现语音识别与合成的实时交互? (15)9.3.3 系统是否支持多语言识别与合成? (15)9.4 技术支持与售后服务 (15)9.4.1 如何获取技术支持? (15)9.4.2 售后服务期限是多长时间? (16)9.4.3 如何申请售后服务? (16)第十章未来展望与更新计划 (16)10.1 技术发展趋势 (16)10.2 产品更新计划 (16)10.3 潜在应用领域 (17)10.4 用户反馈与建议收集 (17)第一章引言1.1 系统概述信息技术的飞速发展,语音识别与合成技术在智能语音交互领域中的应用日益广泛。
MatLab环境下调用HTK的连续语音识别方法

MatLab环境下调用HTK的连续语音识别方法【摘要】本文根据HTK(HMM Toolkit)的基本原理,在MatLab环境下通过调用HTK各命令实现小词汇量连续语音识别。
采用HTK工具包搭建语音的隐马尔可夫模型(HMM),再利用MatLab循环编程开发进行仿真实验,避免了传统地逐步运行HTK各个命令的冗余操作,降低了操作复杂度。
【关键词】HTK;语音识别;隐马尔可夫模型Abstract:According to the basic principle of HTK(HMM Toolkit),small vocabulary continuous speech was recognized based on HTK by MatLab programming in this thesis.This thesis used HTK to build HMM model and then used MatLab to program it to do speech recognition,thus it avoided the redundancy of operating single HTK command,and the complexity was reduced.as well.Key words:HTK;Speech Recognition;Hidden Markov Model一、引言语言是交流的最自然方式,它为人机交互提供了一种有效的方法。
但目前人与机器的交互方式多以键盘和鼠标为主,为了让机器与人能够更好地进行交互,出现了基于语音识别的系统使人机对话成为可能。
语音识别就是让计算机通过识别和理解把人类的语音信号转换为相应的命令或者文本的一门技术。
HTK(HMM ToolKit)[1][2]工具包是英国剑桥大学专门开发用于建立和处理隐马尔可夫模型的实验工具包,广泛应用在语音识别领域,在语音合成和字符识别等其他领域也有所应用。
THTWK-2型 实验指导书 V2.0

目录目录 (I)第一章系统介绍 (1)1.1 系统概述 (1)1.2 软硬件安装方法 (2)1.3 实验箱模块简介 (4)1.4 THTWK 实验对象地址分配 (21)第二章32位微机原理实验——汇编程序 (23)2.1 汇编编译器的设置 (23)2.2 PCI 设备的配置空间 (24)2.3 32位微机实模式、保护模式工作原理 (27)2.4 汇编实验项目 (29)实验一读取PCI 设备配置空间实验 (29)实验二读取32位开关量实验 (31)实验三 32 位LED 显示实验 (33)实验四点阵显示实验 (35)实验五保护模式下的存储器读写实验 (37)实验六中断实验 (39)实验七 8255模拟交通灯实验 (42)实验八 8255 扫描键盘实验 (44)实验九 8279 扫描键盘实验 (46)实验十步进电机驱动实验 (47)实验十一 A/D 转换(ADC0809)实验 (50)实验十二 D/A 转换(0832)实验 (52)实验十三串行A/D转换实验 (55)实验十四串行D/A转换实验 (56)实验十五直流电机驱动实验 (58)实验十六 LCD 显示实验 (60)实验十七 8251 串行发收实验 (63)实验十八 8251 和16C550 相互收发实验 (65)实验十九 8253电子音调实验 (69)实验二十储存器 DMA实验 (73)实验二十一温度测量实验 (77)实验二十二语音芯片控制实验 (78)实验二十三红外数据发送与接收实验 (83)实验二十四实时时钟实验 (85)实验二十五可编程逻辑器件实验 (87)第三章在Windows 下C 语言编程 (91)3.1 开发过程简介 (91)3.2 相关程序 (92)3.3 Visual C++6.0开发环境简介 (92)3.3.1 开发环境界面 (92)3.3.2 项目工作区 (93)3.4 创建Windows 应用程序 (95)3.5 用户接口函数说明 (99)3.5.1 函数OpenPlx9052 (99)3.5.2 函数ClosePlx9052 (100)3.5.3 访问IO空间的相关函数 (100)3.5.4 访问MEM 空间的相关函数 (101)3.5.5 中断服务相关函数 (101)第四章WINDOWS 中的接口实验——VC++程序 (105)实验一 32位I/O读写实验 (105)实验二存储器读写实验 (107)实验三 PCI中断实验 (108)实验四 A/D 转换(ADC0809)实验 (110)实验五 D/A 转换(DAC0832)实验 (112)实验六 LED点阵显示实验 (114)实验七 LCD 显示实验 (116)实验八 8253电子音调实验 (118)实验九 8255 接口实验(键盘扫描、步进电机、模拟交通灯) (120)实验十 8279键盘显示实验 (122)实验十一串行通信实验 (124)实验十二 USB通信实验实验 (127)第五章驱动程序开发(WDM) (134)5.1 系统环境配置 (134)5.2 利用向导生成程序框架和设备配置信息 (137)5.3 驱动框架的构成及描述 (141)5.4 驱动程序的具体编写 (143)5.4.1 读取硬件资源 (143)5.4.2 I/O 端口读写 (144)5.4.3 RAM 读写实现 (145)5.4.4中断的实现 (145)5.4.5 DMA 的实现 (147)附录一调试工具Turbo debug 的使用 (151)附录二 DOS功能调用(INT 21H) (159)第一章系统介绍1.1 系统概述THTWK-2型32位微机原理与接口实验箱是一套基于PC 机PCI 总线的32 位实验系统。
HTK使用方法简介

Step 5: 靜音回繞及與短間隔音的連結
❖ 建立shi.hed
Perl MakeProtoHMMSet model_struct3.pcf ➢ 將各個模型表列檔合併成hmmlist.txt以便將來使用
hmmlist1.txt
ling i er san su wu liou chi ba jiou
sil hmmlist2.txt
hmmlist3.txt
sp
model_struct1.pcf
Step 2: 音檔標音並蒐集會用到的聲音單位
❖ 建立標音字典 word_to_syllable_sp.dicword_to_syllable_sp.dic
❖ 本例標音字典中每個音都會用到
❖ 用HLEd程式將 word_trans.mlf 轉成 syllable_trans_sp.mlf的標音檔
d0 ling sp d1 i sp d2 er sp
hmmlist.txt HERest -S filelist_odd.txt -H models/hmm0/hmmdefs -M models/hmm0 -I
syllable_trans_sp.mlf hmmlist.txt HCompV -f 0.01 -m -S filelist_odd.txt -M models/hmm0 model_struct/sp HHed -H models/hmm0/hmmdefs -H models/hmm0/vFloors -M
2. 系統共使用幾種架構?哪些聲音的HMM檔要使用同一種架構
➢ 為每個架構建一個 “架構設定檔”及 “模型表列檔” ➢ 注意:模型表列檔最後要有一個空白列
HTK2

识别结果评估: N −D−S ×100% Correct= N
Accuracy = N −D−S−I × 100 % N
应用HTK建立连续语音识别的实例
数据准备 创建模型及学习
单音素模型 三音素模型 状态捆绑 增加高斯混合模型的个数
识别及评估
数据准备
训练及待识别语音文件(.wav) 训练语音包含的所有词(wlist) 训练语音的词级标注文件(.lab 或 word.mlf) wlist中词的发音词典dict(见附)
可根据实际问题需要适当增加高斯模型个数
识别及评估
识别HVite
HVite -H hmm15/macros -H hmm15/hmmdefs -S test.scp -l ’*’ -i recout.mlf -w wdnet -p 0.0 -s 5.0 dict tiedlist 词级、音素级、三音素级识别结果
应用HTK建立连续语音识别系统
------------王风娜
基本内容
知识回顾
HTK工具包 基于HMM的连续语音识别
应用HTK建立连续语音识别系统实例
知识回顾
HTK工具包
数据准备工具
HDMan、HCopy、HLEd、HSGen、HBuild、HLStats 、HParse
模型训练及优化工具
HERest、HInit、HRest、HHEd、HCompV
识别工具
HVite
性能评估工具
HResults、HRec
基于HMM的连续语音识别系统
HMM
三个基本问题:推理、学习、识别
模型初始状态 转移矩阵
ห้องสมุดไป่ตู้
λ ={π, A, B}
状态产生观测向 量的概率分布
MatLab环境下调用HTK的连续语音识别方法

Ab s t r a c t :Ac c o r d i n g t o t h e b a s i c p r i n c i p l e o f HTK( HMM T o o l k i t ) ,s ma l l v o c a b u I a r y c o n d n u o u s s p e e c h wa s r e c o g n i z e d b a s e d o n HTK b y Ma  ̄a b p r o g r a mmi n g i n t h i s t h e s i s . T h i s t h e s i s
r e d u c e d . a s we l 1 . Ke y wo r d s : HTK ; S p e e c h R e c o g n i i t o n ;Hi d d e n Ma r k o v Mo d e l
一
、
引言
三 、H T K 的调用 M a t l a b 调用H T K 各命令可 以通 过d o s 语句或 者s y s t e m 语 句 以及 用M a t L a b 语言编 写 出H T K 各 命 令运行时 所需的参数 的得 以实现 。例如生成 H T K 可 用的语 音识 别网络 ,M a t l a b 语句 可 以表 具。 示为 d o s ( ’ H p a r s e% s 0 u t p u t \ \ d i g i t . n e t ’ , 数据准备 工具:用A d o b e A u d i t i o n 录音软 h t k P a r a m . g r a m m a r F i l e ) ,其中H p a r s e 为H T K 中 件 采集语 音信号 ,再 完成建立语 料库 ,语 法定 生 成识别 网络 的命令 ,% s 代 表调 用h t k P a r a m . 义 ,字典 定义 ,标注 数据 ,提取 特征等过 程。 g r a m m a r F i l e 文件 ,该 文件是 事先 定义好 的语 语 法定义 是以特定 的文 法结构对 发音词汇进 行 法文 件 ,即汉语 无调 音节 的集总 。d i g i t . n e t 限制生成符 合发音语 法的语句 ,用命令H P a r s e 为生 成的识别 网络,生成后将 保存在o u t p u t 文 和} Ⅱ 3 u i l d 来 实现 。字 典定义可根据 实际要 求来 件夹 下。 定 义结构 ,如 音素 ,音节等 。本文 采用无 调音 M a t l a b 调用H T K 各命令 的部分代 码如 下: i f p r i n t o pt , 节对 连续汉 语进行 识别 J 。数据标注 利用命令 表1不同特 征参数的识别率 ( % ) f p r i n t f ( I . 2 : 无 调单 音节的列表 H L E d 来 实现 。特 征参数 利用H C o p y 来提 取 。常 用 的特 征参 数有线 性预 测系数 ( L P C ) 和 梅尔频 的生成 % s \ n ’, h t k P a r a m . p h o n e M l f F i l e ) ; 率倒 谱系 数 ( C c ) 。 分 析表 1 可知 ,采用梅 尔频 率倒谱 系数 进 H M M  ̄ I f 练工 具 :H M M i J I I 练 在语 音 识别 系统 行特征 参数 的提取 时语音识别 率 比采用线 性预 的搭 建过程 中发挥着重 要作用 ,它 的主要 目的 测系数 时的识别率 高3 . 6 % 。因此 ,本文特 征参 是 训练得  ̄ I H M M 模 型 。本 文使 用命令 H C o m p v 估 数采用梅尔频率倒谱 系数 。
MatLab环境下调用HTK的连续语音识别方法

MatLab环境下调用HTK的连续语音识别方法李理;王冬霞【期刊名称】《电子世界》【年(卷),期】2014(0)20【摘要】According to the basic principle of HTK(HMM Toolkit),smal vocabulary continuous speech was recognized based on HTK by MatLab programming in this thesis.This thesis used HTK to build HMM model and then used MatLab to program it to do speech recognition,thus it avoided the redundancy of operating single HTK command,and the complexity was reduced.as wel .%本文根据HTK(HMM Toolkit)的基本原理,在MatLab环境下通过调用HTK各命令实现小词汇量连续语音识别。
采用HTK工具包搭建语音的隐马尔可夫模型(HMM),再利用MatLab循环编程开发进行仿真实验,避免了传统地逐步运行HTK各个命令的冗余操作,降低了操作复杂度。
【总页数】2页(P131-131,132)【作者】李理;王冬霞【作者单位】辽宁工业大学电子与信息工程学院;辽宁工业大学电子与信息工程学院【正文语种】中文【相关文献】1.在MATLAB环境中调用DLL对硬件资源访问的方法 [J], 饶和昌;赵英俊bWindows/CVI环境下调用MATLAB函数的实现方法 [J], 张福波;张志伟;刘光军3.在VC++环境下调用MATLAB方法 [J], 王阔厅;周智勇4.Matlab环境下调用通用DLL的方法及应用 [J], 胡进;姚纯;苏敏5.基于HTK调用MatLab的语音识别的研究 [J], 张戈;严欢;殷景华因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HMM的理论基础一、HMM定义1.N:模型中状态的数目,记t时刻Markov链所处的状态为2.M:每个状态对应的可能的观察数目,记t时刻观察到的观察值为3.:初始状态概率矢量,,,4.A:状态转移概率矩阵,,,5.B:观察值概率矩阵(适用于离散HMM),,,;对于连续分布的HMM,记t时刻的观察值概率为一个离散型的HMM模型可以简约的记为。
二、关于语音识别的HMM的三个基本问题1. 已知观察序列和模型参数,如何有效的计算。
a. 直接计算2-1当N=5,T=100时大概需进行次乘法!b. 前向算法定义t时刻的前向变量(forward variable),可以通过迭代的方法来计算各个时刻的前向变量:1)初始化(Initialization)当t=1时2-22)递归(Induction)当时即: 2-33)终结(Termination)2-4乘法次数大约为:N2Tc. 后向算法定义t时刻的后向变量(backward variable),可以通过迭代的方法来计算各个时刻的后向变量:1)初始化(Initialization)当t=T时, 2-5 2)递归(Induction)当时即:, 2-6 3)终结(Termination)2-7 乘法计算次数约为:N2T2. 已知观察序列和模型参数,在最佳意义上确定一个状态序列。
定义一个后验概率变量(posteriori probability variable)2-7则最优序列可以通过, 2-7求得。
不过,这样求得的最优序列有些问题。
如果,那么这个最优序列本身就不存在。
这里讨论的最佳意义上的最优序列,是使最大化时的确定的状态序列。
即,使最大化时确定的状态序列。
定义为t时刻沿一条路径,且,输出观察序列的最大概率,即:2-8下面介绍迭代计算的Viterbi算法:1)初始化(Initialization),回溯变量:,2)递归(Induction)即: 2-82-9 3)终结(Termination)2-102-114)回溯状态序列, 2-12 3. 已知观察序列和模型参数,如何调整模型参数使最大。
定义3.1 给定训练序列和模型,时刻Markov链处在状态和时刻处在状态的概率定义如下3-1定义3.2 给定训练序列和模型,时刻Markov链处在状态的概率定义如下3-2定义3.3 给定训练序列和模型,从状态转移出去的概率为定义 3.4给定训练序列和模型,从状态转移到状态的概率为利用Baum-Welch重估算法可以得到使局部最大时的参数更新公式。
1. Baum-Welch重估公式的理论基础引理3.1 设,,为正实数,,,为非负实数,那么,由对数函数的凹特性,有如下结论3-3定义辅助函数如下3-4其中,为更新前模型参数,为更新后模型参数,为训练序列,为可能的状态序列。
利用和引理3.1易得3-5式3-5构成了重估公式得理论基础,对辅助函数,只要能够找到,使,从而,这样,更新后的模型在拟和训练序列方面就比更新前的模型要好,使最大而得到的的参数更新公式就称之为Baum-Welch重估公式。
引理 3.2 ,,在的约束条件下,函数的唯一最大值点为。
证明如下求最大值令得:,同理可证:利用凹函数特性可知此最大值唯一。
2.离散HMM模型的重估公式HTK内存管理一、HTK内存管理概述C语言编程中,遇到的关于内存分配和释放的问题主要有如下两个方面。
第一是指针维护问题。
试想,你写的一个程序执行了一系列内存空间分配(通常是由malloc函数完成)操作,为了能够在以后适当的时候(通常是你不再需要那些内存时)可以将分配的内存空间释放(通常是由free函数完成),你必须小心谨慎的维护好这些指向分配的内存空间的指针。
有经验的程序员大概都会有这样的感受,维护这些指针并非易事!特别是当程序比较复杂时,尤为如此。
如果你一不小心(其实这很容易)丢掉了某些指针,那么操作系统将无法回收那些内存(这便是我们常说的内存泄漏问题),除非你的程序死了。
第二就是关于内存分配释放操作本身。
如果你的程序会相当频繁的执行malloc和free函数,那么程序将会费去大量的CPU时间来执行它们。
为了解决以上两个问题,尽可能的提高内存利用率,HTK设计了一个内存管理子系统,利用自定义的堆结构(Heap)来进行内存分配和释放。
HTK内存分配和释放的主要思想是一次向操作系统要大一些的内存块,然后在将它分成小块供上层程序使用,不需要时只需释放那个大内存块。
HTK把堆结构分为三大类:1.M-HEAPS:元素大小固定,new/free操作执行次序无限制,可全局重置(global reset)。
2.M-STACK:元素大小可变,最后分配的空间必须先释放,可全局重置。
3.C-HEAPS:元素大小可变,new/free操作执行次序无限制,全局重置无效(直接使用malloc和free函数)。
二、数据结构1. 堆数据结构定义typedef enum{MHEAP,MSTAK,CHEAP} HEAPTYPE; // 堆类型定义typedef unsigned char* ByteP; // 无符号字符(8位)指针typedef void* Ptr;typedef struct _Block *BlockP;/* MHEAP和MSTAK块数据结构定义*/typedef struct _Block{ /* MHEAP ,MSTACK */size_t numFree; /* 空闲元素数目,空闲字节数*/size_t firstFree; /* 第一个空闲元素索引 ,栈顶索引*/size_t numElem; /* 块分配元素的个数,块分配的字节数*/ByteP used; /* 指向元素分配表指针,1bit/元素,不使用*/Ptr data; /* 指向数据区指针,指向数据区指针*/BlockP next; /* 指向下一个块指针,指向下一个块指针*/}Block;/* 堆数据结构定义*/typedef struct{ /* MHEAP ,MSTACK */char* name; /* 堆的名称,堆的名称*/HEAPTYPE type; /* 堆的类型,堆的类型*/float growf; /* 增长因子,增长因子*/size_t elemSize; /* 元素大小,总是1 */size_t minElem; /**/size_t maxElem; /* 每个块最大允许分配的元素个数,每个块最大允许分配的字节数*/size_t curElem; /* 当前块元素个数,当前块字节个数*/size_t totUsed; /* 已使用的元素总个数,以使用的字节总个数*/size_t totAlloc; /* 分配的元素总数,分配的字节总数*/BlockP heap; /* 指向当前块的指针,指向当前块的指针*/Boolean protectStk; /* 仅适用于MSTAK */}MemHeap;2. 堆数据结构框图M-Heaps内存堆结构示意图同一个M-Heaps内存堆中分配的元素大小都是一样的。
堆结构中的块指针成员变量heap指向数据块链的头。
数据块链中的每个块分配的内存区大小由(字节)计算得到。
每个块中的BYTE型指针成员变量used指向记录元素使用状态的表数据结构,表中第i位记录数据区中第i个元素的使用状态:1表示使用中、0表示空闲。
每个块中的firstFree成员变量的值表示数据区中第一个空闲元素的标号。
每个块中的numFree成员变量的值记录所在块中空闲元素的个数。
如果numFree为0表示块满,这时firstFree=numElem。
M-Stack内存堆结构示意图三、算法1.接口描述1.定义:Export-->void InitMem(void)说明:初始化全局MSTAK堆变量gstack和全局CHEAP堆变量gcheap。
该函数必须在调用任何其它堆操作函数前调用。
参数:无返回值:无2.定义:Export-->void CreateHeap(MemHeap *x , char *name , HeapType type , size_t elemSize , float growf , size_t numElem , size_t maxElem)说明:创建一个名称为name、类型为type的内存堆,elemSize指定内存堆中元素的大小,numElem指定块中元素默认个数。
如果,内存堆的类型是MSTAK 或CHEAP,则elemSize必须为1。
参数:x:指向给定的内存堆[In,Out]name:堆的名称[In]type:堆类型[In]elemSize:对于MHEAP表示堆的每个块中元素的大小,对于MSTAK和CHEAP,elemSize必须设为1 [In]growf:numElem:堆的每个块默认分配的元素个数[In]maxElem:堆的每个块最大允许分配的元素个数[In] 返回值:无3.定义:Export-->void ResetHeap(MemHeap *x)说明:释放内存堆x中所有元素,对CHEAP内存堆无效。
参数:x:指向给定的内存堆[In,Out]返回值:无4.定义:Export-->void DeleteHeap(MemHeap *x)说明:释放内存堆x中所有元素,并删除内存堆x。
参数:x:指向给定的内存堆[In,Out]返回值:无5.定义:Export-->Ptr New(MemHeap *x , size_t size)说明:从内存堆x中分配一大小为size的新元素并返回其指针。
如果x类型为MHEAP则忽略参数size。
如果分配失败,程序将会异常退出,所以返回值永远不会为NULL。
参数:x:指向给定的内存堆[In,Out]size:指定分配的元素大小[In]返回值:返回指向新分配的元素的指针6.定义:void BlockRecorder(BlockP *p , int n)说明:对于MHEAP堆,从块p向后搜索有n个以上(包括n个)元素的块,并将其移至块链表头。
对于MSTAK堆,从块p向后搜索有n个以上(包括n 个)字节数的块,并将其移至块链表头。
参数:p 指向给定的块[In,Out]n 对于MHEAP,表示元素个数;对于MSTAK,表示字节数。
[In]返回值:无7.定义:void* GetElem(BlockP p , size_t elemSize , HeapType type)说明:如果type为MHEAP则从块p中返回一空闲元素指针,并将其在使用状态表中的对应项置1。
如果type为MSTAK则从块p中返回一大小为elemSize 字节数的区域指针,并对块p中firstFree和numFree变量进行相应的修改。