PCM格式详解

PCM格式详解

简介:

PCM(Pulse Code Modulation),脉冲编码调制。人耳听到的是模拟信号,PCM是把声音从模拟信号转化为数字信号的技术。原理是用一个固定的频率对模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲(脉搏似的短暂起伏的电冲击),把这些脉冲的幅值按一定精度进行量化,这些量化后的数值被连续的输出、传输、处理或记录到存储介质中,所有这些组成了数字音频的产生过程(抽样、量化、编码三个过程)。

声音的三要素:

音调:音频的快慢
音量:振动的幅度
音色:谐波

量化:

采样大小:一个采样数据用多少bit存放,8bit、16bit
采样率:采样的频率8K、16k、32k、44.1k、48k
声道数:单声道、双声道、多声道

大小计算:

一秒数据大小(码率)=采样大小*采样率*声道数 (Kb/s)
假设采样率为8kHz、声道数、采样为16bit,时长为1s,则音频数据的大小为:
1 *8000 *16 *2 = 256000 bit / 8 = 32000 byte / 1024 = 31.25 KB

数据排列方式:

左右声道每个样本点数据交错排列
PCM格式详解_第1张图片

代码:

功能:16位采样双声道的音频,将左声道的数据写入右声道
注:纯数据PCM文件不带44字节头文件

#include 
int main()
{
    FILE* fp=fopen("src.pcm","rb");
    FILE* fpw=fopen("dst.pcm","wb");
    for(int i=0;i<11;i++)//读过44个字节的头信息
    {
           unsigned char* buffer=(unsigned char*)malloc(4*8);
           fread(buffer,4,1,fp);
           fwrite(buffer,4,1,fpw);
           free(buffer);
    }
    for(int i=0;i<600000;i++)//将左声道的数据写到右声道
    {
           unsigned char* buffer=(unsigned char*)malloc(4*8);
           fread(buffer,4,1,fp);
           buffer[0]=buffer[2];
           buffer[1]=buffer[3];
           fwrite(buffer,4,1,fpw);
           free(buffer);
    }
    fflush(fpw);
    fclose(fp);
    fclose(fpw);
    return 0;
}

你可能感兴趣的:(音频编码)