
用麦克风录制的PCM数据是16bit,48KHz,单声道,我想以16KHz的采样率获得PCM数据,然后通过降低采样率pcm 采样率转换 算法,实现48000HZ到16000HZ采样率的转换.

转换原理相对简单. 48000HZ降低到16000HZ,实际上是降低了三倍. 在同一时间单位间隔内,48000HZ采样3点pcm 采样率转换 算法,16000HZ采样1点. 要获取3个数据,必须根据这3个数据计算1个数据,该数据对应于16000HZ文件中的一个数据.



具体实现如下

#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数据格式
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-218421-1.html
我就想知道