wav文件采样位数修改(C实现)

wav文件采样位数修改

本文是在前一篇文章的基础上,将已经完成的有关16位采样转化为8位采样的程序加入自己的毕设程序当中。在前一篇文章的基础上,接下来的工作就很简单了,首先在头文件中添加好需要加入的功能函数声明,再新建一个函数文件将函数定义写好就可以了。下面开始编程的代码实现:

程序实现

由于需要改变wav文件的采样位数,需要提前知道源wav文件的有关参数,故此先用以前写好的分析wav文件的程序提前得到源wav文件的参数如下:
在这里插入图片描述
从上图可以知道,采样位数是16位,采样位数变为8位以后,首先采样帧大小会变为1字节;然后比特率也会变为原来的一半,为44100bit/s;数据区大小也会变为原来的一半;最后ChunkSize也会变化,ChunkSize=数据区大小+36。故此新的wav文件创建后,写入的头文件需要修改上面的四个参数:采样位数,采样帧大小,比特率,数据区大小,ChunkSize。

问题解决

前一篇文章已经讲述过16位采样数据存入8位wav文件的过程,在此不再赘述。现在我想解决一下前一篇文章中留下的问题,即是每个除去高位得到的8位采样数据,有没有必要加128。

解决过程:
首先我尝试了加了128的程序,程序运行后成功,修改得到的wav文件可以听到与源文件相同的声音,写入8为wav文件的采样数据有几个样值:126,127,128,129。
不加128后,得到了非常大的噪音的wav输出文件。
由于定义时data_8和mdata_8分别是有符号和无符号的数据类型,我现在将其全部修改为无符号再测试。还是一样,测试中,我加入了一条输出语句,观察写入8位wav文件的采样数据有几个样值:0,1,254和255,差距很大。
于是在上面的基础上,我又加回128进行测试,输出wav文件声音正常,样值变化为和开始一样,但是为什么原来有些255的样值加了128反而变小了,那证明原来有些255的样值是负数???。
%d是有符号的十进制数据输出啊。
我将data_8和mdata_8改为了有符号的类型测试。不加128,样值多为-1,-2和0,得到的wav文件有很大噪音。加128后样值多为128,128,-127,-128,得到的wav文件声音正常。
再修改为初始的有符号和无符号的数据类型,样值与前没有变化,声音也没有变化。结论1:mdata_8有无符号型只是对输出的数据有没有正负号有影响,加不加都可以。
但是到底为什么要加128还是不清楚,不加的话,样值多为-1,-2,0,得到的声音噪音很大,加了128以后,0变成了-128???

结论2:暂时到此为止,加了128消除了很大噪音,暂时理解为一种降噪声的算法。

程序结果

下面给出最终转换好的,8位wav文件的参数:
在这里插入图片描述
关于8位转16位考虑:因为8位采样数据原本就没有16位采样数据多,不可能无中生有,所以不考虑。
PS:测试wav文件位16位单声道,双声道不能利用本程序。

代码:
百度云:https://pan.baidu.com/s/1eNu2hMkaJqViGJJ_SY3NBQ
提取码:241c

发布了19 篇原创文章 · 获赞 2 · 访问量 836

猜你喜欢

转载自blog.csdn.net/aa98865646/article/details/105013756