PCM编码 —— 相关数据大小计算

参考:https://blog.csdn.net/weixin_45312249/article/details/120507391

首先介绍几个概念,:PCM编码、采样率、采样位宽

我觉得通信背景的同学,一提到PCM编码,脑海里都能跳出来一个数值64k。
一、64KB还是64Kb?
64Kb! (是以bit位为单位,而不是以byte字节为单位)

二、哪里来的64Kb?
CCITT规定抽样率为每秒8000KHz,每抽样值编8位码,所以每秒共采集64Kbit数据。
(这里的采样率就是8K,采样位宽为8)

三、PCMA和PCMU
就是对采集到的64Kbit按照不同的对数压缩特征(A率和μ率)进行编码。
编码后的数据大小仍然是64Kbit(所谓的无损编码?)。

四、160字节是怎么来的?
经常听过“每包数据长度是160字节”,哪里来的?
上面已经知道,使用PCM编码,每秒产生64000bit数据。(8000 * 8=64000bit)
转化成字节,就是64000bit/(8bit/字节)=8000字节。
好了,下面需要考虑怎么把这8000字节数据发送出去了。

五、这每秒产生的8000字节数据你打算怎么处理?
你可以选择先什么都不做,等一秒结束,编码出所有的数据,然后把这一个包全部发出去,那这一个包就是8000字节。

你也可以选择,每等待100ms,编码一次数据,然后把这一个包发送出去,那这一个包就是8000字节/(1000ms/100ms)=800字节。
你也可以选择,每等待10ms,编码一次数据,然后把这一个包发送出去,那这一个包就是8000字节/(1000ms/10ms)=80字节。
你的等待时间就是打包周期,把一个周期的数据放到一个数据包里就叫打包。
等等,说了半天还是没出现160字节

六、160字节找出来了!
当打包周期是20ms的时候,一个包就是8000/(1000ms/20ms)=160字节。
这么巧,20ms也是PCMA最常用的打包周期,G.729也是。

七、如何封装这一包160字节?

封装在哪种消息协议发送出去呢?
RTP(消息头格式定长12*8=96bit)

RTP承载在什么传输协议?
UDP(消息头格式定长8*8=64bit)

通过何种IP网络传输?
IPv4(消息头格式定长20*8=160bit)//也可以是IPv6

承载在什么物理网络上?
Ethernet II(消息头格式定长14*8=112bit)

八、封装后一个包有多长?
以太网头 + IP头 + UDP头 + RTP头 + 语音数据 = 数据总长
1
112bit + 160bit + 64bit + 96bit + 160*8bit = 1712bit
九、封装后的1712bit的数据包一秒要发多少个?
打包周期是20ms,一秒要发1000ms/20ms=50个。

十、带宽出来了!
1712 bit/个 * 50 个/秒 = 85600 bit/秒 = 85.6 Kb/秒

附录、G.729的带宽呢?

这个编码算法厉害了,每秒只产生8000bit语音数据。
通常的打包周期也是20ms,每个包的语音数据是8000bit/(1000ms/20ms)=160bit。
一个包长
以太网头 + IP头 + UDP头 + RTP头 + 语音数据 = 数据总长
1
112bit + 160bit + 64bit + 96bit + 160bit = 592bit
所需带宽
592bit/个 * 50 个/秒 = 29600 bit/秒 = 29.6 Kb/秒

 

posted @ 2022-09-06 15:17  小周学jishu  阅读(1101)  评论(0编辑  收藏  举报