




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于聲紋識別技術的聲音采集系統設計摘要隨著現代科學技術的不斷發展和通信技術的不斷前進,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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學信息技術第1課 建立班級課程表教案設計
- 透析患者心衰的護理查房
- 建筑工程質量控制教案
- 懷孕教學工作流程
- 浙教版信息技術八年級下 第六課 制作逐幀動畫作品 教學設計
- 四川省成都市高中生物 第七章 現代生物進化理論 7.2 現代生物進化理論的主要內容(2)教學設計 新人教版必修2
- 光伏系統培訓
- 農村五保供養中心管理合同協議書
- 前列腺增生術后護理診斷
- 2025年度股權投資分配合同書
- JT-T 1485.1-2023 自動化集裝箱起重機遠程操控安全作業規程 第1部分:岸邊集裝箱起重機
- 城鄉飲用水水質監測工作
- 心理團體輔導的保密協議
- 小小的自然觀察筆記
- 鋰電池組規格書范本
- 江蘇開放大學2023年秋《馬克思主義基本原理 060111》形成性考核作業2-實踐性環節(占過程性考核成績的30%)參考答案
- 流行性感冒診療方案(2020版)課件
- 井控安全培訓-課件
- 瑜伽館規章制度樣本
- 戰地衛生及救護學習教案
- DB65T4622-2022中小學校教室照明技術規范
評論
0/150
提交評論