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
数据排列方式:
左右声道每个样本点数据交错排列
代码:
功能:16位采样双声道的音频,将左声道的数据写入右声道
注:纯数据PCM文件不带44字节头文件
#include <iostream>
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;
}