注:本文为原创,转载请注明出处。来自CSDN,作者:Midfar Sun

最近研究了如何在iOS上绘制wav波形图。查了很多资料,都没能找到一个很完整的介绍,我这里总结一下一些经验。

首先需要了解wav的这3个重要指标:采样率、采样位数、声道数。下面以16KHz, 16Bit, 单声道为例来说明。

采样率:(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,单位用赫兹(Hz)来表示。采样频率的倒数是采样周期(也称为采样时间),它表示采样之间的时间间隔。采样率为16KHz,表明每秒钟采样有16K次,即0.001秒内采集16个值。

采样位数:即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。声卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。16Bit表示用计算机的16位(即2字节)来标示一个值。

声道数:是指支持能不同发声的音响的个数。常见的有单声道和双声道。

比特率:每秒传送的比特(bit)数,等于采样率*采样位数,单位为bps(Bit Per Second)。示例音频的比特率为256kbps。

C语言没有提供专门的wav音频文件处理框架,因此,我们只能通过读取文件的2进制值来分析wav音频的波形。这里就需要对wav音频的格式有一定的了解。

wav音频分为文件头和数据块两大部分。

表1 WAV文件的文件头

偏移地址

字节数

类型

内容

00H~03H

4

字符

资源交换文件标志(RIFF)注意字符大小写!

04H~07H

4

长整数

从下个地址开始到文件尾的总字节数

08H~0BH

4

字符

WAV文件标志(WAVE)注意字符大小写!

0CH~0FH

4

字符

波形格式标志(fmt)注意字符大小写!

10H~13H

4

整数

过滤字节(一般为00000010H)

14H~15H

2

整数

格式种类(值为1时,表示数据为线性PCM编码)

16H~17H

2

整数

通道数,单声道为1,双声音为2

18H~1BH

4

长整数

采样频率

1CH~1FH

4

长整数

波形数据传输速率(每秒平均字节数)

20H~21H

2

整数

数据的调整数(按字节计算)

22H~23H

2

整数

样本数据位数

表2 WAV声音文件的数据块

偏移地址

字节数

类型

内容

24H~27H

4

字符

数据标志符(data)注意字符大小写!

28H~2BH

4

长整型

采样数据总数

2CH...

...

...

采样数据

WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:

RIFF WAVE Chunk,位置00H~0BH。

Format Chunk,以'fmt'作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的附加信息。位置0CH ~23H。

Fact Chunk,可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。

Data Chunk,是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。从24H开始。

其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大

小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。

在了解了wav文件的结构后,我们就可以轻松的取出wav的相应信息了。接下来就是绘制曲线,我们使用Quartz来绘图。苹果官方提供了一套例子,参考

http://developer.apple.com/library/ios/#samplecode/QuartzDemo/Introduction/Intro.html

其中关键是QuartzView和QuartzLines这两个文件。在QuartzLines.m文件中可以找到我们想要的绘制曲线方法,可以作为参考。

接下来的事情就很简单了,我们只需要从2CH的位置开始,每2个字节(与采样位数有关)的取数据,然后画到屏幕中。因此,音频数据点的个数为:采样数据总数/2。如果需要将图像绘制到界面上,x坐标范围10~310,y坐标范围200~400,只需要将这些点做个映射就行了。

附件:在我的资源下载

参考示例QuartzLines.m(为了达到更好的显示效果,对y进行了放大处理)

http://download.csdn.net/detail/midfar/4040612

注意:

源码中只考虑了没有Fact Chunk的情况。实际上在读取data的时候应该加上判断

if(strcmp(id, "data")!=0){//not eq data

//TODO 读取Fact Chunk

//结构是4字节的Fact Chunk数据长度+Fact Chunk数据

}

c语言编程绘制动态波形,绘制wav波形图相关推荐

  1. C语言编程输入动态数组,C语言完美实现动态数组代码分享

    我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量. 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. 请实现一个简单的动态数组,能够随时改变大小, ...

  2. c++与fortran混合语言编程中动态链接库的调用,[转载]C++与Fortran混合语言编程中动态连接库的调用...

    摘 要:介绍了C++和Fortran 90混合语言编程中,在C++中调用Fortran动态连接库(DLL,Dynamic Link Library)的方法以及参量传递.函数调用等的方法. 关键词:混合 ...

  3. 用C语言画出动态的图片,Qt通过图片组绘制动态图片

    本文实例为大家分享了Qt通过图片组绘制动态图片的具体代码,供大家参考,具体内容如下 任务实现: 通过定时器的使用来依次调用资源文件中的静态图片文件,从而达到是图片中内容动起来的效果: 效果实现: 实现 ...

  4. 共阳极数码管动态扫描c语言,《C语言编程实训》实训指导书三

    1 C 语言编程实训语言编程实训 实训指导书三实训指导书三 适应专业 应用电子技术适应专业 应用电子技术 广州康大职业技术学院自动化系广州康大职业技术学院自动化系 二二 0 一一 0 年十一月年十一月 ...

  5. 如何用 R 绘制动态统计图?

    如果一幅图胜过千言万语,那么一幅会动的图呢? 需求 绘制统计图形,是为了给谁看? 显然不是给电脑看. 因为它看不懂,也没必要看.给它数据就好了.它理解起来,更准确. 绘制统计图形,是给人看的. 可以给 ...

  6. MATLAB绘制主函数动态图,matlab绘制动态图

    mathematica绘制动态图,"绘图之王"争霸赛--Excel才是绘图王道,matlab绘制动态图,动态三维图绘制 matlab动态图画法_数学_自然科学_专业资料.Matla ...

  7. 超详细的Python matplotlib 绘制动态图

    复习回顾 在matplotlib模块中我们前面学习绘制如折线.柱状.散点.直方图等静态图形.我们都知道在matplotlib模块主要有三层脚本层为用户提供快捷的绘制图形方法,美工层接收到脚本层的命令后 ...

  8. C# 在PDF中绘制动态图章

    我们知道,动态图章,因图章中的时间.日期可以动态的生成,因而具有较强的时效性.在本篇文章中将介绍通过C#编程在PDF中绘制动态图章的方法,该方法可自动获取当前系统登录用户名.日期及时间信息并生成图章. ...

  9. python绘制动态图-Python利用Echarts绘制动态交互图:快速入门

    我们都知道,Echarts是百度开源的超强大的数据可视化工具.Python中经典的matplotlib.seaborn等库相比,它最大的优点是所绘制的图形为动态图,这意味着我们可以和图形之间进行动态的 ...

最新文章

  1. leetcode算法题--学生分数的最小差值
  2. 经典日剧、电影、动漫
  3. 如何检出SVN老版本代码
  4. 中欧光伏“双反”案:何以平地起波澜?
  5. [云炬创业学笔记]第一章创业是什么测试13
  6. React是什么及特点
  7. C++ 高级数据类型(五)—— 数据结构
  8. mySQL教程 第7章 存储过程和函数
  9. 通过建站学运维1901-08任务
  10. 印象笔记添加txt附件
  11. Python中去除字符串中空格的方法
  12. 本地Git仓库关联多个远程仓库的两种方法
  13. java new string编码_Java String 类型编码转换
  14. 各类文件的文件头标志
  15. 凯利公式计算器安卓_华为MatePad Pro 5G评测:一屏双任务打破安卓平板生态限制...
  16. 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发...
  17. vus3+Ts Apache ECharts 的使用(可视化图表库)
  18. Layui使用中遇到的问题
  19. vue2理论学习(全套教程,包含vuex、路由等)
  20. PKUSC2018游记

热门文章

  1. 用接口实现计算每个立方体的体积并输出结果的程序(接口及多态性及匿名方法的结合使用)
  2. JSP九大内置对象及基本使用
  3. KEIL 输出.BIN文件
  4. 卷积神经网络表情识别,神经网络表情识别
  5. 汇川中型PLC与威纶通触摸屏标签通讯
  6. 人工智能、人脸识别、AR试妆、AR换发型、无人零售、RFID智能货架,2018屈臣氏HWB“未来店铺”用了一大波黑科技
  7. 俯仰 (pitch) - 偏摆 (yaw) - 翻滚 (roll)
  8. 正则匹配过滤空格字符串
  9. js高级jQuery框架easyUI框架
  10. 《机器学习算法》SVM进行多分类及代码实现