PCM混音算法 C++实现 (包括归一化加权算法,时间片切割算法,幅值简单叠加算法)

本文详细介绍了如何使用C++实现PCM混音算法,包括归一化加权、时间片切割和幅值简单叠加等方法。以5个2205点的wav文件混音为例,讨论了音频信号的正负极性,强调了在叠加过程中防止溢出的重要性,并提供了相关代码片段。
摘要由CSDN通过智能技术生成

概述

参考:
归一化、叠加+均值
相加相乘的混音算法

实现了PCM混音算法。以5个wav混音,其中每个wav长度均为2205个点,为例。
数据格式:以16位有符号数short存储wav音频文件。(#define AUDIO_DATA_TYPE short)

输入

allMixingSounds为5个vector,其中每个vector为2205个音频点。

输出

__pRawDataBuffer为1个vector,其中为2205个音频点。

混音算法

  1. 时间片切割:单点、分段
  2. 简单叠加
  3. 叠加+归一化

注意

音频信号有正负。
叠加时要用更长的数据长度来存储,防止溢出。(有符号数超过上限,如short的音频值超过32767或小于-32768)

代码

数据类型

#define AUDIO_DATA_TYPE short		// 为方便修改,在AudioDevice.h的顶部设定数据类型宏定义
									// DWORD(unsigned long)? long? short?
#define AUDIO_DATA_TYPE_MAX 32767	// 2^15(short)
#define AUDIO_DATA_TYPE_MIN -32768

#define WIDEN_TEMP_TYPE int			// 4字节有符号的中间变量,用于混音时防止溢出

头文件

class CAudioMix
	{
	public:
		// 切割时间片,单点混音
		void TimeSliceByPoint(	vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
								DWORD							RawDataCnt,
								vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// 切割时间片,分段混音
		void TimeSliceBySection(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
								DWORD							RawDataCnt,
								vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// CombinePointsToOneWay1
		void CombinePointsToOneWay1(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
			DWORD							RawDataCnt,
			vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// MixNewLC
		void CombinePointsToOneNewLC(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
			DWORD							RawDataCnt,
			vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// 直接简单地叠加
		void CAudioSource::CAudioMix::MixSoundsBySimplyAdd(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
			DWORD							RawDataCnt,
			vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// 叠加,然后取均值
		void CAudioSource::CAudioMix::MixSoundsByMean(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
			DWORD							RawDataCnt,
			vector<AUDIO_DATA_TYPE>*		__pRawDataBuffer);

		// 叠加,然后归一化
		void CAudioSource::CAudioMix::AddAndNormalization(vector<vector<AUDIO_DATA_TYPE>>	allMixingSounds,
			DWORD							RawDataCnt,
			vector<AUDIO_DATA_TYPE>*		__pRawDataBuff
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值