PCM

PCM的原理和相关操作

Posted by kunnan on September 13, 2018

前言

声音是模拟的连续信号,而计算机只能离散的存储。为了使得计算机具备音频的能力,必须支持连续音频信号的离散化描述,而PCM具备这个能力。

PCM脉冲编码调制(Pulse Code Modulation)

脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值**离散的数字信号**后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。

总结起来就是三个步骤:

  • 1、抽样;
  • 2、量化;
  • 3、编码;

image

PCM基础概念

PCM衍生出来的常见概念

image

通俗点说,我们可以把声波看成是一条曲线,我们知道,曲线是由点组成的,采样率就是每秒长度(上图横轴)中点的个数。而采样精度就是动态范围(上图竖轴)中点的个数。这两个维度的定位越细,声音的真实还原度就越高,音质也就会更好,当然,音频文件也就会越大。

1、声道;

录制和播放时,音频信号的数量。

2、采样率;

每秒从连续信号中提取并组成离散信号的采样个数,单位是赫兹(Hz); 奈奎斯特采样定理:当采样频率大于声音最高频率的两倍,能完整的保留声音的信息。

  • 采样频率一般用44.1kHz,也可以是>8kHz,11.025kHz,48kHz,96kHz等。—-16KHz

3、采样深度;

  • 量化的二进制位数,常为16位;
    • 采样精度:指记录声音的动态范围,它以位(Bit)为单位,单个音频采样用得较多的是16位,当然也可以使用8位,24位,甚至32位

4、码率;

音频流每秒的大小,单位常用bps;

  • 一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的文件,码率为 44.1K×16×2 =1411.2 Kbps

  • PCM音频大小有这个计算公式:            
    数据量(字节/秒)= (采样频率(Hz)× 采样位数(bit)× 声道数)/ 8
    

一帧:是指持续采样时间,这个是很灵活的可以使用20ms,也可是200ms,一般来说时间越短延时就越少。 这样一帧的PCM数据大小就很容易计算出来:PCMBufferSize = 采样率*采样时间*采样位数/8*通道数 Bytes

PCM数据操作

1、PCM混合;

重采样,对位相加,溢出处理;

2、单声道变立体声;

增加声道,复制数据;

3、立体声变单声道;

减少声道,声道混合或只取其一;

4、音量调整和静音;

改变量化值,对数优化,清零静音;

5、播放速率调整;

快放:相邻位合并,缩减长度; 慢放:长度增加,量化值不变;

例子
  • PCM数据的操作,就是直接操作音频流数据,比如一个简单的音量变大操作:

    int16_t *curData = (int16_t *)ioData->mBuffers[0].mData;
        int size = ioData->mBuffers[0].mDataByteSize;
          
    //     音量操作
        for (int pos = 0; pos < size; pos += 2, ++curData) {
            int data = *curData;
      
            { // 音量调整
                data = data * 2;
                // 溢出
                if (data > 32767) {
                    data = 32767;
                }
                else if (data < -32768) {
                    data = -32768;
                }
            }
            *curData = data;
        }
      
    

Audio Unit 播放 PCM

AudioStreamBasicDescription

iOS的音频描述结构体,包括解析音频数据需要的各种参数

  • mSampleRate:采样率
  • mFormatID:编码格式
  • mFormatFlags:数据格式;(L/R,整形or浮点)
  • mBytesPerPacket:每个Packet的Bytes数
  • mFramesPerPacket:每个Packet的帧数
  • mBytesPerFrame:每帧的Byte数
  • mChannelsPerFrame:每帧的声道数
  • mBitsPerChannel:每个声道的采样深度
微信的语音参数格式
        voiceMsg.m_uiVoiceFormat = 4;// 编码格式
        //        _m_uiVoiceForwardFlag (unsigned int): 0// 数据格式

2.音频编码基本原理

数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。

(1) 音频信号的冗余信息

  • 冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。
    • 例如,人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。
    • 此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应,现分别介绍如下:
    • image

image

(2) 压缩编码方法:数字音频编码系统模型

  • 数字音频编码系统模型

  • image

See Also

/Users/devzkn/bin//knpost PCM PCM的原理和相关操作 -t Video
#原来""的参数,需要自己加上""

转载请注明: > PCM