数字音频规范与程序设计:基于visual,c,,开发
篇一:基于Visual C下的声音文件操作
基于Visual C++6.0工具下的声音文件操作
声音是人类传递信息的重要途径,如果应用程序中包含声
音信息,就可以大大增强它的亲合力;另外在科研开发过程中,声音信号的处理也是一个很重要的科学研究领域。Visual C++作为一个强大的开发工具,当然是声音处理的首选工具,但是在当前Visual C++相关的编程资料中,无论是大部头的
参考书,还是一些计算机杂志,对声音文件的处理都是泛泛
的涉及一下,许多编程爱好者都感到对该部分的内容了解不
是很透彻,笔者结合自己的学习和开发过程中积累的一些经验,在本实例中来和广大编程爱好者们探讨一下声音文件的
处理,当然本实例也不可能包括声音处理内容的方方面面,只是希望它能够对刚刚涉及到声音处理领域的朋友们起到
一个引路的作用,帮助他们尽快进入声音处理的更深奥空间。
当前计算机系统处理声音文件有两种办法:一是使用现
成的软件,如微软的录音机、SoundForge、CoolEdit等软件可以实现对声音信号进行录音、编辑、播放的处理,但它们的功能是有限的,为了更灵活,更大限度地处理声音数据,就不得不使用另外一种方法,既利用微软提供的多媒体服务,在Windows环境下自己编写程序来进行声音处理来实现一些特定的功能。下面就开始介绍声音文件的格式和在Windows环境下使用Visual C++开发工具进行声音文件编程处理的方法。
一、实现方法
1、RIFF文件结构和W A VE文件格式
Windows支持两种RIFF(Resource Interchange File Format,资源交互文件格式)格式的音频文件:MIDI的RMID 文件和波形音频文件格式W A VE文件,其中在计算机领域最常用的数字化声音文件格式是后者,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为*.wav,因而该类文件也被称为W A VE文件。为了突出重点,有的放矢,本文涉及到的声音文件所指的就是W AVE文件。常见的W A VE语音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采
样值)。这里的采样率是指声音信号在进行模→数转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声
音模拟信号的积分值。对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。W A VE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。在进行声音编程处理以前,首先让我们来了解一下RIFF文件和W A VE文件格式。
RIFF文件结构可以看作是树状结构,其基本构成是称为块(Chunk)的单元,每个块有标志符、数据大小及数据所组成,块的结构如图1所示:
图二、RIFF/LIST块结构
WA VE文件是非常简单的一种RIFF文件,它的格式类型为W A VE。RIFF块包含两个子块,这两个子块的ID分别是fmt和data,其中fmt子块由结构PCMWAVEFORMAT 所组成,其子块的大小就是sizeofof(PCMWA VEFORMAT),数据组成就是PCMW AVEFORMAT结构中的数据。W A VE 文件的结构如下图三所
示:
操作声音文件,也就是将W A VE文件打开,获取其中的声音数据,根据所需要的声音数据处理算法,进行相应的数学运算,然后将结果重新存储与W A VE格式的文件中去。可以使用CFILE类来实现读取操作,也可以使用另外一种方法,拿就是使用Windows提供的多媒体处理函数(这些
函数都以mmino打头)。这里就介绍如何使用这些相关的函数来获取声音文件的数据,至于如何进行处理,那要根据你的目的来选择不同的算法了。W A VE文件的操作流程如下:1)调用mminoOpen函数来打开W A VE文件,获取HMMIO 类型的文件句柄;2)根据W A VE文件的结构,调用mmioRead、mmioWrite和mmioSeek函数实现文件的读、写和定位操作;3)调用mmioClose函数来关闭W A VE文件。
下面的函数代码就是根据W A VE文件的格式,实现了读取双声道立体声数据,但是在使用下面的代码过程中,注意需要在程序中链接Winmm.lib库,并且包含头文件Mmsystem.h。
篇二:C C++程序设计课后答案
第一章
一、选择题
1.C/C++规定,在一个源程序中,main()函数的位置()。C
A.必须在最开始
B.必须在最后
C.可以任意
D.必须在系统调用的库函数的后面
2.以下()是C/C++合法的标识符。A
A.char2 **********.7Bw
3.下面的程序,对于输入:2 9 15,输出的结果是()。B #includeiostream.h
void main()
{int a;
float b;
cout<<input a,b:<<endl;
cinab;
cout<<a+b=<<a+b<<endl;
}
A.2
B.11
C. 26
D.24
4. 在Visual C++中,打开一个项目只需要打开对应的项目工作区文件即可,项目工作区文件的扩展名为()。C
A.obj
B.dsp
C.dsw
D.cpp
5.下面关于C语言与C++关系的说法中,()是正确的。D
wa字符串是什么A.C语言是C++的子集
B.C++对C语言进行了改进
C.C++和C语言都是面向对象的
D.C++继承了C语言的众多优点
6.设置一个断点的方法是将光标移到需要设置断点的行上,然后按()键。A
A.F9
B.F10
C.F11
D.F12
7.下面关于编译预处理命令的说法中,正确的是()。C
A.一条文件包含命令能包含多个文件
B.文件包含命令不可以嵌套使用
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论