我用一麦克风录制的PCM数据是16bit,双声道的,用Audacity工具查看可知,右声道是没有声音的,左声道才有声音,如下图所示
所以为了节省存储空间,完全可以将左右声道分离出来,左右声道分离的方法很简单,只要知道PCM数据是如何存储的,就可以了,具体存储格式如下
根据上图可以得出,如果我们想要分离左右声道,只要将对应声道的数据保存起来即可,由于我录制的PCM是裸数据,所以直接用文件读写操作去处理。具体实现如下
C语言实现
#define FALSE 0
#define TRUE 1
#define OLD_FILE_PATH "old.pcm"
#define LEFT_FILE_PATH "left.pcm"
#define RIGHT_FILE_PATH "right.pcm"
void pcm_lr_separate(void)
{
char buf[16] = {0};
static int leftFlag = FALSE;
int size = 0;
FILE *fp = fopen(OLD_FILE_PATH, "rb+");
FILE *fp_l = fopen(LEFT_FILE_PATH, "wb+");
FILE *fp_r = fopen(RIGHT_FILE_PATH, "wb+");
while(!feof(fp))
{
size = fread(buf, 1, 2, fp); // 此处是读取16bit(一个声道),一个字节8位,所以count为2
if( (size>0) && (leftFlag == FALSE) )
{
leftFlag = TRUE;
fwrite(buf, 1, size, fp_l);
}
else if( (size>0) && (leftFlag == TRUE) )
{
leftFlag = FALSE;
fwrite(buf, 1, size, fp_r);
}
}
fclose(fp);
fclose(fp_l);
fclose(fp_r);
}
经过处理后,提取左声道的PCM波形如下图所示
关于PCM数据格式的资料,可以参考下面的资料
参考资料
1.PCM数据格式
2.PCM数据格式
3.音频编解码·格式篇(1)Wave PCM audio format(WAV)