【C语言】PCM音频数据处理---左右声道分离

来源:互联网 发布:网络机柜的流程 编辑:程序博客网 时间:2024/05/22 07:07

我用一麦克风录制的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)

0 0
原创粉丝点击