(上图是模拟麦克风配置的例程) audio_set_deci_filt audio_set_iir_filt 然后,是参数的配置,但是我拿到的应用手册关于这个部分的介绍少之又少,不排除是手册太旧(手册如下图) 目前我需要实现的是: 中心频率: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; // 典型配置 } 感谢回复哦~ |