秦丹
摘要:Wav文件包含文件頭和數(shù)據(jù)塊,記錄了聲音的波形。.Net C#開發(fā)環(huán)境提供了文件流和流的讀寫器等操作類,可以方便地實現(xiàn)對wav文件的解析從而得到聲音的波形數(shù)據(jù),再利用Graphics類的各種圖形繪制方法將波形數(shù)據(jù)繪制成曲線。
關(guān)鍵詞:wav;波形;C#;Graphics
中圖分類號:TP311文獻標(biāo)識碼:A文章編號:1009-3044(2012)22-5454-02
Sound Wave Shape Showing by .Net C#
QIN Dan
(Computer Science School of Yangtze University,Jingzhou 434023,China)
Abstract: Wav file includes header and data block, recording the wave shape of the sound. .Net C# provides some file accessing class such as FileStream and StreamReader, so that it is easily to get sound data from wave. At last, the wave shape of the sound can be drawed by using the methods of Graphics class.
Key words: wav; wave shape; C#; Graphics
圖形化的聲波波形以最直觀的方式將聲音的物理特性展現(xiàn)給人們,波形的外觀包含了頻率,響度等信息,進一步解析聲波還能得到聲音的頻譜信息。對波形的研究甚至可以了解人發(fā)音的聲母和韻母,從而為語音識別提供支持[1]。波形顯示本質(zhì)上是以圖形化的方式還原聲音文件所記錄的聲音采樣信號。.NET平臺的C#編程環(huán)境提供了GDI+技術(shù),極大地便利了圖形化編程。
1聲音文件的結(jié)構(gòu)
聲音文件記錄聲音信息,理論上任何可以還原聲音的文件都可以作為波形顯示的信息源。聲音的記錄方式有多種,最簡單而又最能保持聲音本色的方法是直接記錄波形,如wav文件。只要采樣率足夠高,該格式記錄的聲音文件能夠十分接近原聲,能獲得非常高的音質(zhì)[2],其缺點是文件體積較大。為了文件體積較小,人們又推出mp3、ra等格式的文件,其特點是采用了壓縮技術(shù),其代價是聲音的品質(zhì)有所下降。還有一類聲音文件采用音色庫和發(fā)聲指令的手段還原聲音,如midi文件,它只是模仿各類樂器的演奏效果而不是記錄聲音,更重要的是它不能發(fā)出人聲,因此其使用受到極大限制。
由于wav文件直接記錄波形,便于各類應(yīng)用程序解析聲音信息,該文用它來展示使用.Net C#從wav文件中獲取波形并繪制聲波。wav文件格式是RIFF文件格式的一種。wav文件分文件頭和數(shù)據(jù)塊兩部分,文件頭又分為RIFF/WAV文件標(biāo)識和聲音數(shù)據(jù)格式兩部分[3]。
wav文件的編碼方式主要有PCM (PulseCode Modulation脈沖編碼調(diào)制)和ADPCM (Adaptive Different ial Pulse Code Modulation自適應(yīng)差分脈沖編碼調(diào)制)兩種。使用PCM脈沖編碼調(diào)制的采樣文件,其文件頭為4字節(jié),但有時wav文件頭中會增加fact塊,此時其文件頭可達58字節(jié)。而ADPCM編碼的采樣文件,若其包含有fact塊,則其文件頭可達90字節(jié)。wav文件頭記錄的主要信息包括采樣頻率、采樣精度和聲道數(shù)。采樣頻率越高音質(zhì)越接近原聲,采樣頻率通常有11025hz、22050hz、44100hz、48000hz四種。采樣精度數(shù)值越大分辨率越高。聲道數(shù)包括單通道和雙通道兩種,前者只能讓一個喇叭發(fā)音,后者則能讓兩個喇叭發(fā)音從而產(chǎn)生立體聲效果。
2利用.net的C#繪制聲波波形
Visual Studio 2005是微軟推出的.Net開發(fā)平臺。C#語言是隨著.net架構(gòu)一起設(shè)計出來的一種全新開發(fā)語言,特別適于用戶界面設(shè)計。.Net C#語言在圖形處理方面提供了GDI+技術(shù),使用Graphics類封裝諸多的圖形繪制方法,能繪制直線、曲線、多邊形、橢圓,甚至還能將文字作為圖形輸出[4],以便于產(chǎn)生特效,還提供了圖像的翻轉(zhuǎn)、扭曲以及像素操作等豐富功能,為圖形圖像編程提供全方位的支持,最大程度地減少了對底層API的直接調(diào)用,提高了編程效率。
2.1讀取WAV文件
C#提供了一系列靜態(tài)和非靜態(tài)的文件操作類支持文件的創(chuàng)建、復(fù)制、刪除和讀寫操作。為了實現(xiàn)文件的隨機讀取,.NET C#提供了FileStream文件流以記錄文件的操作位置。利用靜態(tài)類File的Open()等方法可以返回一個指向硬盤上特定文件的文件流實例。再利用文件流實例作為參數(shù)初始化一個流的讀寫器對象,由流的讀寫器最終實現(xiàn)對文件的讀寫操作,其操作可以指定每次讀寫若干字節(jié),十分靈活方便。流的讀寫器又分為二進制讀寫器和文本讀寫器,前者空間利用率高,而后者所寫的文件便于閱讀,二者各有所長。該文采用后者。
FileStream fs = File.Open("C:\a.txt");
StreamReader sr = new StreamReader(fs);
char[] temp = new char[36];sr.Read(temp,0,36); //從文件中讀36個字節(jié)到字符數(shù)組temp
2.2生成Graphics對象
C#的圖形操作方法多封裝于Graphics類中,使用這些方法必須先生成一個該類的實例。通常有三種方式得到一個實例。編程者應(yīng)根據(jù)場合靈活地選擇下述方式以達到功能和性能目標(biāo)。
1,用靜態(tài)方法FromHwnd或者FromImage
Bitmap Bm = new Bitmap("C:\myPic.bmp”);
Graphics g = Graphics.FromImage(Bm );
2,某些控件的CreatGraphics方法
Graphics g = pannel1.CreatGraphics();
3,從繪圖事件的參數(shù)e中獲取
Graphics g = e.Graphics;
2.3 Graphics提供的線條繪制方法
波形是一種不規(guī)則曲線,wav文件記錄了波形上的各點數(shù)值,各點之間的橫坐標(biāo)間距由采樣頻率決定,各點的取值范圍和精度由采樣精度決定。波形繪制原理是用直線依次連接波形上相鄰各個點。由于采樣頻率非常高,所以本來是由一些直線依次相連所構(gòu)成的折線就在屏幕上形成了光滑細膩的曲線。Graphics類的DrawLine()方法繪制直線,該方法的一種重載形式需要三個參數(shù):畫筆,用以定義線條的顏色和樣式;之后兩個參數(shù)是起點和終點,其坐標(biāo)是相對于相關(guān)繪圖控件的位置,而非屏幕原點。
Point p1 = new Point( 10, 20 );
Point p2 = new Point( 90, 150 );
Pen pen1 = new Pen( Color.Blue, 10 ); //其中10表示線條寬度。
e.Graphics.DrawLine( pen1, p1, p2 ); // e是來自Paint事件的參數(shù)。
3運行的結(jié)果及遇到的問題
利用.Net C#的圖形功能和文件操作類,再根據(jù)wav文件的格式構(gòu)造合適的數(shù)據(jù)結(jié)構(gòu),能很順利的讀取wav文件,并以圖形化的方式顯示其波形。圖1顯示的是某單通道16位wav文件中一段約9毫秒長度的聲音波形。
圖1
圖形編程常遇到的問題是控件上所繪制的圖形在程序的切換過程中被破壞或丟失。其原因在于應(yīng)用程序的前后臺切換將導(dǎo)致窗體的paint()方法被調(diào)用,該方法將重繪控件表面,這樣,原先通過代碼繪制在控件表面的圖形就在重繪控件外觀的過程中消失了。解決之道在于利用Bitmap對象充當(dāng)一個內(nèi)存緩沖區(qū),以該對象為參數(shù),用Graphics類的FromImage()方法得到一個Graphics實例。通過該實例繪制的圖形就保存于內(nèi)存緩沖區(qū)中。然后在窗體的paint()方法中通過控件的DrawImage()方法將緩沖區(qū)中的圖形畫在控件表面。這樣不僅解決了圖形丟失問題,還會有很好的性能表現(xiàn)。
參考文獻:
[1]趙文博,張生,孫國強,等. WAV音頻分句的算法設(shè)計[J].微計算機信,2011(27):204-205.
[2]黃煜,陳克安,鄭文.聲樣本質(zhì)量及其在聲品質(zhì)評價中的應(yīng)用[J].電聲基礎(chǔ),2008(32): 40-43.
[3]李敏.音頻文件格式wave的轉(zhuǎn)換[J].電腦知識與技術(shù),2005(8):73-75.
[4]鄭宇軍. C#面向?qū)ο蟪绦蛟O(shè)計教程[M].北京:人民郵電出版社,2009:316-319.