打印

发一个WAV转换为C代码的小工具。

[复制链接]
8456|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AV693|  楼主 | 2008-10-31 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前面好象有朋友发过,不过这个应该比较好一点。
但水平所限,内部没有低通滤波器。使用时最好用专用的软件做好音源。
希望大家能用单片机发出语音来。

相关链接:http://blog.21ic.com/UploadFiles/2008-10/312031491837.rar

相关帖子

沙发
linqing171| | 2008-11-1 11:41 | 只看该作者

好东西

我一直用winhex的 复制为c代码功能,然后到excel里面处理一下,生产c文件。

不过更关心压缩,能否先介绍一下?
代码有时间再看

使用特权

评论回复
板凳
machunshui| | 2008-11-1 12:27 | 只看该作者

好!

好!

正需要!

使用特权

评论回复
地板
hotyong| | 2008-11-1 14:31 | 只看该作者

压缩效果不怎么样呀

你压缩率很低的呀,

//$OldLength=6585$
//$NewLength=5156$
//数据生成时间:2008-11-1  14:19:49

//音频数据已进行压缩,压缩级别为:9

最大压缩时才少了这么一点呀,,,我自己写的用ADPCM压缩的这个文件可以压缩到1646,,比你这个文件小多了,,,我看你这有9级压缩,还以为比我自己写的强多了,,,想学习一下,,结果....


//== PCM/ADPCM 数据文件
//== 作者:黄茶勇 
//== 时间:2008.11.1  14:27 
//压缩比:8:2   压缩后数据大小: 1646

#define size_adpcm_dd  6585 //采样数据大小  时间长度:0.823125 s
#define valpred_adpcm_dd  0x93  //valpred初始值
flash unsigned char adpcm_dd[]={
.
.
.

使用特权

评论回复
5
AV693|  楼主 | 2008-11-1 14:42 | 只看该作者

还没研究ADPCM,不知道用单片机方便解码吗?

还没研究ADPCM,不知道用单片机方便解码吗?我这个是学习VC时顺便做来玩的





/*
这是一种自己设计的简单的有损压缩,原来的想法是在单片机中,能省一字节空间也是好的。

先把数据中所有的0xff数据换成00xfe,以空出0xff作为压缩的标志。0xff紧跟的一个数据是一个说明前面一个数据重复的次数(音频里有很多段里面的数据是连续相等的,当相等的数据连续大于3个时,这段数据就有了压缩的意义)。
于时,产生的结果是音频数组里除了0xff和0xff后面紧跟的一个字节数据不是PCM音频外,其它的都是PCM音频数据。
压缩级别0说明只有数值完全相同才进行压缩。压缩级别为1时,数据在相差±1时,也把它们看作是相等的大小的。
类似压缩级别2时,数据在相差±2时,在进行压缩时也认为是相等的。
但是,不论压缩级别是多少,解码程序是一样的。
*/
//压缩说明:
//例如一段数据原来是:0xf0,0xf0,0xf0,0xf0,0xf0,则压缩后的数据是:0xf0,0xff,0x03
//压缩后的意义是:0xf0代表压缩的数据,0xff代表压缩标志,0x03代表除了前面两个数据外,还有三个相同的0xf0应该在后面,只不过是压缩了罢。

//解码程序注释:


volatile uchar Sound_oldValue=0;          //保存上一次的数据
volatile uchar Sound_compressCount=0;          //解码计数
volatile uchar *Sound_codeIndex=SOUND_DATA;     //声音数据指针
void SoundDecode()
{

     if( Sound_codeIndex >= (SOUND_DATA + SOUND_LENGTH) )return;//如果到了未尾就退出
     if( *Sound_codeIndex == 0xff )//如果是压缩标志
     {
          Sound_codeIndex++;
          Sound_compressCount = *Sound_codeIndex;//在压缩标志0xff后的紧跟的数据,是说明还有与原来相同而重复的数据的个数。
          AD_VALUE = Sound_oldValue;          //发送保存的上一次的数据
          Sound_codeIndex++;
     }
     else
     {
          if( Sound_compressCount != 0 )//解码计数不为0,相同而重复的数据的个数没有发送完
          {
               Sound_compressCount--
               AD_VALUE = Sound_oldValue;//发送保存的上一次的数据
          }
          else
          {
               AD_VALUE = *Sound_codeIndex;//发送新数据
               Sound_oldValue=*Sound_codeIndex;//保存当前数据
               Sound_codeIndex++;
          }
     }
}

使用特权

评论回复
6
AV693|  楼主 | 2008-11-1 19:55 | 只看该作者

刚才看了,ADPCM的压缩率对于8位的WAV数据

刚才看了下,ADPCM的压缩率对于8位的WAV数据,压缩率是2:1(4比特ADPCM)。
ADPCM用于16位WAV数据压缩率是4:1(4比特ADPCM)。压缩率是固定的。
因此,对于8位采样率的WAV数据和16比特采样的WAV数据,压缩后,它们的大小却是一样的。
ADPCM音质较好。
ADPCM解码至少需要查两次表格,index表和step表。而且不能全部用8位整数变量,因为中间过程可能超过8位数的范围。

我从网上找了一个算法改了一下加入软件里,发现算法不能用(原来的是16比特的,我想改为8比特的ADPCM,因为8比特的ADPCM的附加的表格较小。
=====
我说的对吗?

使用特权

评论回复
7
machunshui| | 2008-11-1 20:37 | 只看该作者

好东西

好东西啊

使用特权

评论回复
8
创隆电子| | 2016-3-4 07:55 | 只看该作者
能不能给个详细使用例程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

68

帖子

0

粉丝