wave文件音频数据如何转换为浮点数输出?

黑泽明Coding 2008-04-14 02:27:41
16bit的wave文件音频数据,2声道的每个采样应该有4个字节,前两个字节是左声道,后两个字节是右声道,请问如何把这两个字节的数据转换为浮点数给声卡输出?
我曾经试用BitConverter.ToInt16(buffers, 0)/32768.0f;

BitConverter.ToInt16函数是把字节数组指定两个字节转换为有符号整数,这样转换声卡发出的声音不正确,请各路高手指教。
...全文
1181 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
viper1433 2008-04-24
  • 打赏
  • 举报
回复
输出声音不对是因为你的WAVEFORMAT不对,tag也没设对,其次是你的声卡是否支持那么高精度的输出, waveOut是底层函数!

转成浮点一般是限幅才会用到,要是看到浮点音质好的话就在解码的synth和dct时将运算用的数组(原来应该是short类型的)该成real,然后对应的步进值也要翻倍,这样解码完的数据就是浮点型的,输出时要用WAVEFORMATEX, 并且Tag要设成PCM_IEEE_FLOAT(貌似是这个),才可以输出!

我给你粘一下Int16ToFloat32的代码
int Int16ToFloat32(short int *InSample, float *OutSample, int InSmpCount)
{
short *in = InSample;
float *out = OutSample;
int X = InSmpCount;
//只写双声道的,单声道的就不写了
while(X--)
{
out[0]=0x43818000^in[0];
out[0]-=259.0f;
out[1]=0x43818000^in[1];
out[1]-=259.0f;
in+=2;
out+=2;
}
return InSmpCount;
}

rover___ 2008-04-19
  • 打赏
  • 举报
回复
PCM的WAV数据都是量化编码记录,只有整数意义,如果想还原出原始信号的波形,就需要搞清楚量化编码方式:比如A—LAW,U-LAW,13、15折线等。量化过程是有编码方式的。建议找本通信原理看看。WAV数据不是波形的浮点数据,仅仅是量化编码。记录的信息可以确定是量化电平的区间位置,一般可以取量化区间的中值作为信号的归一化电平数据(浮点数)。
yangsh3002 2008-04-18
  • 打赏
  • 举报
回复
声卡应该有两个声道输入,左右声道应该分开处理。
黑泽明Coding 2008-04-16
  • 打赏
  • 举报
回复
16bit是4个字节代表一个采样,包括左右声道的,直接转换一个字节是不行的,我这个浮点数是给ASIO驱动输出的
用waveout的话,直接输出字节就行,asio要转为浮点数,不知道怎么转
yangsh3002 2008-04-16
  • 打赏
  • 举报
回复
16位应该是short类型的,直接转成int就行,再转成float.(int)data[i];

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧