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

我用一麦克风录制的PCM数据是16bit,双声道的,用Audacity工具查看可知,右声道是没有声音的,左声道才有声音,如下图所示
【C语言】PCM音频数据处理---左右声道分离_第1张图片

所以为了节省存储空间,完全可以将左右声道分离出来,左右声道分离的方法很简单,只要知道PCM数据是如何存储的,就可以了,具体存储格式如下
【C语言】PCM音频数据处理---左右声道分离_第2张图片

根据上图可以得出,如果我们想要分离左右声道,只要将对应声道的数据保存起来即可,由于我录制的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)

你可能感兴趣的:(C语言)