数字麦克风音频处理的滤波器参数如何配置

相醉为友 · 8次点击 · 3天前

image.png

(上图是模拟麦克风配置的例程)

我的数字麦克风是使用I2S配合DMA获取数字麦克风得到的PCM数据。

首先,希望关于DECI、IIR滤波器系数的配置对数字麦克风是有效果的……(实际使用时确实有一定效果,但不知道如何配置)

image.png

其次,我需要确定DECI滤波器和IIR滤波器的作用阶段,是否如上面这份图片参考的一样作用于PCM数据前。具体的话,数字麦克风出来的PDM是先经过滤波器再进入DMA吗

audio_set_deci_filt

audio_set_iir_filt

然后,是参数的配置,但是我拿到的应用手册关于这个部分的介绍少之又少,不排除是手册太旧(手册如下图)
image.pngimage.png

目前我需要实现的是:

中心频率:1500Hz, 带宽:200-2700Hz

在尝试根据手册的简单介绍和类似滤波器配置的方法逆推了参数配置过程,并且使用MATLAB计算了可能的系数,最后的效果都不尽人意……

最后,我希望可以得到关于我们芯片的数字麦克风处理部分的建议和参考~谢谢!


下面附上我的参数配置和使用过程:

// I2S配置结构
const i2s_config_t i2s_cfg = {
    .sample_rate = AUDIO_SAMPLE_FREQ,   // 采样率(如16kHz)
    .sample_width = I2S_BITWIDTH_16BIT, // 采样位宽(16位)
    .ws_width = I2S_BITWIDTH_16BIT,     // 字选择信号宽度
    .workmode = I2S_WORKMODE_SLAVE,     // 从模式(接收外部时钟)
    .pcmmode = I2S_PCMMODE_MONO,        // 单声道模式
};


    // 数字麦克风配置
    // LOG_INF("DIG MIC");
    /// open dmic
    audio_dmic_config_t config;
    config.clk = AUDIO_DMIC_CLOCK_SEL_2M; // 2MHz时钟
    config.ctrl = AUDIO_DMIC_CLOCK_OUT;   // 输出时钟模式
    audio_dmic_open(&config);             // 开启数字麦克风

    audio_dmic_set_filt();                // 参考配置


void audio_dmic_set_filt(void)
{
    // 数字增益控制:
    // audio_set_adc_vol_ctrl(0x16801777);// 静音 0x16801777 播放 0x16801538
    audio_set_adc_vol_ctrl(0x01608674); // audio_set_adc_vol_ctrl(0x01646416);
    // 抽取滤波器设计:
    /****************************************************/
    /* HS6621 DECI滤波器配置(修正版) */
    /* 实际参数: */
    /*   麦克风时钟: 2MHz => 输出采样率:31.25kHz */
    /*   目标采样率: 16kHz, 降采样比: 2 */
    /* 设计日期: 29-Jun-2025 23:46:53 */
    /****************************************************/
    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_11, 30);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_12, 0xe7b7117f);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_13, 0x117f);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_21, 0xd59c5ea3);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_22, 0xcbe12186);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_23, 0x2186);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_31, 0xc56b6500);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_32, 0xf3d60cb5);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_33, 0x0cb5);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_41, 0xde5f5b59);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_42, 0xe567118f);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_43, 0x118f);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_51, 0xc1866709);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_52, 0x0b1e0cb5);
//    audio_set_deci_filt(AUDIO_ADC_DECI_FILT_53, 0x0cb5);

    // ----- 降采样比配置 -----似乎没有
    // *(volatile uint32_t *)(HS_AUDIO_BASE + 0x2204) = 1; // 降采样比=2
    // // 使能DECI滤波器
    // *(volatile uint32_t *)(HS_AUDIO_BASE + 0x2200) |= 0x01;
    // IIR带阻滤波器:
    //  audio_set_iir_filt(AUDIO_ADC_IIR_FILT_11, 20);   // 替换为实际系数11\21

    /* === IIR滤波器配置 === */
    /* === 1阶滤波器配置 (50Hz带阻) === */
    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_11, 20); // A2=0x7286, A1=0x0000
    // audio_set_iir_filt(AUDIO_ADC_IIR_FILT_12, 0x000076A4); // B1=0x0000, B0=0x76A4
    // audio_set_iir_filt(AUDIO_ADC_IIR_FILT_13, 0x000076C3); // B2=0x>>

    // 中心频率:1500Hz, 带宽:300-2700Hz
//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_21, 0x17B9A248); // A2=0x17B9, A1=0xA248
//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_22, 0xFB3E0260); // B1=0xFB3E, B0=0x0260
//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_23, 0x00000260); // B2=0x0260

//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_31, 0x48D69AAF); // A2=0x48D6, A1=0x9AAF
//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_32, 0x00058000); // B1=0x0005, B0=0x8000
//    audio_set_iir_filt(AUDIO_ADC_IIR_FILT_33, 0x8004);     // B2=0x8004

    // 可能需要的配置:
    // 从 iir 滤波器开始计算到输出稳定到可以采样的延迟
    // register_set(&HS_GPADC->FILTER_CTRL, MASK_1REG(GPADC_OUT_VAILD_CNT,     0xF));
    // IIR数字滤波器1~3阶计算周期:
    // register_set(&HS_GPADC->FILTER_CNT_PERIOD,  0xffffffff,  0x000F0F0F);
    // 采样率设置:
    // register_set(&HS_GPADC->FILTER_CTRL, MASK_1REG(GPADC_GP_CIC_OSR,     0xF));

    /* === 全局设置 === */
    /* 1. 增益设置 (参考值) */
    // register_set(&HS_GPADC->IIR_GAIN,  0xffffffff,  0x00008FA3);
    // /* 2. 使能滤波器 */
    // // 使能1-3阶滤波器: BIT16=0, BIT17=0, BIT18=0
    register_set(&HS_GPADC->FILTER_CTRL, MASK_1REG(BPADC_GP_IIR_3RD_BPS, 0));
    register_set(&HS_GPADC->FILTER_CTRL, MASK_1REG(GPADC_GP_IIR_2ND_BPS, 0));
    register_set(&HS_GPADC->FILTER_CTRL, MASK_1REG(GPADC_GP_IIR_1ST_BPS, 0));

    // 设置滤波器计算周期 (保持默认或根据需求调整)
    // *(volatile uint32_t *)(HS_AUDIO_BASE + 0x2244) = 0x000F0F0F; // 典型配置
}

感谢回复哦~

被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站