【C语言】PCM音频数据处理---降低采样率

用一麦克风录制的PCM数据,为16bit、48KHz、单声道,而我希望得到的是16KHz采样率的PCM数据,那就通过降低采样率的方法,去实现48000HZ到16000HZ采样率的转换。

转换原理比较简单,48000HZ降到16000HZ,实际上降了3倍,同一时间的单位区间内,48000HZ采样了3个点,16000HZ则采样了1个点,即从48000HZ的文件中每读取3个数据,就要根据这3个数据去推算得到1个数据,而这个数据对应的就是16000HZ文件中的一个数据。
【C语言】PCM音频数据处理---降低采样率_第1张图片
具体实现如下

C语言实现

#define OLD_FILE_PATH "file.pcm"
#define DOWN_FILE_PATH "downsample.pcm"

void pcm_downsample(void)
{
    short sRead = 0;
    short tempSum = 0;
    int size = 0;
    int flag = 0;

    FILE *fp = fopen(OLD_FILE_PATH, "rb+");
    FILE *fp_down = fopen(DOWN_FILE_PATH, "wb+");

    while(!feof(fp))
    {        
        size = fread(&sRead, 2, 1, fp); // 一次读两个字节,16bit
        if(size>0)
        {
            tempSum = tempSum + sRead; // 求和
            flag++;
            if(flag == 3)              // 如果取了三个点
            {
                flag = 0;
                tempSum = tempSum/3;   // 求平均值,你可以根据自己需要去修改,不一定要求平均值,可以直接取一个点
                fwrite(&tempSum, 2, 1, fp_down);    
                tempSum = 0;
            }
        }
    }

    fclose(fp);
    fclose(fp_down);
}

这里我将3个点转换成1个点的算法,是求取平均值的算法,你可以利用其他算法去转换也可以,如果想降低成其他采样率的,只要按照对应的比例去采样,即可。

参考资料

1.PCM数据格式

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