一、声道分离

#include <stdio.h>
#include <stdlib.h>

int pcm16_split(char* fileName)
{
	FILE* fp = fopen(fileName,"rb+");
	FILE* fp1 = fopen("outName1.pcm","wb+");
	FILE* fp2 = fopen("ouName2.pcm","wb+");
	//malloc = 4S是因为左声道和右声道的采样值是间隔存储的。每个采样值占用2Byte空间,一共4个字节。
	unsigned char* readBuf = malloc(4);
	//feof(p)用于判断文件指针p在其所指的文件中的位置,如果到文件末,函数返回1,否则返回0
	while (!feof(fp))
	{
		fread(readBuf,1,4,fp);
		//左声道
		fwrite(readBuf,1,4,fp1);
		//右声道
		fwrite(readBuf, 1, 4, fp2);
	}
	free(readBuf);
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	return 0;
}

int main()
{
	pcm16_split("shishi.raw");
	return 0;
}

这样就可以分出两个文件来
用Adobe Audition 可以查看
在这里插入图片描述带上耳机就可以感觉到不一样了。

二、对左边声道进行降半处理

#include <stdio.h>
#include <stdlib.h>

int pcm16_jiangban(char* fileName)
{
	FILE* fp = fopen(fileName,"rb+");
	FILE* fp1 = fopen("outName3.pcm","wb+");
	
	unsigned char* readBuf = malloc(4);

	//定义一个采集次数,每次采集4个字节,一直采集完
	int cnt = 0;

	while (!feof(fp))
	{
		short* readBuf1 = NULL;
		fread(readBuf,1,4,fp);
		readBuf1 = (short*)readBuf;
		*readBuf1 = *readBuf1 / 2;

		//左声道
		fwrite(readBuf,1,2,fp1);
		//右声道
		fwrite(readBuf+2, 1, 2, fp1);

		cnt++;
	}
	printf("readBuf cnt:%d\n", cnt);
	free(readBuf);
	fclose(fp);
	fclose(fp1);
	return 0;
}
int main()
{
	pcm16_jiangban("shishi.raw");
	return 0;
}

在这里插入图片描述可以看出左边声道的声波确实是低一点。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐