现有16位,8k Hz, 单声道wav文件,想转成8位存储格式(线性就可以),其它参数不变。
我的方法是去掉16位中的低字节位,但是得到的输出噪音非常大,不能辨清原有声音。
请问该如何做才能实现我想要的结果?先谢谢各位啦!
6 个解决方案
#1
这种问题找已经成熟的算法,
想研究就多试难吧,,最近邻插值,双线性插值等等。还有滤波,降噪算法。找个专业的地方看。
想研究就多试难吧,,最近邻插值,双线性插值等等。还有滤波,降噪算法。找个专业的地方看。
#2
尝试一下如下:
int sample = 0;
// read 2 bytes (= 16 bits) from the 16 bit file into sample:
fread (&sample, 2, 1, wav_file_16bit);
sample /= 256; // (做归一化处理)
// write 1 byte (= 8 bits) to the 8 bit file:
fwrite (&sample, 1, 1, wav_file_8bit);
int sample = 0;
// read 2 bytes (= 16 bits) from the 16 bit file into sample:
fread (&sample, 2, 1, wav_file_16bit);
sample /= 256; // (做归一化处理)
// write 1 byte (= 8 bits) to the 8 bit file:
fwrite (&sample, 1, 1, wav_file_8bit);
#3
谢谢楼上二位。
swq1982,
其实你的方法与我的相同,有很大噪音。
fdl19881 & 其他朋友们
请问哪里是比较专业论坛呢?谢谢!
swq1982,
其实你的方法与我的相同,有很大噪音。
fdl19881 & 其他朋友们
请问哪里是比较专业论坛呢?谢谢!
#4
不知道你要转换的目的是什么? 学习,还是项目开发的一部分,或者是只是为了转换成8位的wav文件?
学习的话,还是使用matlab方便,学习下时域,频域,傅立叶变换,滤波等等,这些我也忘的差不多了.
项目开发的一部分,因为这个要求高,不懂的情况下自己写出来的估计也没法用. 那就找个懂这个的人来做,或者看看有没有开源的音频处理软件.然后提取出来.
只是为了得到转换后的8位音频文件的话,,就用现成的音频处理软件处理下就得到8位的wav文件就行了.
这找了个matlab的简单16->8位的文章http://www.cnblogs.com/sleepy/archive/2011/09/29/2195984.html
语音处理属于专业问题,不是简单的计算机/软件知识问题了.
不同目的使用不同方法解决方法
学习的话,还是使用matlab方便,学习下时域,频域,傅立叶变换,滤波等等,这些我也忘的差不多了.
项目开发的一部分,因为这个要求高,不懂的情况下自己写出来的估计也没法用. 那就找个懂这个的人来做,或者看看有没有开源的音频处理软件.然后提取出来.
只是为了得到转换后的8位音频文件的话,,就用现成的音频处理软件处理下就得到8位的wav文件就行了.
这找了个matlab的简单16->8位的文章http://www.cnblogs.com/sleepy/archive/2011/09/29/2195984.html
语音处理属于专业问题,不是简单的计算机/软件知识问题了.
不同目的使用不同方法解决方法
#5
http://blog.csdn.net/mahushen/article/details/8213165
8位数据是 无符号的整型数,如果不加处理绘制出来的图形是以0x80为中心上下波动的波形
16位、24位和32位数据都是 有符号的整形数,这样的数据绘制的图形是以0值为中心上下波动的波形
所以直接除以是不行了.你将每个值变为 x/256 + 0x80 看看吧..注意自己的目的.更好的效果涉及到更专业的知识了.所以请结合自己的目的寻找最好的解决方法.
8位数据是 无符号的整型数,如果不加处理绘制出来的图形是以0x80为中心上下波动的波形
16位、24位和32位数据都是 有符号的整形数,这样的数据绘制的图形是以0值为中心上下波动的波形
所以直接除以是不行了.你将每个值变为 x/256 + 0x80 看看吧..注意自己的目的.更好的效果涉及到更专业的知识了.所以请结合自己的目的寻找最好的解决方法.
#6
用matlab进行A律压缩,再做量化,直接去掉低位对小信号影响太大
你可以百度A律压缩,简单的说就是小信号更精细,大信号粗糙一点
你可以百度A律压缩,简单的说就是小信号更精细,大信号粗糙一点
#1
这种问题找已经成熟的算法,
想研究就多试难吧,,最近邻插值,双线性插值等等。还有滤波,降噪算法。找个专业的地方看。
想研究就多试难吧,,最近邻插值,双线性插值等等。还有滤波,降噪算法。找个专业的地方看。
#2
尝试一下如下:
int sample = 0;
// read 2 bytes (= 16 bits) from the 16 bit file into sample:
fread (&sample, 2, 1, wav_file_16bit);
sample /= 256; // (做归一化处理)
// write 1 byte (= 8 bits) to the 8 bit file:
fwrite (&sample, 1, 1, wav_file_8bit);
int sample = 0;
// read 2 bytes (= 16 bits) from the 16 bit file into sample:
fread (&sample, 2, 1, wav_file_16bit);
sample /= 256; // (做归一化处理)
// write 1 byte (= 8 bits) to the 8 bit file:
fwrite (&sample, 1, 1, wav_file_8bit);
#3
谢谢楼上二位。
swq1982,
其实你的方法与我的相同,有很大噪音。
fdl19881 & 其他朋友们
请问哪里是比较专业论坛呢?谢谢!
swq1982,
其实你的方法与我的相同,有很大噪音。
fdl19881 & 其他朋友们
请问哪里是比较专业论坛呢?谢谢!
#4
不知道你要转换的目的是什么? 学习,还是项目开发的一部分,或者是只是为了转换成8位的wav文件?
学习的话,还是使用matlab方便,学习下时域,频域,傅立叶变换,滤波等等,这些我也忘的差不多了.
项目开发的一部分,因为这个要求高,不懂的情况下自己写出来的估计也没法用. 那就找个懂这个的人来做,或者看看有没有开源的音频处理软件.然后提取出来.
只是为了得到转换后的8位音频文件的话,,就用现成的音频处理软件处理下就得到8位的wav文件就行了.
这找了个matlab的简单16->8位的文章http://www.cnblogs.com/sleepy/archive/2011/09/29/2195984.html
语音处理属于专业问题,不是简单的计算机/软件知识问题了.
不同目的使用不同方法解决方法
学习的话,还是使用matlab方便,学习下时域,频域,傅立叶变换,滤波等等,这些我也忘的差不多了.
项目开发的一部分,因为这个要求高,不懂的情况下自己写出来的估计也没法用. 那就找个懂这个的人来做,或者看看有没有开源的音频处理软件.然后提取出来.
只是为了得到转换后的8位音频文件的话,,就用现成的音频处理软件处理下就得到8位的wav文件就行了.
这找了个matlab的简单16->8位的文章http://www.cnblogs.com/sleepy/archive/2011/09/29/2195984.html
语音处理属于专业问题,不是简单的计算机/软件知识问题了.
不同目的使用不同方法解决方法
#5
http://blog.csdn.net/mahushen/article/details/8213165
8位数据是 无符号的整型数,如果不加处理绘制出来的图形是以0x80为中心上下波动的波形
16位、24位和32位数据都是 有符号的整形数,这样的数据绘制的图形是以0值为中心上下波动的波形
所以直接除以是不行了.你将每个值变为 x/256 + 0x80 看看吧..注意自己的目的.更好的效果涉及到更专业的知识了.所以请结合自己的目的寻找最好的解决方法.
8位数据是 无符号的整型数,如果不加处理绘制出来的图形是以0x80为中心上下波动的波形
16位、24位和32位数据都是 有符号的整形数,这样的数据绘制的图形是以0值为中心上下波动的波形
所以直接除以是不行了.你将每个值变为 x/256 + 0x80 看看吧..注意自己的目的.更好的效果涉及到更专业的知识了.所以请结合自己的目的寻找最好的解决方法.
#6
用matlab进行A律压缩,再做量化,直接去掉低位对小信号影响太大
你可以百度A律压缩,简单的说就是小信号更精细,大信号粗糙一点
你可以百度A律压缩,简单的说就是小信号更精细,大信号粗糙一点