【杰理AC696X】MIC能量采集的三种方式

MIC能量采集的三种方式

测试SDK版本:《ac696n_soundbox_sdk_v1.5.0-20211217》



前言

此例应用于需要检测MIC输入信号的大小,并作出相应判断的场景。

例如:灯效随MIC拾音变化等


一、混响流程的MIC能量检测

MIC混响功能主要应用在K歌、喊话等场景,DAC会同时输出MIC的声音。
这个能量检测是检测给DAC数据的能量。


使能SDK中的混响功能:
在这里插入图片描述
把能量检测接口接入混响音频流接口(SDK做好了,配置一下即可):
在这里插入图片描述
上图配置了能量检测,在这里添加节点:
在这里插入图片描述
在这里插入图片描述
标准SDK的混响能量检测功能,只做了个自动MUTE的功能:
在这里插入图片描述
自动MUTE的参数配置(低于mute能量降低MIC数字音量,避免无声时,底噪大的问题):
在这里插入图片描述
搞清楚SDK中MIC混响的能量检测流程之后,我们自己获取下能量值就好:
在这里插入图片描述
程序运行,手动打开混响功能:
在这里插入图片描述
打印信息:
在这里插入图片描述
上图打印信息,绿框是有声音的,红框是无声的,可以看出明显变化。

二、MIC的ADC采集+数据能量检测

此方式是用SDK中的获取ADC采样的接口获取MIC的ADC采样数据,拿到MIC数据再传到能量检测接口拿到MIC能量值。


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

程序运行,手动打开AD采集:
在这里插入图片描述
打印信息:
在这里插入图片描述

三、MIC的ADC采集+频谱

此方式是用SDK中的获取ADC采样的接口获取MIC的ADC采样数据,拿到MIC数据做FFT获取频谱值。


在这里插入图片描述

#if MIC_SPECTRUM_FFT_EN

#include "spectrum/spectrum_fft.h"
#include "audio_splicing.h"
#define spectrum_fft_points_per_ch  (512)

spectrum_fft_hdl *fft_hdl = NULL;

/*----------------------------------------------------------------------------*/
/**@brief    audio_spectrum_fft_run 同步处理,每次run都会把输入buf消耗完,才会往下走
   @param    _hdl:句柄
   @param    data:输入数据
   @param    len:输入数据长度
   @return  len
   @note    频谱计算处理,只获取输入的数据,不改变输入的数据
*/
/*----------------------------------------------------------------------------*/
int audio_spectrum_fft_run(spectrum_fft_hdl *hdl, s16 *data, int len)
{
    if (!hdl) {
        return len;
    }
    if (!len) {
        return len;
    }

    if (!hdl->run_en) {
        hdl->offset = 0;
        return len;
    }

    u8 channel = (hdl->parm.channel & 0x3);
    s16 *indata_tmp = data;
    u32 in_remain = len;
    u32 tlen;
__here:
    indata_tmp = (s16 *)((int)data + (len - in_remain));
    if (hdl->offset < hdl->out_buf_size) {
        tlen = hdl->out_buf_size - hdl->offset;
        if (channel == 2 && (hdl->parm.channel & BIT(4))) {
            if (tlen > in_remain / 2) {
                tlen = in_remain / 2;
            }
            pcm_qual_to_dual((void *)((int)hdl->out_buf + hdl->offset), indata_tmp, tlen * 2);
            hdl->offset += tlen;
            in_remain -= tlen * 2;
        } else {
            if (tlen > in_remain) {
                tlen = in_remain;
            }
            memcpy((void *)((int)hdl->out_buf + hdl->offset), indata_tmp, tlen);
            hdl->offset += tlen;
            in_remain -= tlen;
        }
        if (in_remain && (hdl->offset != hdl->out_buf_size)) {
            goto __here;
        }
    }
    if (hdl->offset == hdl->out_buf_size) {
        hdl->offset = 0;
        SpectrumShowRun(hdl->work_buf, hdl->out_buf, spectrum_fft_points_per_ch);
        if (in_remain) {
            goto __here;
        }
    }
    return len;
}
#endif

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打印信息:
此图是在上述程序执行后,mic输入1KHz的音频后,频谱输出结果前后对比:
在这里插入图片描述
如下图,1KHz对应采样率为44100的频谱显示中心频率点第10点,此时在频谱输出图中对应的db[10]为最大值。简单来说:就是输入频率的声音越大,频谱对应的数据就越大。

备注:频率中心附件几个频点的数据也比较大,属于正常现象。

完整采样率对应频谱显示中心频率点如下图:
在这里插入图片描述

总结

方式二和三,可以通过宏 LADC_2_DAC_ENABLE 选择输出到DAC,如果不要输出,可以置0。
依据实际场景选择不同的获取方式,如果觉得数据变化不明显,MIC电路可以考虑加放大电路。

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值