音频增益响度分析 ReplayGain 附完整C代码示例
人们所熟知的图像方面的3A算法有:
AF自动对焦(Automatic Focus)
自动对焦即调节摄像头焦距自动得到清晰的图像的过程
AE自动曝光(Automatic Exposure)
自动曝光的是为了使感光器件获得合适的曝光量
AW自动白平衡(Automatic White Balance)
白平衡的本质是使白色物体在任何光源下都显示白色
与之相对应的音频方面的3A算法是:
AGC自动增益补偿(Automatic Gain Control)
自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克风的距离改变时,声音有忽大忽小声的缺点。
ANS背景噪音抑制(Automatic Noise Suppression)
探测出背景固定频率的杂音并消除背景噪音。
AEC是回声消除器(Acoustic Echo Canceller)
对扬声器信号与由它产生的多路径回声的相关性为基础,建立远端信号的语音模型,利用它对回声进行估计,并不断地修改滤波器的系数,使得估计值更加逼近真实的回声。然后,将回声估计值从话筒的输入信号中减去,从而达到消除回声的目的,AEC还将话筒的输入与扬声器过去的值相比较,从而消除延长延迟的多次反射的声学回声。根椐存储器存放的过去的扬声器的输出值的多少,AEC可以消除各种延迟的回声。
图像方面的算法就不多说了,图像方面的3a算法,本人都实现了。
自动白平衡的主要思路,就是如何判断图像是否偏色,偏色后如何修复的问题。
常见的有直方图均衡,自动对比度,自动色阶等等。
自动曝光也是要做曝光评估,常见的有gama调节等等。
后续有时间,再陆续贴出相应的代码。
在这里,先卖个关子,占个坑。
而在音频算法方面,自动增益补偿的算法有点类似图像的自动曝光算法。
主要要考虑的是多长的音频,怎么分析当前音频的音量或者强度。
根据这个强度对整个音频做一个归一化拉伸,诸如此类。
图像与音频殊途同归。
而历史悠久的算法,莫过于,ReplayGain
ReplayGain是David Robinson在2001年发布的一项建议标准,用于衡量计算机音频格式 中音频的响度。
相关的维基资料:
https://en.wikipedia.org/wiki/ReplayGain
现在大多数的音频播放器都支持这个特性。
根据维基上的说明,现在大多数使用的开源实现是 MP3Gain
资料见:
http://wiki.hydrogenaud.io/index.php?title=Replaygain#Players_support
开源项目地址:
http://mp3gain.sourceforge.net/
项目是C代码,非常干净。
主要的算法实现文件见:gain_analysis.h 与 gain_analysis.c
算法是根据传入的音频数据,分析需要进行增益的分贝值。
不需要增益则为0,需要增益则为对应的浮点正数或负数。
当然,不能传入太少的音频样本,否则无法客观分析。
算法只需要传入音频的数据和指定需要分析的样本长度即可。
最终输出一个 推荐增益的分贝值。
根据这个分贝值进行换算,即可以对目标音频做一些特定的音频处理。
贴上完整的C代码:
#ifdef __cplusplus extern "C" { #endif #include <stdio.h> #include <stdlib.h> #include <stdint.h> //采用https://github.com/mackron/dr_libs/blob/master/dr_wav.h 解码 #define DR_WAV_IMPLEMENTATION #include "dr_wav.h" #include "gain_analysis.h" #ifndef min #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif //读取wav文件 int16_t *wavRead_int16(char *filename, uint32_t *sampleRate, uint64_t *totalSampleCount) { unsigned int channels; int16_t *buffer = drwav_open_and_read_file_s16(filename, &channels, sampleRate, totalSampleCount); if (buffer == NULL) { printf("读取wav文件失败."); } //仅仅处理单通道音频 ) { drwav_free(buffer); buffer = NULL; *sampleRate = ; *totalSampleCount = ; } return buffer; } float getGaindB(int16_t *buffer, size_t totalSampleCount, int sampleRate, size_t analyzeSamples) { float ret = -0.00000000001f; ) return ret; ) return ret; ; analyzeSamples = min(maxSamples, analyzeSamples); ret = 1.0f; ; Float_t inf_buffer[maxSamples]; size_t totalCount = totalSampleCount / analyzeSamples; if (InitGainAnalysis(sampleRate) == INIT_GAIN_ANALYSIS_OK) { int16_t *input = buffer; ; i < totalCount; i++) { ; n < analyzeSamples; n++) { inf_buffer[n] = input[n]; } if (AnalyzeSamples(inf_buffer, NULL, analyzeSamples, num_channels) != GAIN_ANALYSIS_OK) break; GetTitleGain(); // printf("Recommended dB change for analyzeSamples %d: %+6.2f dB\n", i, titleGain); input += analyzeSamples; } ret = GetAlbumGain(); } if ((int) ret == GAIN_NOT_ENOUGH_SAMPLES) { ret = -0.00000000001f; } return ret; } void analyze(char *in_file, int ref_ms) { uint32_t sampleRate = ; uint64_t totalSampleCount = ; int16_t *wavBuffer = wavRead_int16(in_file, &sampleRate, &totalSampleCount); if (wavBuffer != NULL) { size_t analyzeSamples = ref_ms * (sampleRate / ); float gain = getGaindB(wavBuffer, totalSampleCount, sampleRate, analyzeSamples); printf("recommended dB change: %f \n", gain); free(wavBuffer); } } int main(int argc, char *argv[]) { printf("Replay Gain Analysis\n"); printf("blog:http://tntmonks.cnblogs.com/\n"); printf("e-mail:gaozhihan@vip.qq.com\n"); ) ; ]; //指定分析长度1秒 ; analyze(in_file, ref_ms); getchar(); printf("press any key to exit. \n"); ; } #ifdef __cplusplus } #endif
我的习惯,尽量少些注释,代码尽量干净整洁。
所以大家直接看代码吧。
项目地址:https://github.com/cpuimage/ReplayGainAnalysis
示例具体流程为:
加载wav(拖放wav文件到可执行文件上)->输出结果->保存wav
得到对应的评估结果之后,接下来作何处理,就看各位看官的具体需求了。
若有其他相关问题或者需求也可以邮件联系俺探讨。
邮箱地址是:
gaozhihan@vip.qq.com
音频增益响度分析 ReplayGain 附完整C代码示例的更多相关文章
- 音频增益响度分析 ReplayGain 附完整C代码示例【转】
转自:http://www.cnblogs.com/cpuimage/p/8846951.html 人们所熟知的图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像 ...
- 音频压缩编码 opus 附完整C++代码示例
绝大数人都知道mp3格式编码,以及aac,amr等压缩格式编码. 而在语音通信界有一个强悍的音频格式编码opus. 经过实测,压缩比最高可以达到1:10. 100KB 压缩后 10KB 虽然是有损压缩 ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- 音频自动增益 与 静音检测 算法 附完整C代码【转】
转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...
- 基于RNN的音频降噪算法 (附完整C代码)
前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...
- 音频降噪算法 附完整C代码
降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...
- 基于傅里叶变换的音频重采样算法 (附完整c代码)
前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...
- 经典傅里叶算法小集合 附完整c代码
前面写过关于傅里叶算法的应用例子. <基于傅里叶变换的音频重采样算法 (附完整c代码)> 当然也就是举个例子,主要是学习傅里叶变换. 这个重采样思路还有点瑕疵, 稍微改一下,就可以支持多通 ...
- 自动曝光修复算法 附完整C代码
众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...
随机推荐
- Elasticsearch安装详解
本文只介绍在windows上的安装和配置,其他安装和配置请参见官方文档 ES在windows上安装需下载zip安装包,解压后bin目录下有个 elasticsearch-service.bat 文件. ...
- 『转载』从内存资源中加载C++程序集:CMemLoadDll
MemLoadDll.h #if !defined(Q_OS_LINUX) #pragma once typedef BOOL (__stdcall *ProcDllMain)(HINSTANCE, ...
- 第二周作业(pta存在的问题)
***第一题 错题截图 错因分析:中英文符号用混 改正截图: 思路分析:(1)由输入格式可知,该程序需要用到scanf函数 (2)构建框架 (3)根据要求打入代码 **第二题(正确) 代码截图: 思路 ...
- 福州大学软工1715|W班-启航
新的一学期即将开启,而在仅剩的几天的时间内,我将为接下来的软工实践助教事宜忙碌起来.要学习的东西很多,要关注的东西也很多. 虽然我现在还在茫然阶段,虽然我对<构建之法>还不太熟悉,但是,我 ...
- beta冲刺7-咸鱼
前言:最后一篇惹.明天就是正式交差了.有点慌-- 昨天的未完成: 用户试用+测评 输入部分的正则式判定 今天的工作: 登陆界面修改 我的社团显示效果优化 部分信息注册后锁定无法修改 其他部分功能优化 ...
- 201621123040《Java程序设计》第八周学习总结
1.本周学习总结 2.书面作业 2.1ArrayList代码分析 2.1.1解释ArrayList的contains源代码 ArrayList.contain()方法通过调用indexOf()来判断元 ...
- JAVA_SE基础——14.循环结构语句
建议有些基础的同学阅读,0基础可能会有些困难(最好看正文配合基础课本的例子) 所谓循环语句主要就是在满足条件的情况下反复执行某一个操作.Java提供了3种常用的循环语句,分别为for循环语句.whil ...
- clang++ 链接问题 和 VS Code
clang++ 链接问题 和 VS Code 如果你在windows上使用clang 并且同时安装有vs和mingw, clang链接是会自动使用msvs, 链接时会有LINK error LINK ...
- LeetCode题型分类及索引
目录 这是一个对LeetCode题目归类的索引,分类标准参考了July大神的<编程之法>以及LeetCode的tag项.分类可能还不太合理,逐步完善,请见谅~ 题主本人也在一点一点的刷题, ...
- DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)
要实现软件设计.软件开发在一个统一的思想.统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束. 虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍 ...