java数字音频最强教程之立体声宽度算法(声场算法)

研究了好几年的音频算法,今天先公布一个用java怎么实现立体声宽度算法(声场算法)
width 是立体声宽度系数
width < 1: 宽度减小
width = 1: 宽度不变
width > 1: 宽度增加
width = 0: mono
取值基本范围0-2

立体声宽度计算是怎么实现计算的(通过变换矩阵获得)

话不多说,直接上算法

  1. 计算缩放比例系数
// scale coefficient
float coef_S = width * 0.5f;
  1. 然后根据每个样本再做计算
// 然后根据每个样本再做计算
float m = (left  + right) * 0.5f;
float s = (right - left ) * coef_S;
  1. 得到宽度变换后的值
//left
sam[0] = m - s;
//right
sam[1] = m + s;

全部代码如下

	public static float[] stereoWidthProcess(float left, float right) {
    
    
		float[] sam = new float[2];
		
		// 计算缩放比例系数
		float coef_S = width * 0.5f;

		// 然后根据每个样本再做计算
		float m = (left  + right) * 0.5f;
		float s = (right - left ) * coef_S;

		sam[0] = m - s;
		sam[1] = m + s;
		return sam;
	}

下面提供另一个不完美的算法

一开始我用下面这个,不补偿会有6分贝的提升,导致破音,干脆使用上面的算法

// calc coefs
tmp = 1/max(1 + width,2);
coef_M = 1 * tmp;
coef_S = width * tmp;

// then do this per sample
m = (in_left + in_right)*coef_M;
s = (in_right - in_left )*coef_S;

out_left = m - s;
out_right = m + s;

//做增益/失真补偿
out_left  /= 0.5 + coef_S;
out_right /= 0.5 + coef_S;

这就是立体声宽度实现,有问题可以咨询我

猜你喜欢

转载自blog.csdn.net/Janix520/article/details/124525043
今日推荐