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电路可以考虑加放大电路。