NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

请教wav文件中16位PCM数据的编码方法?急!!

已解决!
转到解答

PCM编码的WAV文件中的PCM数据是如何计算得出的

 

用软件生成的一个PCM编码的WAV的声音波形文件.参数: 频率:1000Hz ;  幅值:1 ; 采样率: 8000  ;  采样位数:16  单通道

得到的WAV文件用"UltraEdit-32"读取出的数据如下(开头部分):

*******************************************

  5249 4646 307D 0000 5741 5645 666D 7420
  1000 0000 0100 0100 401F 0000 803E 0000
 0200 1000 6661 6374  0400 0000 0000 0000
 6461 7461 007D 0000
                                      0000 1264 C97C 8937
77C8 3783 EE9B 0000 0000 1264 C97C 8937
77C8 3783 EE9B 0000 0000 1264 C97C 8937
77C8 3783 EE9B 0000 0000 1264 C97C 8937
77C8 3783 EE9B 0000 0000 1264 C97C 8937
77C8 3783 EE9B 0000

*******************************************
说明:上面的数据中:第一部分为WAV的头,后面的为采集的数据.

WAV的头数据的各部分含义我已经弄清楚了,需要了解的请见: http://www.vihome.net/bbs/viewthread.php?tid=11147&extra=page%3D1

关键是后面的数据是如何编码的?

数据说明:一个周期是取8个点,从WAV文件对应读出的数据为:
0000 1264 C97C 8937 77C8 3783 EE9B 0000

说明两个字节对应一个点的数据(高低位互换后,如:1264(存储时的样子),实际数值为:6412(16进制),他们对应的10进制浮点数如下:
0  0.781831482452  0.9749279121932  0.4338837391869  -0.4338837390251  -0.9749279121533  -0.781831482564  -1.79586368671E-10

如: 0.781831482452(10进制浮点数)  对应: 6412(16进制数)
问:
    1  是如何编码实现上面的转换的?
    2  如何从16进制数得到对应的浮点数?(解码)
    3  如何从浮点数得到对应的16进制数?(编码)

*******************************************************

不成咋办?咋办不成!——通Tong
0 项奖励
1 条消息(共 8 条)
9,260 次查看
解答
接受人 通Tong(314269)
您好,可以用十六进制字符串转十进制字符串,然后再除以2的15次方,得到对应的浮点数。LabVIEW中波形文件由三部分组成t0,dt和Y。浮点数就是Y的值,dt根据您的采样率来换算。
2 条消息(共 8 条)
9,237 次查看

如何用十六进制字符串转十进制字符串?

 

然后再除以2的15次方,得到对应的浮点数

*******************************************************

不成咋办?咋办不成!——通Tong
0 项奖励
3 条消息(共 8 条)
9,198 次查看
在字符串选板上面有16进制字符串转数值的控件
4 条消息(共 8 条)
9,179 次查看

负数呢?

 

如: C877 (16进制)   =  -0.4338837390251 (10进制)

 

如何计算?

*******************************************************

不成咋办?咋办不成!——通Tong
0 项奖励
5 条消息(共 8 条)
9,159 次查看

如何判断一个16进制数是正,还是负?

 

 0000     6412                         7CC9                           3789                             C877                        8337                              9BEE                            0000

0            0.781831482452       0.9749279121932      0.4338837391869         -0.4338837390251  -0.9749279121533        -0.781831482564         -1.79586368671E-10

 

例如:C877= -0.4338837390251  ,如何计算?如何判断这是个负数?

*******************************************************

不成咋办?咋办不成!——通Tong
0 项奖励
6 条消息(共 8 条)
9,149 次查看

C877 (16进制)   =  -0.4338837390251 (10进制)

 

最高位即为符号位

 

C877 展开为二进制即为 1100 1000 0111 0111

按照补码的定义           其对应的原码为  1011 0111 1000 1001

 

后15位代表其大小   您换算一下  即得到其对应的幅值为上面的十进制数值。

7 条消息(共 8 条)
9,111 次查看

如何从浮点数得到对应的16进制数?(编码)

 

这个问题还是没有回答啊

0 项奖励
8 条消息(共 8 条)
4,960 次查看