常见的一个错误音频混音算法
来源:互联网 发布:网络外部性 编辑:程序博客网 时间:2024/06/05 06:06
最近看到一个混音算法 算法是对16位的两路音频进行混音其效果和归一化混音算法相比并没有
归一化混音算法效果好,但是一直不明白为什么有这么多的文章在介绍混音算法时总会有此算法。
算法的出处也给出。
具体算法如下:
/** 平均值 */static void pcmAudioMix(short *mixPoint, short *originPoint, UInt32 bufferLength){ for (int j = 0; j < bufferLength ;j++) { short origin = *(originPoint + j); short mix = *(mixPoint + j); int value = (origin + mix); *(originPoint + j) = (short)(value/2); }}//#define INT16_MIN -32768//#define INT16_MAX 32767//此算法为最垃圾的算法 能不用就不要用 A*B直接引入噪声static void pcmAudioMix(SInt16 *bufferA, SInt16 *bufferB, UInt32 bufferLength){ SInt16 *outputBuffer = bufferB; for ( NSInteger i = 0; i < bufferLength; i++ ) { if ( bufferA[i] < 0 && bufferB[i] < 0 ) { // If both samples are negative, mixed signal must have an amplitude between // the lesser of A and B, and the minimum permissible negative amplitude outputBuffer[i] = (bufferA[i] + bufferB[i]) - ((bufferA[i] * bufferB[i])/INT16_MIN); } else if ( bufferA[i] > 0 && bufferB[i] > 0 ) { // If both samples are positive, mixed signal must have an amplitude between the greater of // A and B, and the maximum permissible positive amplitude outputBuffer[i] = (bufferA[i] + bufferB[i]) - ((bufferA[i] * bufferB[i])/INT16_MAX); } else { // If samples are on opposite sides of the 0-crossing, mixed signal should reflect // that samples cancel each other out somewhat outputBuffer[i] = bufferA[i] + bufferB[i]; } }}
查询资料后发现 已经有前辈对此算法提出了质疑。
http://www.cppblog.com/jinq0123/archive/2007/10/31/audiomixingstudy.html
其中的评论明确指明 A*B会直接引入噪音
算法并没有什么数学根据,而且从两路扩展到多路效果并不好。回贴的没有一个赞同这一算法的。
看来不能盲目照搬没有根据的算法。
对改算法进行实际测试发现 改算法确实比 相加求均值效果好,但是该算法的噪声问题确实很严重。
建议能不用此算法就不用此算法!建议还是老老实实用改进的归一化混音算法为秒。
后面文章介绍 改进型归一化音频算法
对此算法的参考链接
阅读全文
0 0
- 常见的一个错误音频混音算法
- 一个常见的错误..
- 一个常见的错误
- 音频混音算法
- 一个常见的Java错误
- 一个低级的常见错误
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音算法的实现
- 音频混音的算法实现
- 音频混音的算法实现
- 音频混音算法实现
- Hibernate的一个常见的错误
- swing初学者的常见的一个错误
- redis必杀高级:数据备份与恢复
- NYOJ 171 聪明的kk
- window7 x64 安装docker-toolbox
- Java技术常用设计模式(二)--- 代理模式
- hdu 2084 数塔 动态规划 简单
- 常见的一个错误音频混音算法
- IO模型
- 定位一组元素1
- 《Spring AOP学习总结之四—AOP实现读写分离》
- Qt定义了的进程错误代码
- docker 提示image operating system "linux" cannot be used on this platform
- C++笔记之regex-正则匹配
- vue生命周期
- React-classnames库