您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 基于c语言的wav文件读写程序
《软件技术基础》2014实验报告_031220725_闫冬第1页共13页《计算机软件技术基础》课程设计报告班号:学号:姓名:Email:签名:南京航空航天大学2014年12月02日《软件技术基础》2014实验报告_031220725_闫冬第2页共13页目录综述……………….................................................………03实现wav文件的数据结构…………………............……04程序的具体实现………………….............................……05程序流程图……………….....................................………05软件测试…………………….........................................…06源程序清单………………….....................................……08《软件技术基础》2014实验报告_031220725_闫冬第3页共13页一、综述WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。WAV来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的WAV文件,即波形文件。该格式记录声音的波形,故只要采样率高、采样字节长、机器速度快,利用该格式记录的声音文件能够和原声基本一致,质量非常高,但这样做的代价就是文件太大。Wav文件结构由若干chunk(块)组成。每一个块由各自的辨识码和块大小信息为起始。以下是各个数据块以及辨识码的介绍。1、RIFFRIFF是英文ResourceInterchangeFileFormat的缩写,是wave文件所使用的标准格式,作为wav文件的开头,紧接其后的是描述文件总大小的四字节32位二进制数据。2、WAVE辨识码Wave作为wav文件的格式说明。3、fmtFmt块包含波形文件的大小、采样频率、采样位、声道数、编码格式等重要信息。描述了文件全部的基本参数。4、DataData块包以辨识码data开头,后接4字节数据表示数据块大小,存储了全部的波形采样数据。其中数据的排列与采样位数、声道数有密切关联。各个数据块的存储顺序和内容由下表详细给出:《软件技术基础》2014实验报告_031220725_闫冬第4页共13页需要注意的要点如下:1、对于超过8位(1byte)的数据,文件采取先存储低位,再存储高位的顺序。2、除却以上所介绍的数据块,许多wav文件还含有list、fact等存储其他信息的块作为补充。3、对于data块内数据,每个采样点的数据以采样位数可表示的最大值的一半作为振动的零点,下面以一个8位(最大值256)采样数据作为例子解释:对以下波形,各点的采样值如下4、若一个采样点数据超过8位,采样点大小依旧按照8的整数倍设置,且数据依照左对齐原则存储。5、对于2声道及其以上的文件,data数据按照每个采样点各个声道依次存储的方式记录数据。二、实现wav文件的数据结构为在计算机中创建、读取和便捷操作wav文件的数据,可以利用独立的数组分别存储wav文件的辨别码以及数据块内的各项内容。1、读取:根据wav文件内容的存储顺序和所占空间,依次读取指定的字节数并将信息存入相应的数组中。再将各个数组中的信息转换为便于识别和处理的数据存入相应变量中。2、创建(写入):先确定所需创建的文件的声道数、采样频率、位数、波形参数等信息,依据wav文件各个参数之间的关系计算得到文件的总大小、数据块大小以及data块内的一系列信息,将所得全部信息按照wav文件存储格式分别转换后存入各个信息所属的数组中,然后依次写入到被创建的文件里,得到所需波形文件。Data[i1]=256Data[i3]=0Data[i2]=128《软件技术基础》2014实验报告_031220725_闫冬第5页共13页三、wav文件操作程序的具体实现选用c语言完成程序编写。因为wav文件的数据按字节(8位)为单位排列存储,因此利用usignedchar型一维数组存储直接读取或即将写入的数据。考虑到许多参数占4字节,因此计算得到的参数值用unsignedint型变量存储。特别的,因为data数据的大小是无法预先决定的,因此在得到data块大小后再动态申请相应空间并将位置赋给地址变量*mp。各数组及变量如下ucharriff[4]={RIFF};ucharsize_total[4];ucharwave[4]={WAVE};ucharfmt[4]={fmt};ucharfmt_size[4];ucharfmt_pcm[2]={0x01,0x00};//pcm线性编码ucharfmt_way[2];//单双声道ucharfmt_samplehz[4];ucharfmt_bytepsec[4];ucharfmt_bytepsample[2];ucharfmt_bitpsample[2];ucharfmt_nouse[2];//系统预留两字,8位采样时预留uchardata[4]={data};uchardata_size[4];uchar*mp;//wav文件实际数据uintd_totalsize;//文件总大小uintd_fmtsize;//fmt块大小uintd_way;//声道数uintd_samplehz;//取样频率uintd_bytepsec;//数据流量(kb/s)uintd_bytepsample;//取样大小uintd_bitpsample;//取样位数uintd_datasize;//wav数据块大小四、程序流程图《软件技术基础》2014实验报告_031220725_闫冬第6页共13页五、软件测试1、功能1(读取文件)测试:启动软件,选择1功能。按提示输入文件名1115.wav,该文件是一个双通道门铃声音乐显示该文件信息《软件技术基础》2014实验报告_031220725_闫冬第7页共13页2、功能2(创建)测试选择功能2,输入文件时长、sin波形参数,5s1000hz最大音量50%显示文件信息,输入新文件名1.wav《软件技术基础》2014实验报告_031220725_闫冬第8页共13页用mediaplayer打开文件1.wav,听到声音,观察到正弦波形六、源程序清单#includestdio.h#includestdlib.h#includemath.h/*==============definition=======*/#defineucharunsignedchar#defineuintunsignedint#definemaxsize10240/*********************************//*=========全局变量==============*///wav文件数据分别存储进入不同数组ucharriff[4]={RIFF};ucharsize_total[4];ucharwave[4]={WAVE};ucharfmt[4]={fmt};ucharfmt_size[4];ucharfmt_pcm[2]={0x01,0x00};//pcm线性编码ucharfmt_way[2];//={0x01,0x00};or={0x02,0x00};单双声道ucharfmt_samplehz[4];ucharfmt_bytepsec[4];ucharfmt_bytepsample[2];ucharfmt_bitpsample[2];ucharfmt_nouse[2];//系统预留两字,8位采样时预留《软件技术基础》2014实验报告_031220725_闫冬第9页共13页uchardata[4]={data};uchardata_size[4];uchar*mp;//wav文件实际数据uintd_totalsize;//文件总大小uintd_fmtsize;//fmt块大小uintd_way;//声道数uintd_samplehz;//取样频率uintd_bytepsec;//数据流量(kb/s)uintd_bytepsample;//取样大小uintd_bitpsample;//取样位数uintd_datasize;//wav数据块大小//创建sin波形参数uintsin_t;uintsin_hz;uintsin_db;//其他全局变量ucharnamei[15];//导入文件名ucharnameo[15];//导出文件名FILE*fp;//读取用文件指针FILE*fq;//写入用文件指针/*************************************//*============数据转换子函数=============*/voiddata2array(uintx,uchara[],ucharn)//将实际数据转化为内存储存形式{uchari;for(i=0;in;i++){a[i]=x&0xff;x=x8;}}uintarray2data(uchara[],ucharn)//将数组内信息还原为实际数据{uchari;uintx=0;for(i=0;in;i++){x=x*256+a[n-1-i];}returnx;}/*============读取功能函数=============*/ucharreadfromfile(ucharnamein[])//读取文件说明部分内容{uintnn;printf(\nthetoolisreadingthefile%s\n,namei);if((fp=fopen(namein,rb))==0){printf(openerro\n);return0;}if(fread(riff,1,4,fp)==0)//读取riff{printf(readingerro\n);return0;}elseif(riff[0]!='r'&&riff[0]!='R'){printf(thefileisillegal!\n);return0;}if(fread(size_total,1,4,fp)==0)//读取总大小{printf(readingerro\n);return0;}if(fread(wave,1,4,fp)==0)//读取wave{printf(readingerro\n);return0;}elseif(wave[0]!='w'&&wave[0]!='W'){printf(thefileisillegal!\n);return0;}if(fread(fmt,1,4,fp)==0)//读取fmt{《软件技术基础》2014实验报告_031220725_闫冬第10页共13页printf(readingerro\n);return0;}if(fread(fmt_size,1,4,fp)==0)//读取wave{printf(readingerro\n);return0;}if(fread(fmt_pcm,1,2,fp)==0)//读取pcm{printf(readingerro\n);return0;}if(fread(fmt_way,1,2,fp)==0)//读取声道数{printf(readingerro\n);return0;}if(fread(fmt_samplehz,1,4,fp)==0)//读取采样频率{printf(readingerro\n);return0;}if(fread(fmt_bytepsec,1,4,fp)==0)//读取数据流量{printf(readingerro\n);return0;}if(fread(fmt_bytepsample,1,2,fp)==0)//读取采样大小{printf(readingerro\n);ret
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:基于c语言的wav文件读写程序
链接地址:https://www.777doc.com/doc-4854454 .html