java归一化混音_改进型归一化混音算法
改进型归一化混音算法
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归一化混音_改进型归一化混音算法相关推荐
- 归一化mysql函数_数据归一化和两种常用的归一化方法
数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...
- java 地理围栏实现_使用Path2D和凸包算法实现地理围栏服务
前言 地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界.在物流配送行业应用比较广,划分每个配送网点或者商家配送的范围,提高配送员的配送效率和服务的范围. ...
- java动态分区分配_操作系统动态分区分配算法课程设计java版解析.doc
湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班级.学号 13101 18 同组者姓名 实验日期 ...
- java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf
操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...
- java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析
常用的时间复杂度 常数阶\(O(1)\) 说明: 只要代码中没有复杂的循环条件,无论代码的函数是多少,一律为常数阶\(O(1)\) int i=1; int j=3; int m=0; m=i+j; ...
- java 产生p10证书_【国密SM2算法】JAVA创建pkcs10格式的csr证书请求文件
代码: public static void main(String[] args) throws Exception { Security.addProvider(new org.bouncycas ...
- JavaWeb-SpringBoot(抖音)_二、服务器间通讯
JavaWeb-SpringBoot(抖音)_一.抖音项目制作 传送门 JavaWeb-SpringBoot(抖音)_二.服务器间通讯 传送门 JavaWeb-SpringBoot(抖音)_三.抖音项 ...
- 数据归一化处理方法_数据预处理:归一化和标准化
1. 概述 数据的归一化和标准化是特征缩放(feature scaling)的方法,是数据预处理的关键步骤.不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间 ...
- 抖音seo源码混剪工具@小程序开发自主挂载
原创文章禁止任何人抄袭,或者复用一经发现立即举报 抖音seo源码技术搭建,抖音 抖音seo源码搭建,抖音seo源码,抖音seo源码搭建的基础底层框架语言是后台语言PHP:python来编程开发的,抖音 ...
最新文章
- icmp的回送和回送响应消息_领导送我1盒茶叶,我悟出了3点道理,可能还有一群人不明白...
- 结合webpack配置_前端 Webpack 工程化的最佳实践
- nssl1519-背包签到题【数论】
- 【计算机就业-后端开发工程师】校招想去互联网公司担任后端开发工程师该怎么准备
- 一加7喜迎全局DC调光:长时间看屏不再“辣眼”
- 看我如何发现开源 WAF引擎ModSecurity 中的DoS 漏洞
- P. Hamilton / Quantitative Investigation of QRS Detection Rules Using the MIT/BIH Arrhythmia Databa
- android手机内存单位 吉字节,Android的尺寸单位
- 计算机无法写入U盘,电脑无法拷贝U盘文件怎么办|解除U盘写保护设置的方法
- Win7任务管理器进程一直在跳动选中不了的处理方法
- hibernate hbb.xml 映射关系
- 基于PG与PostGIS搭建实时矢量瓦片服务
- ARC 128D - Neq Neq(dp+组合数学+思维)
- PowerPoint2003常用快捷键
- 壁纸网站研究:强大到没朋友的壁纸网站整理(动漫/二次元/宅男/风景/真人)
- java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总
- 南卡和漫步者蓝牙耳机哪个好?高性价比蓝牙耳机深度对比
- 【计算机视觉】opencv姿态解算4 视觉导航 单目特征检测与实时位姿
- Google奥运会logo
- 亚盛医药全球总部、研发中心正式启用;强生医疗中国“智造”爱惜康新一代抗菌薇乔可吸收缝线上市 | 医药健闻...
热门文章
- 什么是数字体验平台(DXP)?
- typescript学习笔记1 —— 接口(interface)
- 计算机课对小学生的作用,信息技术在小学教学中的重要性
- 【Android Gradle 插件】Android 依赖管理 ④ ( 常用依赖配置分析 | implementation 依赖作用 | api 依赖作用 | compileOnly 依赖作用 )
- java printwriter乱码_PrintWriter输出中文乱码分析与解决方案
- Python廖雪峰实战web开发(Day10(上)-用户注册)
- 阿里云IoT Studio遇到“数据格式验证出错”怎么解决?
- GML与KML的区别
- IPv4和IPv6的数据报结构头部详解
- DZ先生国标资源整合之国标精选——一书在手