改进型归一化混音算法

linear PCM格式的音频混音

音频混音的原理:量化的语音信号的叠加等价于空气中声波的叠加。

反应到PCM音频数据上,也就是把同一个声道的数值进行简单的相加,但是这样同时会产生一个问题,那就是相加的结果可能会溢出,当然为了解决这个问题已经有很多方案了.

假设音频文件采样率、通道数、采样精度一样。

另外要注意的是,在源音频数据中是按照little-endian的顺序来排放的,PCM值为0表示没声音(振幅为0)。 源码如下:

bufferA 音频A的首地址

bufferB音频B的首地址

static void pcmAudioMix(SInt16 *bufferA, SInt16 *bufferB, UInt32 bufferLength){

char * sourseFile[2];

sourseFile[0] = (char *)bufferA;

sourseFile[1] = (char *)bufferB;

bufferLength *= 2;

Mix(sourseFile, 2, (char *)bufferB, bufferLength);

}

static void Mix(char ** sourseFile,int number,char *objectFile, UInt32 bufferLength){

//归一化混音

int const MAX = 32767;

int const MIN = -32768;

double f = 1;

int output;

for (int i = 0; i < bufferLength/2; i++)

{

int temp = 0;

for (int j = 0; j < number; j++)

{

char *point = sourseFile[j];

if (j == 0) {

int mixTemp = *(short *)(point + i*2);

temp += (int)(mixTemp);

}else{

temp += *(short *)(point + i*2);

}

}

output = (int)(temp * f);

if (output > MAX)

{

f = (double)MAX / (double)(output);

output = MAX;

}

if (output < MIN)

{

f = (double)MIN / (double)(output);

output = MIN;

}

if (f < 1)

{

//此处取SETPSIZE 为 32

f += ((double)1 - f) / (double)32;

}

*(short *)(objectFile + i*2) = (short)output;

}

}

算法如下所述:

1. f 初始化为1.

2.对于一帧中的样本按顺序处理:

(a) output[i] = mixing[i] × f.

(b) 如果output[i] > MAX,求得最大的 f0满足 output[i] × f0< MAX,然后 f = f0, output[i] = MAX.

(c) 如果output[i] < MIN,求得最大的 f0满足 output[i]×f0> MIN,然后 f = f0, output[i] = MIN.

3. 如果f < 1, 则f = f + STEPSIZE. 继续处理下一帧, 转2.

其中f为衰减因子,f0为新的衰减因子;mixing[]为所有音频流的某一帧线性叠加值,实际实现的时候如式(4)所示;output[]为归一化以后的输出帧. MAX为正的最大值;MIN 为负的最大值. STEPSIZE为f变化的步长,通常取为(1 − f)/16或者(1 − f)/32.

SETPSIZE为f的变化步长,通常的取值为(1-f)/VALUE其中(1-f)为固定值只是后面的VALUE值可以取8,16,32,64,128. SETPSIZE取值较大时,运算复杂度低,但语言平滑度不够细腻,STEPSIZE取值较小时,运算复杂度高,但语言平滑度比较细腻。

特别的,就是在衰减以后的值溢出的情况下,求新的衰减因子f0的方法不同,新的f0需要满足output[i]× f0< MAX或者output[i]× f0> MIN,而不是直接使用mixing[i].也就是说,使用衰减以后的值output[i]来计算f0,而不是原始值mixing[i],这样将使得衰减因子的变化更为平滑.

用数学来表达,S为溢出的一个样本值,在S × f仍然溢出的情况下,可以比较一下计算出来的新衰减因子的大小:假设是上溢,forig是原始算法计算出的新的衰减因子,则f`orig(S × f),所以(MAX/S)

参考文章:

java归一化混音_改进型归一化混音算法相关推荐

  1. 归一化mysql函数_数据归一化和两种常用的归一化方法

    数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...

  2. java 地理围栏实现_使用Path2D和凸包算法实现地理围栏服务

    前言 地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界.在物流配送行业应用比较广,划分每个配送网点或者商家配送的范围,提高配送员的配送效率和服务的范围. ...

  3. java动态分区分配_操作系统动态分区分配算法课程设计java版解析.doc

    湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班级.学号 13101 18 同组者姓名 实验日期 ...

  4. java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf

    操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...

  5. java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析

    常用的时间复杂度 常数阶\(O(1)\) 说明: 只要代码中没有复杂的循环条件,无论代码的函数是多少,一律为常数阶\(O(1)\) int i=1; int j=3; int m=0; m=i+j; ...

  6. java 产生p10证书_【国密SM2算法】JAVA创建pkcs10格式的csr证书请求文件

    代码: public static void main(String[] args) throws Exception { Security.addProvider(new org.bouncycas ...

  7. JavaWeb-SpringBoot(抖音)_二、服务器间通讯

    JavaWeb-SpringBoot(抖音)_一.抖音项目制作 传送门 JavaWeb-SpringBoot(抖音)_二.服务器间通讯 传送门 JavaWeb-SpringBoot(抖音)_三.抖音项 ...

  8. 数据归一化处理方法_数据预处理:归一化和标准化

    1. 概述 数据的归一化和标准化是特征缩放(feature scaling)的方法,是数据预处理的关键步骤.不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间 ...

  9. 抖音seo源码混剪工具@小程序开发自主挂载

    原创文章禁止任何人抄袭,或者复用一经发现立即举报 抖音seo源码技术搭建,抖音 抖音seo源码搭建,抖音seo源码,抖音seo源码搭建的基础底层框架语言是后台语言PHP:python来编程开发的,抖音 ...

最新文章

  1. icmp的回送和回送响应消息_领导送我1盒茶叶,我悟出了3点道理,可能还有一群人不明白...
  2. 结合webpack配置_前端 Webpack 工程化的最佳实践
  3. nssl1519-背包签到题【数论】
  4. 【计算机就业-后端开发工程师】校招想去互联网公司担任后端开发工程师该怎么准备
  5. 一加7喜迎全局DC调光:长时间看屏不再“辣眼”
  6. 看我如何发现开源 WAF引擎ModSecurity 中的DoS 漏洞
  7. P. Hamilton / Quantitative Investigation of QRS Detection Rules Using the MIT/BIH Arrhythmia Databa
  8. android手机内存单位 吉字节,Android的尺寸单位
  9. 计算机无法写入U盘,电脑无法拷贝U盘文件怎么办|解除U盘写保护设置的方法
  10. Win7任务管理器进程一直在跳动选中不了的处理方法
  11. hibernate hbb.xml 映射关系
  12. 基于PG与PostGIS搭建实时矢量瓦片服务
  13. ARC 128D - Neq Neq(dp+组合数学+思维)
  14. PowerPoint2003常用快捷键
  15. 壁纸网站研究:强大到没朋友的壁纸网站整理(动漫/二次元/宅男/风景/真人)
  16. java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总
  17. 南卡和漫步者蓝牙耳机哪个好?高性价比蓝牙耳机深度对比
  18. 【计算机视觉】opencv姿态解算4 视觉导航 单目特征检测与实时位姿
  19. Google奥运会logo
  20. 亚盛医药全球总部、研发中心正式启用;强生医疗中国“智造”爱惜康新一代抗菌薇乔可吸收缝线上市 | 医药健闻...

热门文章

  1. 什么是数字体验平台(DXP)?
  2. typescript学习笔记1 —— 接口(interface)
  3. 计算机课对小学生的作用,信息技术在小学教学中的重要性
  4. 【Android Gradle 插件】Android 依赖管理 ④ ( 常用依赖配置分析 | implementation 依赖作用 | api 依赖作用 | compileOnly 依赖作用 )
  5. java printwriter乱码_PrintWriter输出中文乱码分析与解决方案
  6. Python廖雪峰实战web开发(Day10(上)-用户注册)
  7. 阿里云IoT Studio遇到“数据格式验证出错”怎么解决?
  8. GML与KML的区别
  9. IPv4和IPv6的数据报结构头部详解
  10. DZ先生国标资源整合之国标精选——一书在手