人们所熟知的图像方面的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代码示例的更多相关文章

  1. 音频增益响度分析 ReplayGain 附完整C代码示例【转】

    转自:http://www.cnblogs.com/cpuimage/p/8846951.html 人们所熟知的图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像 ...

  2. 音频压缩编码 opus 附完整C++代码示例

    绝大数人都知道mp3格式编码,以及aac,amr等压缩格式编码. 而在语音通信界有一个强悍的音频格式编码opus. 经过实测,压缩比最高可以达到1:10. 100KB 压缩后 10KB 虽然是有损压缩 ...

  3. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  4. 音频自动增益 与 静音检测 算法 附完整C代码【转】

    转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...

  5. 基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...

  6. 音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

  7. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  8. 经典傅里叶算法小集合 附完整c代码

    前面写过关于傅里叶算法的应用例子. <基于傅里叶变换的音频重采样算法 (附完整c代码)> 当然也就是举个例子,主要是学习傅里叶变换. 这个重采样思路还有点瑕疵, 稍微改一下,就可以支持多通 ...

  9. 自动曝光修复算法 附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...

随机推荐

  1. canvas---HTML5新特性

    画圆及填充文字<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  2. iOS移动端直连数据库

    一个可以直接连接服务器MySQL的工具包(极不安全,如非特殊需求,不推荐使用) 这种直接连接服务器数据的方式是极为不安全的,但因为我们这个项目特殊情况,只在局域网内使用, 且只有一个pad对一台设备进 ...

  3. Elasticsearch安装详解

    本文只介绍在windows上的安装和配置,其他安装和配置请参见官方文档 ES在windows上安装需下载zip安装包,解压后bin目录下有个 elasticsearch-service.bat 文件. ...

  4. beta冲刺 用户使用调查报告

    测评结果 一.使用体验 数据加载响应很快,页面切换丝滑流畅. UI有点偏暗,有些字被覆盖了. 页面布局过于居中,两侧空白范围较大. 总体功能完善. 二.登录.注册.忘记密码界面 管理员登录按钮太靠下, ...

  5. C语言——第四次作业

    题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...

  6. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

    (1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...

  7. 第八条:覆盖equals时请遵守通用约定

    ==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...

  8. mysql5.7在windows下面的主从复制配置

    目标:自动同步Master 服务器上面的Demo数据库到Slave 服务器的Demo数据库中. 对于一些操作系统比较强而使用频率又不高的东西,往往好久不去弄就忘记了,所以要经常记录起来,方便日后查阅. ...

  9. MobileNet_v2

    研究动机: 神经网络彻底改变了机器智能的许多领域,实现了超人的准确性.然而,提高准确性的驱动力往往需要付出代价:现代先进网络需要高度计算资源,超出许多移动和嵌入式应用的能力. 主要贡献: 发明了一个新 ...

  10. 18-TypeScript模板方法模式

    在有些情况下,一个功能在基础功能上是不会变的,算法的基本骨架也是确定的,但是在某些场景下算法的具体实现有些差异.应对这种问题,可以采用模板方法模式: abstract class Salary{ ab ...