【基于声纹识别技术的声音采集系统设计17000字(论文)】_第1页
【基于声纹识别技术的声音采集系统设计17000字(论文)】_第2页
【基于声纹识别技术的声音采集系统设计17000字(论文)】_第3页
【基于声纹识别技术的声音采集系统设计17000字(论文)】_第4页
【基于声纹识别技术的声音采集系统设计17000字(论文)】_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于声纹识别技术的声音采集系统设计摘要随着现代科学技术的不断发展和通信技术的不断前进,5G移动通信技术在网络传输这方面有着十分巨大的发展潜力。5G与现代工业生产交融,激发出新创意、新发展、新理念。5G与工业互联网的融合赋予了制造业数字化转型发展的新动力,对构建国内大循环为主体、国内国际双循环相互促进的新发展格局,助力经济社会高质量发展意义重大。5G与工业互联网相互碰撞、融合,必将打开制造业数字化、网络化、智能化发展的新篇章,为制造业数字化转型提供强大的推动力,为引领制造业高质量发展创新赋能。本课题将设计一个对电机工作时声音进行频谱分析的系统,经系统分析的电机工作声音将可以分辨电机实时工作状态。系统采用C#语言编写,在WPF(WindowsPresentationFoundation)用户界面框架上进行实现。系统具有声音采集的功能和本地读取音频的功能,把得到的声音用傅里叶变换进行频谱分析,再通过UDP网络传输协议传输到另一端进行进一步筛选、标签、分类。这样的设计旨在把通信网络技术与现代工业应用结合,希望这样一个课题设计能够使得通信工程技术得到更新颖的应用。关键词:5G电机声音采集频谱分析UDP网络传输傅里叶变换目录摘要 第一章绪论1.1研究背景当前社会随着互联网工业化不断发展,互联网工业化给我们的生活带来巨大的影响,上到“飞天”航空事业,下到“遁地”潜水深海,互联网工业技术一直在给我们的生活带来新惊喜、新理念,不断使我们的生活更舒适。随着科技不断发达,工业化程度在不断加深,互联网的技术也日新月异,在这二者的交融下,形成了一种互联网+工业的新潮流。也就是工业发展不断向着智能化、自动化、网络化迈进,在工业技术发展的同时,也一定程度上要求了互联网技术要跟进步伐。在这个时代背景下,有很多地方要用到智能化的工业。本课题针对工业化中几乎所有机器都要用到的“心脏”——电机,作为主要切入点。人们生活中处处可以找到电机的身影。例如:机械领域、航天航空事业、汽车领域、生产车间,甚至是日常生活中的电风扇、空调等。可见电机与人类社会的发展以及生活密切相关。可以说,处理好电机就可以极大的推动工业化发展和生活不断改善。因为工业化程度不断加深,所以对于电机的要求也越来越高,电机也在向复杂化、智能化靠近。然而电机作为各种机械结构中不可缺少的重要一环,电机的安全性也是一个十分值得考量的问题。如果一个电机在工作过程中发生故障,那么将会给生产带来巨大的隐患,稍有不慎会给企业带来巨大的经济损失甚至是生产车间的工人造成生命安全,正因如此电机的故障监测将是极为重要的一个环节。众所周知,电机在工作的工程中当然无法做到关停或拆卸来监测,工作过程中突然停下来会造成很大的经济损失,也会有相当高的人工成本以及严重影响了工业生产,那么如何解决这个问题,这会是一个有趣并且有意义的研究课题。在电机工作过程中往往会突发很多意想不到的问题,或是严重亦或是不严重无关紧要,但都值得去监测分析。以煤矿产业为例,我国作为全球煤矿储量和开采量最多的国家之一,自然是坐拥很多的煤矿产业[1]。由于现代化工业化发展,对于能源的依赖不断提高,有许多设备装配在煤矿产业,比如采煤机、提升机、掘进机等等。这些煤矿机械的动力主要来源就是电机,所以电机安全在煤矿产业中是至关重要的。电机在工作过程中,每一个零部件的安全隐患都影响着全局安全,若有一个零部件引起短路等问题都会带来一连串的连锁效应导致整个电机设备无法正常运作,在工作人员无法察觉的情况下引起电机发热发烫,导致钻头和充斥在煤层中的CO、瓦斯等有毒气体发生化学反应导致爆炸。然而目前国内几乎所有煤矿企业都采用的是定期检修,而且是离线检修,这样难以及时的发现问题。难以在实际运行过程中进行实时监测,更是难以同时检测多个电机设备。此时就要应用到一个可以实时监测电机是否故障的系统。图1-1煤炭工作钻机[1]1.2国内外研究动态1.2.15G国内外通信技术应用现状5G移动通信技术在网络传输这方面有着十分巨大的发展潜力。5G与现代工业生产交融,激发出新创意、新发展、新理念。作为连接工业互联网人、机、平台的关键环节,传统的无线网络技术,如工业Wi-Fi、蓝牙、ZigBee等已无法满足工业智能化需求,5G网络的超大带宽、超可靠低时延、海量物联等特性使其成为工业互联网的新型基础设施。5G与工业互联网的融合赋予了制造业数字化转型发展的新动力,对构建国内大循环为主体、国内国际双循环相互促进的新发展格局,助力经济社会高质量发展意义重大[2]。5G可以促进各类工业向数字化转型,如今工业向互联网化、数字化靠拢是工业制造业升级转型的必然结果。5G与工业互联网相互碰撞、融合,必将打开制造业数字化、网络化、智能化发展的新篇章,为制造业数字化转型提供强大的推动力,为引领制造业高质量发展创新赋能[3]。美国对于5G网络通信的研究早早就开始了,对此,美国政府也对通信网络的有关部门、公司投入了大量资金。他们在2016年启动5G互联网的研究计划。并且打算赶在世界之前,想在2018年就能进行5G商用。为了使得5G能跟更快问世,美国著名通信设备公司爱立信,提交了5G的各种相关核心技术。例如:5G核心网、5G传输网络协议还有各种核心技术。交由名叫Verizon的美国运营商使用,目的是在2018下半年能在一些城市、城镇商用5G。这个世界上还有很多国家具有竞争5G技术的能力,有日本、韩国、法国、俄罗斯等等。在这里先说说俄罗斯,俄罗斯在本国经济并不理想的情况下,对于5G的发展不是特别理想。5G不光是研究还是商用的费用都是很高的,在这个高费用的情况下俄罗斯5G发展并不是特别优秀。在俄罗斯有两家运营商,一个是Rostelecom,另一个是MegaFon,本来是相互竞争的状态,但考虑国家利益,他们必须一起发力,一起集合力量才能与世界上各国同台竞争5G关键技术。两家运营商即一起合作建立了一个研究小组,共同研究3.4-3.6GHz和26GHz频段频谱。对于5G发展,我国也给予了高度关注和重视。对于5G技术和商用民用而言,我国5G已走在世界的最前端。在国家的支持下,5G技术和产业突飞猛进,已经发展到了第二阶段。2020年是5G技术关键的一年,在这一年,我国5G基站数量就突破了58万个。现下,美国切断了我国华为公司对于5G研究的相关芯片等供应,在这个发展情况下,我国更要想办法突破重围想办法取得不断进步。1.2.2声纹识别技术国内外研究现状本课题重点设计一个关于利用5G网络传输技术结合声纹分析技术,对电机在工作状态进行判断的系统开发[4]。而目前来看,声纹分析在国内的使用方法主要是模板匹配法、最近邻方法、神经元网络方法、VQ聚类法等[5]。声纹分析各个行业都有广泛的应用,其中包括公安、银行等。声纹技术的发展始于1940年美国贝尔实验室,出于教聋哑人看图识音的目的,发明了声谱仪。这个仪器可以动态分析声音,对声音从三个角度:频率、强度、时间来分析,进而谱写出连续的频谱。贝尔实验室等人开始是使用声谱仪来对语音进行分析[6,7]。简而言之就是频谱分析、信号分析。而现代的声纹分析技术是从1990年代开始,用语音工作站代替了声谱仪。逐渐演变成基于计算机技术的语音分析系统。利用计算机技术的高效性、运算快以及分析准确等优异性能来进行开展。声纹不光在识别上有考究,在鉴定上也有很大的考究,主要有几种方法:语音学分析法、语音信号处理法、综合法一共三种[9]。总而言之,声纹识别技术因其独特的特性成为了一大发展趋势。1.3论文结构本论文分为五个大章节,第一章节阐述的是本课题《5G工业互联网中电机声纹分析系统的设计与开发》的研究背景和国内外研究现状,阐述5G、5G工业化、声纹分析之间的联系、应用以及各自的发展情况。第二章节主要阐述的是,与系统设计相关联的技术。本系统采用C#语言编写设计,其中对声纹分析就是对声音信号的分析,分析采用了傅里叶变换作为基础进行频谱分析。使用UDP传输协议作为信号处理分析后传输的工具,这也属于一种简单的物联网技术。第三章,对声音采集系统进行具体分析然后再设计实现,首先分析系统需要具备什么样的功能,再对每个功能进行分析、设计,最后实现。第三章分为7个小节从声音采集系统的功能分析、界面、音频录制、音频信号绘制、频谱分析、声音分类逐一讨论分析再通过编写程序的方式实现。第四章,网络传输部分的设计与实现。第五章,作为本次课题设计的实测与总结展望,让课程设计的系统应用在实际操作环境先使用并记录数据得出结论。再对本次设计做一个自我总结。第二章声纹识别相关技术2.1傅里叶变换傅里叶变换(FourierTransform)有几个部分需要说明的部分,首先是时域和频域,什么是时域又什么是频域呢。时域,就相当于人要走路,因为可能路途遥远走路由于时间过长,人自然的速度就不会像机器一般如此规律,会凭时间的推移使得人会累,所以速度会随着时间在变化,速度随时间变化的轨迹,这可以称为速度的时域。然后到频域,如果说一个正在发育的小孩子的身高随着时间会不断增长,这是在时域上的体现,那么在频域里,他的身高就只是一个符号,仅此而已。傅里叶变换告诉我们,一个不同相位、增幅的正弦波函数,是可以由无数个不同的周期函数所叠加而成的。傅里叶技术的频谱图,要想使得正弦波的曲线不断变陡,可以使用叠加的方法。然而正弦波最顶部那上升的部分会跟最底部下降的部分产生相互抵消,之后我们看到的图像就越来越像一个矩形了,也可以说一个标准的九十度角的矩形波形图就是由无数个正弦波叠加而成的。现在提到的只是矩形波,实际上我们能想得到的很多的波形,都是可以由若干个甚至无数个正弦波通过不断叠加而形成。傅里叶变换的相位谱,傅里叶变换有很多用处,简单来说,有一个很直白的应用,在生活中的应用。比如说,我们很多人都会看电视、听广播等等,当我们看电视听广播的时候总是要调频道,某某卫视、某某几套、某某频道等等,这时候“频道”的原理就是应用到傅里叶变换。频道,也就是频率的通道,之所有可以分为某某卫视、某某频道正是利用了频率不同,分为了很多个不同的频率通道,每个不同的频率通道都传输不同的信息、信号[10]。傅里叶级数的本质其实是,由无数个正弦波或者离散的正弦波可以构成任何的周期信号。傅里叶变换还可以应用在很多地方,例如机械故障分析、建筑振动分析、汽车零部件分析、噪声处理、噪声频谱分析[11]。甚至是医学都能应用傅里叶变换,随着傅里叶变换频谱分析的发展,其中傅里叶变换衰减全反射红外光谱法就在医学上产生了巨大的作用[12]。傅里叶变换只是一个统称,它分有很多种类,比如快速傅里叶变换FFT(FastFourierTransformation)具有容易计算的特性、方便应用的特点,FFT在正交频分复用上也有很大发展空间[13]。离散傅里叶变换DFT(DiscreteFourierTransform)也是傅里叶变换的一种,DFT同样也是一个十分重要的信号处理工具。不管是FT、FFT还是DFT,都在信号处理这个领域产生深远的影响和重大作用。这三种傅里叶变换都离不开对于信号频谱的计算,通过傅里叶变换可以简单的把信号从时域变换到频域,然而离散傅里叶变换可以计算得到系统频率响应,快速傅里叶变换更是可以轻松计算信号卷积。傅里叶变换公式如图2-1、快速傅里叶变换如图2-2。图2-1傅里叶变换公式图2-2FFT蝶形运算2.2UDP传输协议用户数据报协议UDP(UserDatagramProtocol)是指一种开放式系统互联参考模型中的一种无连接的传输层协议。提供面向事务的简单不可靠信息传送服务,IETFRFC768[1]是UDP的正式规范。UDP在IP报文的协议[14]。UDP是在传输层上的传输协议,是所用使用频率很高的传输协议之一[15]。它的几个经典特征比如:复用、分用和差错控制。这是UDP传输协议常用的基本功能,它是在IP数据报服务上加入的[16]。UDP与TCP有许多不同点,UDP协议可以从可靠性和时延来讨论。其一是UDP不需要像TCP那样新建一个连接然后产生了一定的时延,UDP在这一点上首先就不会产生建立时的时延[15]。其次是TCP需要保持连接,这样也产生了一定的资源消耗,UDP不会产生这种资源消耗,这是UDP相对于TCP的其中一个优点。由于UDP是一种面向连接协议,所以它在网络不好的时候会有一定的影响[17]。UDP的分组首部开销很小,只有8字节。而TCP有20字节。UDP还有一个特点,UDP不存在拥塞控制,在一些要求实时传输的网络应用时会产生一点数据丢失,但不会有太大时延。2.3物联网技术物联网IOT(TheInternetofthings)技术已经十分普及,简而言之,物联网技术可以分为两个种类,首先是“物”直接与USB等有线电路直接与网络端相连进行传输,比如手机连着USB插入电脑进行数据交换;其次是“物”通过无线网络信号传输通道与网络端相连,比如wifi、局域网[18]。物联网技术有很多应用,在我国也被称为传感技术,只要是任何物体互联网相关联的都可以称之为物联网。物联网最早的起源,源自于BillGates提出的,在以后的发展里,随着互联网不断壮大,以后的物体、工具、家具等等都会跟互联网相关,并且连接到互联网上来。虽然这一段源自《未来之路》的话在当时没有引起人们的广泛关注,但任何人也没有想到互联网技术竟然会发展得那么快,快到让物体也能跟互联网产生关联。与物联网相关的技术很多,射频识别技术就是其中之一,射频识别技术是一种无线连接的,通过附着在物体上的芯片、电子编码等,将这一信息传感到天线,再反馈到网络,形成一个读取物体信息的功能。可以看到超市里收银员拿着扫描工具对着商品的条形码进行扫描,便可以获得事先设置在条形码中的本商品的价格、信息,这就是射频技术识别的其中一种。云计算也是物联网技术的一种,通过各种有线或者无线网络的传输,实时计算客户终端的需求信息。由物联网传感器等传感设备获取信息上传到网络上,再通过云计算进行分析。第三章声音采集系统相关设计3.1声音采集系统功能分析本设计简要来说是要做一个对工业电机声音进行实时采集并上传到实时网络监控进一步分析声音“好”或者“坏”从而判断电机工作状态的系统,那么本章第一小节先首要分析讨论在声音采集这方面的系统需要具有怎么样的一个功能。在完成有声音采集所需的功能后,除了要包含声音采集这些基本的功能,还要围绕声音采集各参数调整、美化等功能来对系统所应该具有的功能和系统界面进行设计分析,这个系统是基于C#语言在WPF上的编写。首先是声音采集的工作流程如图3-1所示,既然是对声音进行分析,那么最开始的问题就要设计一个采集声音的系统,声音采集可以由两个途径来进行。一是直接从外界录音,从外界直接采集到音频信号,先选择采集声卡以及声音大小、声道类型再从外界录音采集。二是可以从直接读取本地PC端上的音频文件。然而录音抓取外界的音频也要存储在本地硬盘上,所以录音文件也能成为本地音频文件,从而也可以走本地读取音频的那条路线。声音采集工作做完之后,那么就需要对声音先进行一个简单的分析、拆解。声音被收集要以音频信号的形式去收集,这样来说就要把收集到的音频转为音频信号,并且要画出音频信号的图像。为方便进一步对音频信号进行分析,这里用傅里叶变换把音频信号变换之后画出频谱图,这样一来就好对音频信号进行进一步分析了。声音采集因为分有两个步骤可以进行,所以外界录音和本地音频文件读取需要分两个界面进行,声音采集的相关参数也要有:麦克风控件采集声音大小、声道选择、声卡选择。而本地读取音频文件也需要分类和标记。声音采集模块相关按钮的关系如图3-2所示,声音采集方面,与之相关有声道选择的操作、声卡选择,音量调整用来调整声卡的录取音量,点击“开始录音”操作之后,“开始录音”转变为“结束录音”。图3-1声音采集系统工作流程图图3-2声音采集模块按钮关系简单介绍声音采集步骤之后,还有几个细节问题,采集声音的bit宽度、Hz采样率、以及画出频谱图之后,采样点数的问题,这样的话就要求系统界面上要有bit宽度的调整按钮、Hz采样率的调整按钮,甚至可以是频谱亮度大小的调整、图像背景风格的调整,用来美化图像或是界面。音频信号的横坐标表示时间,纵坐标表示归一化率;频谱图的纵坐标代表频率抽样率,颜色深浅

标识

频谱幅度大小。图3-3频谱图与各调整按钮的关系,频谱图由“亮度调整”和“颜色调整”来调整频谱图的参数。图3-3频谱图相关按钮关系声音收集完毕后,画出声音信号的图像和频谱图,之后就可以由具体标准、规则去对声音进行判断“好”或者“坏”再对其分类。音频信号的横坐标有是时间,则标记的话就是以标记时间,表示标记在某个时间点,那个时间点的声音归一化率以及频谱图上的点标记下来。有标记就需要有对标记的命名,例如,给这段声音标记为“好”。如果标记错误也要可以删除,所以声音分类方面就要有“添加标签”的按钮并且对其命名,还要有“删除标签”这些按钮,再使用一个列表展示出标记的时间点和标签的名字。由此得出声音分类方面的按钮关系图3-4,声音分类界面有展示标签列表,标签列表用标签命名来进行命名操作,添加标签和删除标签相对应,有添加就有删除。图3-4声音分类相关按钮关系3.2系统界面设计分析3.2.1系统界面概述综上所述,得知了系统所需要具备的功能,以及相关的按键之间的关系之后。现在需要列出系统界面的组成要素:①声音采集相关要素及其按钮:“开始录音”按钮、“声卡选择”按钮、“声道选择”按钮、“麦克风声音大小选择”按钮、“结束录音”按钮。②绘图方面相关要素及其按钮:频谱图、音频信号图、“比特宽度选择”按钮、“抽样率选择”按钮、“频谱亮度调整”按钮、“频谱图颜色选择”按钮。③声音分类相关要素及其按钮:“添加分类”按钮、“删除分类”按钮、分类命名留白。④本地音频文件读取通道相关要素及其按钮:单独一个系统界面命名为“声音标记”、频谱图、“频谱亮度调整”按钮、音频信号图、“加载录音”按钮(选择本地音频文件)、“播放/暂停”按键、分流要素同上。通过这些系统要素设计出系统界面草图,如图3-5系统界面设计草图。图3-5系统界面草图3.2.2系统界面布局实现首先是界面布局,最基本的publicpartialclass构造函数,先利用自定义控件UserControl控件来构造出我们的一个框架。UserControl控件在这里的用法是可以使用我作为用户自己构建的函数名称,并且动态加载用户自定义的控件,再利用它的优势自动给控件赋值。在这个界面下在这个基本框架下,系统有画图工具DataPloter、声卡列表List<MMDevice>、音频捕捉录制WasapiCapture、声音波形WaveInEvent、抽样率mSampleRate单位Hz、比特宽度mBitDepth、声道mChannelCount、声音分类标记时间DateTimemRecordDateTime、标签命名mCurrentFileName、示波器Spectrogram、波形图颜色Colormap等。在具备构建了系统界面基本组成要素之后,使用Grid控件来对界面进行规划。简单来说,Grid控件是用来制作网格的控件。用Grid可以自定义网格的高宽,而每个按键、图像都占用系统界面空间一定的长度和宽度,利用Grid控件就可以自定义这些按钮(bottom)和图像的占用空间,设计宽和高为300比例。Grid.ColumnDefinitions用来定义Grid按列分化列宽,Grid.Column="0"则代表第一列,Grid.Column="1"则代表第二列以此类推。用Grid.RowDefinitions来定义Grid按行来分化行高,Grid.Row="0"代表第一行,Grid.Row="1"则代表第二行以此类推。用这些函数可以为系统界面分行分列并自定义有几行几列他们的宽高。可以用来设置声音分类标签的按钮“添加标签”、“删除标签”、命名空栏。设置声谱图在第一行第一列,频谱图则在它的下方,第二行第一列。函数ComboBoxItem可以来获取滑动列表,用来设置声道选择滑动列表有“双声道”、“单声道”。设置采样率选择滑动列表有“8000Hz”、“16000Hz”、“22050Hz”、“32000Hz”、“44100Hz”、“48000Hz”、“88200Hz”、“96000Hz”。设置比特宽度滑动选择列表有“8Bit”、“16Bit”、“24Bit”、“浮点”。它们都用函数Grid.ColumnDefinitions和函数Grid.RowDefinitions来把它们设置放在频谱图下方。函数VerticalAlignment垂直居中可以设置垂直中线,利用这个设置左右移动滑扭,这个滑扭居中线正中间,用此函数来设置“频谱亮度”(BrightnessSlider)滑扭。函数HorizontalAlignment水平居中可以设置水平垂直线,利用这个函数和VerticalAlignment函数,令VerticalAlignment="Center"HorizontalAlignment="Right"Content="开始录音"设置成“开始录音”按钮居右中。至此完成了界面布局的实现。3.3系统录音功能设计分析3.3.1录音功能概述声音采集分为两个渠道,一是从外界直接录音抓取,二是从本地直接读取音频文件。本小节先重点对从外界抓取录音的功能进行分析。既然是录音的话那必须要有麦克风和声卡,麦克风的作用是把外界的声音采集下来,再通过声卡把外界的原始声音信号加以转换录制进来,再转化成系统可以使用的输出声音。那么引出第一个问题,就是关于如何获取声音输出设备——声卡。其次是录音开始之后我要保证工作线程不能单一循环,要不然的话录音的时候系统不能同时干别的事情,工作线程简单来说就是一个程序循环对应一个线程的话,我们的程序要实现一次进行多个工作就要先初始化上一个工作的线程并且多加几个线程,这样才能同时进行不同的工作以及不同的循环。当一个工作开始时,就是这个工作线程在工作,这时候界面是要锁死的,那就只能工作一件事情,这个工作在执行的过程中其他都锁死,这样我们没办法做到同时进行多个工作,这就引出了上面所说的多加几个工作线程多个循环。界面和录音等工作是分开的,要去抓、捕捉、录制这个声音,这个时候循环语句在进行录音,那界面就可以交由系统来管理,这样工作和界面就都不冲突了。这时引出第二个问题,如何启动多个线程。接下来是录音的相关参数,录制进来的声音我也需要调整一定的音量,这样有利于对录制声音大小调整做一个细致的规划。这是第三问题,声音大小调整。然后是录制声音与界面之间的联系,跟界面相关还有按钮之间的关系。假设现在是工作状态,系统在工作录音“开始录音”,则点击“开始录音”,此时其他的按钮例如“麦克风”、“Hz选择”、“bit选择”、“声道选择”必须显示为灰色并且表示不能被点击不能被选择。不然的话无法正确进入下一个绘制图像的环节,既然选好了绘制图像的参数就不能中途再去改变参数不然会发生系统错误,所以要设置点击“开始录音”后这个按钮变成“结束录音”的结束工作指令按钮,直到点击“结束录音”为止,按钮又恢复可以点击的状态。这是需要解决的第四个问题。录音功能开始工作,即点击“开始录音”之后,需要形成一个录音文件,即录音开始之前要创建一个录音文件,以保证录音之后有一个基本的缓存,并且保存在系统文件夹里,这样就可以做到不仅是实时观测音频图像和频谱图,也是可以在保存本地文件夹之后再拿出来做进一步分析,走本地直接读取音频文件那一个环节途径。这就是需要解决的第五个问题。由上述录音功能得出一个录音功能的流程以及与之有关联的关系流程图3-6。图3-6录音功能关系流程图3.3.2录音功能设计实现由3.3.1小节可知,要想实现录音功能,首先需要解决的就是那4个问题,第一个问题,如何获取声音输出设备——声卡。(1)、初始化录音设备;主要功能:初始化录音设备;函数封装名称:OnInitCaptureDevices;实现步骤:(A)、枚举多媒体设备:使用系统类MMDeviceEnumerator实现,该类实例化名称为enumerator。通过该类成员函数EnumerateAudioEndPoints获得声音捕获设备,并保存为captureDevices变量。通过GetDefaultAudioEndpoint成员函数获得当前设备,并保存为defaultDevice。(B)、获得当前音量并显示:通过defaultDevice的变量AudioEndpointVolume读取MasterVolumeIevelScalar.获得当前麦克风设置的音量,并赋值到mVolumeSlider界面控件上。获取声卡后需要解决第二个问题,启动一个工作线程进行工作。(1)、初始化工作线程;主要功能:初始化工作线程;函数封装名称:OnInitThread;实现步骤:(A)、构建一个bool逻辑语句,bool是用来判断真(true)或者假(false)。用来判断的是,驱动是否是空的(null),空的话就执行工作,不空的话就不执行。(B)、再使用函数mWaveInEvent?.StopRecording()来判断线程工作,这个地方的InEvent就是用来告诉刚才那个工作线程停止,这个事件是不空的话是有效的话就停止,不然就继续工作。(C)、数据返回就写个文件,成为一个缓存,成员函数CaptureOnDataAvailable,之后就可以回到那个工作线程,函数调用OnThreadFunction。(D)、再通过函数mIsStopEvent.Reset()检测事件是否要退出,命令系统退出那么就退出事件或是暂停、继续。第三个需要解决的问题,按钮界面响应,录音需要获得正确的声音大小。(1)、音量按钮;主要功能:调整声卡音量;函数封装名称:VolumeSlider_ValueChanged;实现步骤:(A)、使用系统类函数VolumeSlider_ValueChanged实现,通过成员函数GetCurrentCaptureDevice获得录音设备的音量,并保存为变量captureDevice,再用实例化为mVolumeSlider.Value的VolumeSlider_ValueChanged函数,通过界面拖动调节声音可调大调小,当系统获得正确的(current)音量数值(value)之后系统就可以录音工作。第四个问题,录音工作与系统界面之间的联系。从前面的分析得知,录音开始工作之后系统界面与它有关联的有:图像绘制界面、声音分类界面,以及一下按钮。声音分类是关于检测的那一部分,放到3.7小节详细分析。那现在先分析录音功能与图像绘制以及界面按钮之间的关联。首先是绘图界面,录音开始之前,先要初始化界面示波器。(1)、初始化示波器;主要功能:初始化示波器;函数封装名称:OnInitScope;实现步骤:(A)、调用函数DataPloter,实例化是mDataPloter.ClearPloter,Ploter就是画图,Clear清理,就是清理一下上一个录音过程中画的图谱,清理完之后再接着判断是否可以开始下一次工作,下一次录音。因为在录音的同时,绘图工作也在实时进行中,需要清空上一个音频录制期间绘制好的图,不然的话无法正常绘图,所以在这里需要初始化界面。(2)、界面按钮响应;主要功能:关闭/复通按钮;函数封装名称:CaptureButton_Click;实现步骤:(A)、录音功能与界面按钮之间的关系,在图3-5所示,录音的时候要保证绘图相关的按钮不能再被点击,要不然会造成系统错误,所以这时候要把按钮关闭掉,标成灰色表示无法被点击使用。这时调用的函数是CaptureButton_Click,构造一个if循环,if点击“开始录音”时,则其他的按钮“麦克风”、“Hz选择”、“bit选择”、“声道选择”等显示为灰色表示不能被点击不能被选择,就运用到一个if循环语句,当点击“开始录音”时,把下列其他按钮都等于false,然后“开始录音”的按钮变为“结束录音”,直到点击“结束录音”为止,stop循环结束,按钮又恢复可以点击的状态,然后“结束录音”又变成“开始录音”按钮。(B)、停止录音时调用函数ReordingStopped,停止事件循环,再告知那些按钮恢复到可以使用的状态调用函数MessageBoxButton.OK,MessageBoxImage.Information。录音结束后数据返回就写个文件,成为一个缓存CaptureOnDataAvailable,之后就可以回到那个工作线程,函数调用的是OnThreadFunction。再通过函数mIsStopEvent.Reset()检测事件是否要退出,命令系统退出那么就退出事件或是暂停、继续。第五个问题,这是最后一个需要解决的问题是音频录制的缓存问题,经过分析得出结论,录音之后需要一个文件夹来保存录音文件,设置相关参数之后就可以创建录音,设置录音的格式。(1)、录音保存;主要功能:保存录音文件;函数封装名称:systemPath;实现步骤:(A)、在设置录音格式之前要先创建一个录音文件,录音文件的格式为,系统路径+录音.wav,格式为wav。之后开始记录录音的一些数据,当录音文件创建好之后,开始录音使用函数为StartRecording,接下来是几个录音的停止函数,以及录音数据返回的函数,用来告诉函数由哪个循环或者函数来处理,表达了数据得到再由哪个功能处理的作用。调用systemPath函数,函数的表达的是系统路径的意思,把录音文件保存到系统路径。(B)、在这里我设置录音文件的命名格式为SXAudio{0:yyy-MM-ddHH-mm-ss}.wav,表示的是SXAudio+年.月.日.小时.分钟.秒.wav。然后再利用systemPath函数设置系统录音放置在系统路径的“录音”文件夹里。然后录音功能结束。3.4系统绘图功能设计分析3.4.1绘图功能概述既然要对音频进行分析,那么就要画出它的音频信号图,录音功能开启后,系统会实时对录制到的音频进行绘制出音频信号图和频谱图。既然要绘制图像,那就要考虑到绘制一个怎么样的图像,图像的横坐标是什么,纵坐标又是什么,单声道还是多声道,抽样间隔是多少,bit宽度又是多少,涉及到一个十分具体的问题。那么在录音功能开启之后,就会绘制音频信号图,所以要想绘制下一个音频信号图,需要先把上一个音频信号图清空掉,这就是要初始化界面,然后再初始化示波器开始绘图。参数调整之间的关系如图3-6所示。图3-6绘制图像关系图3.4.2绘图功能设计实现在3.1中设定了界面按钮,界面按钮中已经设计了bit宽度、采样率、声道的调整参数,现在具体来实现这些设定。(1)、初始化示波器;主要功能:初始化示波器;函数封装名称:OnInitScope;实现步骤:(A)、首先是对于音频信号图横纵坐标的实现,初始化示波器使用的是函数OnInitScope,接着设置示波器图像曲线的Y轴曲线的宽度,范围是-1到+1。而横坐标则定义为时间。画一条曲线有它的名称,用SetLegendeLeftMargin(200)定义这条图谱200像素。(B)、通过示波器画出我所要观测的声音的频谱图、声谱图(SpectrogramCmaps)。使用界面的风格函数AppearanceManager,用当前风格来初始化这个界面,并且设置20000个点的缓存初始化(Current,20000)。缓存的目的:缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。(2)、参数配置;主要功能:调整音频信号图绘制参数;函数封装名称:RecordWASAPI;实现步骤:(A)、构建采样录音的参数,函数调用为RecordWASAPI保存在函数MMDevicecapturDevice。设置相关采样率数组(sampleRates)为{8000,16000,22050,32000,44100,48000,88200,96000},单位为Hz。设置数组量化比特(bitDepths)为{8,16,24},单位为bit。设置数组声道为(channelCounts)为{1,2},单声道、多声道。调整绘制参数之后,开始初始化界面的问题。由3.3.1所知,录音开始之前,先要初始化界面,然后确认声卡,声卡获取数据后才能封装到绘图工具,进行实时绘图。(1)、初始化界面;主要功能:初始化界面清空上一个图;函数封装名称:mDataPloter.ClearPloter;实现步骤:(A)、清空界面使用的是函数mDataPloter.ClearPloter,Ploter就是画图,Clear清理,就是清理一下上一个录音过程中画的图谱,清理完之后再接着判断是否可以开始下一次工作,下一次录音。(B)、初始化完界面和绘图后,需要再确认一下声卡,检测获得当前的声卡,有声卡之后系统就相当于被告知可以开始录音,就再多封装一个函数进入循环。这样才能使得可以进行下一个图像绘制工作。在音频信号图绘制之前是录音环节,在3.3.2所说录音结束后,就要让录音环节返还一个数据,每次返回就写个文件,成为一个缓存。(1)、初始化界面;主要功能:初始化界面清空上一个图;函数封装名称:mDataPloter.ClearPloter;输入输出函数:无;实现步骤:(A)、返还缓存使用的函数是CaptureOnDataAvailable,之后再回到这个工作线程,回到工作线程的函数是OnThreadFunction。然后再通过函数mIsStopEvent.Reset来检测事件是否要退出,之后就会开始一个画图工作,工作之前先更新一次界面,刷新界面函数Invoke就可以继续画图工作。循环语句,当系统获得正确的(current)音量数值(value)之后,对声音可以进行一个绘制图像。这个数据就是用来画波形图的,数据弹出后画入图谱中,频谱图像有时间有数据并且加入分析,更新频谱之后系统就会自动把频谱画进去。3.5频谱绘制功能设计分析3.5.1频谱绘制功能概述要对音频进行进一步的分析。光是得到音频信号图是不够的,还需要绘制出频谱图。频谱图是由音频信号经过傅里叶变换得来的,那么频谱绘制功能的重点就是如何解析音频信号,使用什么参数来对频谱图制定标准,然后再到如何把频谱图在系统界面里呈现出来。由图3-7流程关系图,频谱绘制的流程是音频信号经过傅里叶变换之后需要形成图片,通过以图片的形式来呈现在系统界面上,这样就形成了频谱图。图3-7频谱绘制流程3.5.2频谱绘制功能设计实现首先是初始化频谱,初始化频谱之后再用傅里叶变换工具进行傅里叶变换,调用时时绘制函数,然后再调整FFT的频谱参数。(1)、初始化频谱;主要功能:初始化频谱;函数封装名称:InitSpectrogram;实现步骤:(A)、调用系统类函数InitSpectrogram。频谱初始化之后频谱画图使用的是傅里叶变换(fft),调用时时绘制函数stepsize,这个函数表达的是时时刻刻都在画图,在此系统用于对得到的信号进行实时的傅里叶变换实时画出频谱图。(B)、调用函数fftSize,;令fftsize=1024表示1024个点,就是每录制1024个点就能画一次傅里叶变换频谱图,要画下一个语音,那么就令stepSize=fftSize/20表示更新20倍更新率,意思是一段语音抽出一段出来画图,想要画下一次但上一次肯定会有重叠的地方,相当于多挪一步再画一次,挪一步画一次挪一步画一次这样就避免了过高的重复以及这造成的不准确。(C)、之后可以进行频谱亮度的调整,调用函数mSpectrogramBrightness,顾名思义函数的意思就是用它来调整图像的亮度。当频谱绘制之后,要设法把频谱图实现在界面,这里使用的方法是把频谱图转换成图片,再以合适的格式时时放置在系统界面上。(1)、更新频谱;主要功能:更新频谱;函数封装名称:UpDateSpectrogram;实现步骤:(A)、当频谱在示波器里绘制了之后,调用函数UpDateSpectrogram来更新频谱,再用固定宽度函数SetFixedWidth,固定1024个点的数据。(B)、从频谱提取出数据,转换为一张图片,因为每一次的频谱都是一张图片。转换为可以画图的图片最终表现出来。创建一张图片,Bitmap就是图片的意思,把频谱转换为图片,把频谱数据通过画图工具提取出来画成一张张图片,而这张图片将转换成界面可以识别显示出来的格式,显示在界面上。转换格式调用函数BitmapToBitmapImage。3.6声音分类功能设计分析3.6.1声音分类系统功能概述在3.1小节也阐述了,声音的采集分为两个途径进行,除了第一个途径直接从外界录制抓取音频,在3.6小节重点对从直接读取本地PC端上的音频文件的这个功能进行分析再设计。首先是功能阐述,由3.1小节我们可知声音通过采集需要被进一步分析,所以在声音分类的这一部分也要结合分析,既然要分析那当然就要涉及到音频信号图、频谱图。那么既然分为两个界面,所以在声音分类的这个界面也需要有绘制音频信号图和频谱图的工具,以及他们的按钮等。所以在这里得出几个需要解决的问题,第一个问题是关于声音分类系统的界面设计,其次是各个绘制图像的设计,再到是声音分类系统这里也需要对声音进行贴标签。所以得出声音分类系统界面的草图3-8之后再根据这个草图来进一步细化实现成系统界面。图3-8声音分类界面草图3.6.2声音分类系统界面设计实现首先展开对界面的设计与分析,既然是放在同一个界面里,那么调用的函数更声音采集功能界面的函数是同一个函数,首先还是最基本的publicpartialclass构造函数,再是利用自定义控件UserControl控件来构造出这个系统和界面框架。UserControl控件的用法在上面就说过了,让我们作为用户使用自己构建的函数名称,并且动态加载用户自定义的控件,再利用它的优势自动给控件赋值。然后在这里形成了基本框架,这个系统有画图工具DataPloter、音频文件加载控件AudioFileReaderEx、波形输出WaveOutEvent、声音分类标记时间DateTimemRecordDateTime、标签命名mCurrentFileName、示波器Spectrogram等。上述是声音分类系统界面基本组成要素,还是使用Grid控件来对界面进行规划。用Grid控件来制作网格的控件、自定义这个系统界面网格的宽度和高度,以及每个按键、图像在界面空间高度和宽度比,利用Grid控件就可以自定义这些按钮bottom和图像的占用空间,设计宽和高分为600和300比例。用Grid.ColumnDefinitions来定义列宽,用Grid.RowDefinitions来定义行高,这些函数的用法在3.2小节已经做过一次阐述。用这些函数可以为声音分类系统界面分行分列并自定义他们的宽高。可以用来设置声音分类标签的按钮“添加标签”、“删除标签”、命名空栏。设置频谱图在第一行第一列,频谱亮度调整按钮设置在频谱图的下方,第二行第一列。还是利用垂直居中函数VerticalAlignment来设置垂直中线,然后设计这个频谱亮度调整的左右移动滑扭BrightnessSlider。函数HorizontalAlignment水平居中可以设置水平垂直线,利用这个函数和VerticalAlignment函数,令VerticalAlignment="Center"HorizontalAlignment="Right"Content="开始录音"设置成“开始录音”按钮居右中。至此完成声音分类界面布局的实现。3.6.3声音分类系统本地读取音频功能设计实现声音分类系统功能的步骤跟声音采集那部分功能的流程大致一直,有几个不同的地方。首先设计的是读取本地音频文件的问题。既然要打开本地文件夹,那就需要用一个可以打开本地文件夹的函数控件。(1)、更新频谱;主要功能:更新频谱;函数封装名称:UpDateSpectrogram;实现步骤:(A)、系统类函数UpDateSpectrogram更新频谱,更新频谱后调用函数OpenFileDialog,这个函数的作用是打开本地文件,可以把事先设置好的硬盘路径打开,然后再用这个函数调取数据。调用过滤函数Filter,令Filter="声音文件|*.wav|所有文件|*.*",即只可显示以wav结尾格式的文件。这是调用文件的实现。(B)、调用函数GetFileDateTimeByFileName,获取文件时间数据。文件调用可以正常使用后,要播放本地硬盘文件,即点击播放按钮,让文件播放录音,并且实时绘图。播放按钮点击后,设置一个暂停键,这样做的目的是实现播放/暂停来回切换。(1)、循环播放;主要功能:把音频文件设置成循环播放或者停止;函数封装名称:UpdatePlayFileButton;实现步骤:(A)、在这里可以调用函数UpdatePlayFileButton更新播放文件按钮,再调用函数PlaybackState来查询播放状态,如果系统是播放音频文件的状态,即把播放按钮切换成暂停按钮。(B)、这里有一个细节问题,如果声音播放完了要怎么处理,这时候使用函数OnPlaybackStopped把设置音频播放设置为循环播放。启动多线程工作,让系统可以一边进行音频播放、一边进行绘图工作。(1)、初始化线程;主要功能:启动多线程工作;函数封装名称:OnThreadFunction;实现步骤:(A)、的调用函数OnThreadFunction,线程的意义、步骤如3.3小节一样。通过函数mIsStopEvent.Reset()检测事件是否要退出,命令系统退出那么就退出事件或是暂停、继续。声音分类这边的绘图指示控件。(1)、音频信号图绘图判断;主要功能:判断原图像上是否绘制;函数封装名称:mDataPloter;实现步骤:(A)、函数调用沿用mDataPloter函数,使用if语句判断是否有历史图像令mDataPloter!=null,表示如果界面上有上一个音频播放时留下的历史图像,则调用函数ClearPloter清空图像。(2)、初始化示波器;主要功能:初始化示波器;函数封装名称:OnInitScope;实现步骤:(A)、调用主函数OnInitScope初始化示波器。(B)、设置示波器图像曲线的Y轴曲线的宽度,范围是-1到+1。横坐标定义为时间。画一条曲线有它的名称,用SetLegendeLeftMargin(200)定义这条图谱200像素。使用界面的风格函数AppearanceManager,用当前风格来初始化这个界面,在这里设置的缓存初始化点为100000(Current,100000)。绘制频谱图。(1)、初始化FFT;主要功能:初始化FFT;函数封装名称:OnInitFFT;实现步骤:(A)、首先初始化傅里叶变换这里调用函数OnInitFFT。(2)、参数配置;主要功能:调整频谱图绘制参数;函数封装名称:fftSize、stepsize;实现步骤:(A)、调用函数stepsize,令其时时刻刻都在画图。再调用函数fftSize,令fftsize=1024,每录制1024个点绘制一次傅里叶变换频谱图,再令函数stepSize=fftSize/20,20倍更新率。(B)、之后进行频谱亮度的调整,调用函数mSpectrogramBrightness,顾名思义函数的意思就是用它来调整图像的亮度。当频谱在示波器里绘制了之后,需要被提取到界面。(1)、更新频谱;主要功能:更新频谱;函数封装名称:UpDateSpectrogram;实现步骤:(A)、调用函数UpDateSpectrogram更新频谱。(2)、频谱图界面实现;主要功能:把频谱图转换成图片显示在系统界面;函数封装名称:BitmapToBitmapImage;实现步骤:(A)、再把数据提取出来,转换为一张图片,如3.5小节所说因为每一次的频谱都是一张图片。转换为可以画图的图片最终转换成界面可以识别显示出来的格式,显示在界面上。转换格式调用函数BitmapToBitmapImage。3.7系统设计实现结果通过上述实现步骤,当前是完成了系统界面、录音功能、本地录取音频声音分类功能、绘图功能的实现如图3-9(a)和图3-9(b)所示系统界面。录制音频和本地读取音频文件的情况,音频在系统的解析下,经过示波器FFT绘制成音频信号图、声音频谱图。通过选择参数可以调整bit宽度、采样率、频谱亮度、颜色等等。图3-9(a)声音采集系统界面图3-9(b)声音分类系统界面第四章网络传输模块设计过程4.1网络传输模块功能概述本课题设计目的是,设计一个能够声音采集(外界录取或本地音频读取)分析并传输到网络上的系统。在第三章实现了对声音采集系统的设计,目前还进行网络传输这个模块的设计分析。声音采集系统和网络传输模块的关系如图4-1所示,音频采集从两个部分可以实现,一是外界直接录制,二是本地音频文件读取,读取之后绘制出音频信号图像、频谱图,再利用电机不同的声纹规则进行分析“好”、“坏”。图4-1网络传输功能关系流程图网络传输使用的是UDP网络传输协议,在第二章介绍过UDP传输协议的非面向连接性能,不用保持连接状态。用UDP来传输数据不需要去与对话端连接,所以在传输时需要通过一个应用程序来跟通话终端建立联系。UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。4.2网络传输模块功能设计实现4.2.1网络传输模块发送端功能设计实现第一步是制定异步UDP传输框架,并获取IP地址。(1)、构建UDP主框架;主要功能:定义系统传输使用UDP传输协议;函数封装名称:AsyncUdpClient;实现步骤:(A)、调用主函数AsyncUdpClient,定义变量IP地址(IPAddress),端口(port),

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论