完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
音频信号发生器输出的AES音频信号,通过CS8416转换为i2s音频信号,BCK、WS、SDATAT三路信号分别接ESP-WROOM-32开发板32、25、33引脚。
信号源产生的音频信号为采样率48KHz、24bit量化精度、双声道。 通过CS8416转换输出,输出格式选择为i2s,BCK设置为64fs(3.072M),因为i2s数据为MSB格式,因此可以兼容32、24、20、16四种采样精度。 通过以下代码获取ESP32 i2s接口采集的数据最大幅度: #include //I2S音频数据采样率48K #define I2S_SAMPLE_RATE (48000) //音频数据缓冲区大小 #define I2S_BUF_SIZE (1024) //ESP32 i2s信号输入引脚GPIO编号 #define I2S_PIN_BCK (32) #define I2S_PIN_WS (25) #define I2S_PIN_SDATA (33) //I2S数据读取缓冲区(左右声道) int32_t i2s_buffer[I2S_BUF_SIZE * 2]; //左声道和右声道最大振幅 int16_t max_left_amplitude = INT16_MIN; int16_t max_right_amplitude = INT16_MIN; void setup() { Serial.begin(9600); //配置I2S接口 i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_SLAVE | I2S_MODE_RX), //设置为I2S从设备模式,接收数据 .sample_rate = I2S_SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), .intr_alloc_flags = 0, .dma_buf_count = 8, .dma_buf_len = I2S_BUF_SIZE, .use_apll = false }; //安装I2S驱动 i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); //配置I2S pins i2s_pin_config_t pin_config = { .bck_io_num = I2S_PIN_BCK, //BCK引脚 .ws_io_num = I2S_PIN_WS, //WS引脚 .data_out_num = I2S_PIN_NO_CHANGE, //SDATA输出引脚 .data_in_num = I2S_PIN_SDATA //SDATA输入引脚 }; i2s_set_pin(I2S_NUM_0, &pin_config); //启动I2S接口 i2s_zero_dma_buffer(I2S_NUM_0); i2s_start(I2S_NUM_0); } void loop() { size_t bytes_read = 0; i2s_read(I2S_NUM_0, i2s_buffer, I2S_BUF_SIZE * 2 * sizeof(int32_t), &bytes_read, portMAX_DELAY); //左声道和右声道最大振幅复位 max_left_amplitude = INT16_MIN; max_right_amplitude = INT16_MIN; for (size_t i = 0; i < bytes_read / sizeof(int32_t); i += 2) { //左右声道数据取高16位 int16_t left_sample = (i2s_buffer[i] >> 16) & 0xFFFF; int16_t right_sample = (i2s_buffer[i + 1] >> 16) & 0xFFFF; //获取音频幅度最大振幅 if (max_left_amplitude < abs(left_sample)) { max_left_amplitude = abs(left_sample); } if (max_right_amplitude < abs(right_sample)) { max_right_amplitude = abs(right_sample); } } //振幅数值转换为分贝值 //以0dBFS为参考电平 //16位量化,最大幅度为2^15-1 float max_left_db = 20 * log10(max_left_amplitude / 32767.0); float max_right_db = 20 * log10(max_right_amplitude / 32767.0); //输出左右声道的最大振幅 Serial.printf("L=%4.0fdB R=%4.0fdBrn", max_left_db, max_right_db); delay(20); } 运行上述代码,信号发生器产生幅度为-20dB的音频信号,打印输出的信号最高幅度与信号频率如下: 1KHz -20dB 2KHz -21dB 3KHz -22dB 4KHz -24dB 5KHz -25dB 6KHz -26dB 8KHz -27dB 10KHz -28dB 12-20KHz -29dB 也即是:随着频率的升高,读取到的音频数据最高幅度在降低。 信号发生器输出的信号同时送其它测试仪器,没有这种情况存在。 在设置1KHz-12KHz任意一种频率,然后保持频率不变,以1dB为单位更改信号幅度,打印输出的信号幅度同样以1dB进行变化。 前级音频信号幅度的变化,只会导致音频数据产生变化,但音频数据通过泰克等测试仪测试,以及其它音频监测设备测试,不存在频率升高导致幅度降低的情况。 i2s数据输入ESP32,即使舍弃低位,也只是在精度上有所变化,不会对音量幅度产生大的影响。 程序对32位数据全部处理,得到的结果也是一样。 对于目前这种结果,不清楚是什么原因导致,是否ESP32内部对输入的i2s音频数据重新进行了处理? 期待技术帮助,谢谢! |
|
相关推荐
2个回答
|
|
与CS8416 02寄存器EMPH_CNTL去加重设置相关,改成000或100问题解决。
|
|
|
|
针对您的问题,这里有几个可能的解决方案来解决ESP-WROOM-32 I2S音频信号幅度读取异常的问题:
1. **检查硬件连接**:确保CS8416到ESP-WROOM-32的连接正确无误,包括BCK、WS、SDATA的引脚连接。检查是否有接触不良或焊接问题。 2. **检查I2S配置**:确保ESP32的I2S配置与CS8416的输出格式匹配。这包括采样率、位宽、通道数等。 3. **调整I2S驱动配置**:在ESP32的I2S驱动代码中,确保采样率、位宽、通道数等参数与音频信号源的设置一致。例如,如果音频信号是24位量化精度,确保I2S驱动也配置为24位。 4. **检查信号幅度**:使用示波器或逻辑分析仪检查CS8416输出的I2S信号幅度是否正常。如果幅度异常,可能需要调整CS8416的配置或检查其供电情况。 5. **软件滤波**:如果硬件连接和配置都正确,但读取的信号幅度仍然异常,可以尝试在软件中实现滤波算法,以减少噪声或异常值的影响。 6. **更新ESP32固件**:确保ESP32使用的是最新版本的固件,以避免因固件bug导致的问题。 7. **调试和日志**:在代码中添加调试日志,记录I2S读取的数据和状态,以便于分析问题所在。 8. **检查电源**:确保ESP32和CS8416的电源稳定,电源不稳定可能会影响信号的质量和幅度。 9. **考虑外部干扰**:检查周围环境是否有可能的电磁干扰,这可能会影响I2S信号的质量和幅度。 10. **使用专业的音频分析工具**:使用专业的音频分析工具来分析I2S信号,以确定问题的具体原因。 最后,如果您能提供更详细的代码片段或错误信息,可能会更容易找到问题的具体原因和解决方案。 |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:14 , Processed in 0.840081 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号