VAD监测(一)
麦克风的采样率是16000,代表一秒钟采集16000个数据点
我们每次拿1024个采样点作为一个buffer,buffer是一个b''类型,也就是字节类型。 这一个buffer的长度不一定是1024,取决于每个采样点的采样点的位深度,如果音频数据是 16 位(2 字节)的采样,那么 buffer
将包含 1024 个采样点,每个采样点占用 2 个字节,因此 buffer
的总长度将是 2048 字节,如果是双声道的话,那就要再翻上一杯。
一个采样点占用两个字节,那在计算机内存中是如何存储的呢?
一般使用大端方法或者小端方法进行存储。
两个字节的排列顺序取决于系统的字节顺序。在“大端(Big-Endian)”系统中,高位字节(更有意义的部分)存储在低地址处,而在“小端(Little-Endian)”系统中,高位字节存储在高地址处。例如,16位采样值0x1234在大端系统中存储为0x12 0x34,而在小端系统中存储为0x34 0x12。
举个例子,假设你有两个16位采样值,0x1234和0x5678。在小端系统中,它们可能在内存中这样排列(假设从地址0x00开始):
对于十六进制数0x1234:
- 高位字节(Most Significant Byte,MSB)是0x12。
- 低位字节(Least Significant Byte,LSB)是0x34。
地址 内容
0x00(低地址处) 0x34(低位字节)
0x01(高地址处) 0x12(高位字节)
0x02 0x78
0x03 0x56
高位字节比低位字节保留的信息更多,所以我们需要保留高位字节。
那就需要判断是用大端方法还是小端方案呢?如果是小端方案,那我们就保留高地址处的高位字节,也就是保留奇数下标。 如果是大端方案,我们需要保留低地址处的高位字节,那就保留偶数下标。
如何判断是用大端方法还是小端方案呢?
既然一个采样点占用两个字节,然后依次向后排列。 我们判断一下偶数下标的字节和奇数下标的字节那个分布的更均匀。
Counter之后发现奇数下标分布的比较离散,说明奇数下标是高位,那我们就保留奇数下标,同时说明这是大端方法存储。