打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于.Net C#的声音波形显示

摘要:Wav文件包含文件头和数据块,记录了声音的波形。.Net C#开发环境提供了文件流和流的读写器等操作类,可以方便地实现对wav文件的解析从而得到声音的波形数据,再利用Graphics类的各种图形绘制方法将波形数据绘制成曲线。
中国论文网 http://www.xzbu.com/8/view-3530864.htm
  关键词:wav;波形;C#;Graphics
  中图分类号:TP311文献标识码: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
  图形化的声波波形以最直观的方式将声音的物理特性展现给人们,波形的外观包含了频率,响度等信息,进一步解析声波还能得到声音的频谱信息。对波形的研究甚至可以了解人发音的声母和韵母,从而为语音识别提供支持[1]。波形显示本质上是以图形化的方式还原声音文件所记录的声音采样信号。.NET平台的C#编程环境提供了GDI+技术,极大地便利了图形化编程。
  1声音文件的结构
  声音文件记录声音信息,理论上任何可以还原声音的文件都可以作为波形显示的信息源。声音的记录方式有多种,最简单而又最能保持声音本色的方法是直接记录波形,如wav文件。只要采样率足够高,该格式记录的声音文件能够十分接近原声,能获得非常高的音质[2],其缺点是文件体积较大。为了文件体积较小,人们又推出mp3、ra等格式的文件,其特点是采用了压缩技术,其代价是声音的品质有所下降。还有一类声音文件采用音色库和发声指令的手段还原声音,如midi文件,它只是模仿各类乐器的演奏效果而不是记录声音,更重要的是它不能发出人声,因此其使用受到极大限制。
  由于wav文件直接记录波形,便于各类应用程序解析声音信息,该文用它来展示使用.Net C#从wav文件中获取波形并绘制声波。wav文件格式是RIFF文件格式的一种。wav文件分文件头和数据块两部分,文件头又分为RIFF/WAV文件标识和声音数据格式两部分[3]。
  wav文件的编码方式主要有PCM (PulseCode Modulation脉冲编码调制)和ADPCM (Adaptive Different ial Pulse Code Modulation自适应差分脉冲编码调制)两种。使用PCM脉冲编码调制的采样文件,其文件头为4字节,但有时wav文件头中会增加fact块,此时其文件头可达58字节。而ADPCM编码的采样文件,若其包含有fact块,则其文件头可达90字节。wav文件头记录的主要信息包括采样频率、采样精度和声道数。采样频率越高音质越接近原声,采样频率通常有11025hz、22050hz、44100hz、48000hz四种。采样精度数值越大分辨率越高。声道数包括单通道和双通道两种,前者只能让一个喇叭发音,后者则能让两个喇叭发音从而产生立体声效果。
  2利用.net的C#绘制声波波形
  Visual Studio 2005是微软推出的.Net开发平台。C#语言是随着.net架构一起设计出来的一种全新开发语言,特别适于用户界面设计。.Net C#语言在图形处理方面提供了GDI+技术,使用Graphics类封装诸多的图形绘制方法,能绘制直线、曲线、多边形、椭圆,甚至还能将文字作为图形输出[4],以便于产生特效,还提供了图像的翻转、扭曲以及像素操作等丰富功能,为图形图像编程提供全方位的支持,最大程度地减少了对底层API的直接调用,提高了编程效率。
  2.1读取WAV文件
  C#提供了一系列静态和非静态的文件操作类支持文件的创建、复制、删除和读写操作。为了实现文件的随机读取,.NET C#提供了FileStream文件流以记录文件的操作位置。利用静态类File的Open()等方法可以返回一个指向硬盘上特定文件的文件流实例。再利用文件流实例作为参数初始化一个流的读写器对象,由流的读写器最终实现对文件的读写操作,其操作可以指定每次读写若干字节,十分灵活方便。流的读写器又分为二进制读写器和文本读写器,前者空间利用率高,而后者所写的文件便于阅读,二者各有所长。该文采用后者。
  FileStream fs = File.Open("C:\\a.txt");
  StreamReader sr = new StreamReader(fs);
  char[] temp = new char[36];sr.Read(temp,0,36); //从文件中读36个字节到字符数组temp
  2.2生成Graphics对象
  C#的图形操作方法多封装于Graphics类中,使用这些方法必须先生成一个该类的实例。通常有三种方式得到一个实例。编程者应根据场合灵活地选择下述方式以达到功能和性能目标。
  1,用静态方法FromHwnd或者FromImage
  Bitmap Bm = new Bitmap("C:\\myPic.bmp”);
  Graphics g = Graphics.FromImage(Bm );
  2,某些控件的CreatGraphics方法
  Graphics g = pannel1.CreatGraphics();
  3,从绘图事件的参数e中获取
  Graphics g = e.Graphics;
  2.3 Graphics提供的线条绘制方法
  波形是一种不规则曲线,wav文件记录了波形上的各点数值,各点之间的横坐标间距由采样频率决定,各点的取值范围和精度由采样精度决定。波形绘制原理是用直线依次连接波形上相邻各个点。由于采样频率非常高,所以本来是由一些直线依次相连所构成的折线就在屏幕上形成了光滑细腻的曲线。Graphics类的DrawLine()方法绘制直线,该方法的一种重载形式需要三个参数:画笔,用以定义线条的颜色和样式;之后两个参数是起点和终点,其坐标是相对于相关绘图控件的位置,而非屏幕原点。
  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事件的参数。
  3运行的结果及遇到的问题
  利用.Net C#的图形功能和文件操作类,再根据wav文件的格式构造合适的数据结构,能很顺利的读取wav文件,并以图形化的方式显示其波形。图1显示的是某单通道16位wav文件中一段约9毫秒长度的声音波形。
  
  图1
  图形编程常遇到的问题是控件上所绘制的图形在程序的切换过程中被破坏或丢失。其原因在于应用程序的前后台切换将导致窗体的paint()方法被调用,该方法将重绘控件表面,这样,原先通过代码绘制在控件表面的图形就在重绘控件外观的过程中消失了。解决之道在于利用Bitmap对象充当一个内存缓冲区,以该对象为参数,用Graphics类的FromImage()方法得到一个Graphics实例。通过该实例绘制的图形就保存于内存缓冲区中。然后在窗体的paint()方法中通过控件的DrawImage()方法将缓冲区中的图形画在控件表面。这样不仅解决了图形丢失问题,还会有很好的性能表现。
  参考文献:
  [1]赵文博,张生,孙国强,等. WAV音频分句的算法设计[J].微计算机信,2011(27):204-205.
  [2]黄煜,陈克安,郑文.声样本质量及其在声品质评价中的应用[J].电声基础,2008(32): 40-43.
  [3]李敏.音频文件格式wave的转换[J].电脑知识与技术,2005(8):73-75.
  [4]郑宇军. C#面向对象程序设计教程[M].北京:人民邮电出版社,2009:316-319.

转载请注明来源。原文地址:http://www.xzbu.com/8/view-3530864.htm
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
利用PWM给单片机应用增加语音功能
什么是数字音频?
图像文件的格式及转换
电脑录音方法介绍
关于WAV与APE的比较
CoolEdit2.1专业录音机简明教程.录音后期处理方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服