找回密码
 立即注册

微信扫码登录

查看: 2649|回复: 8

基于B91谈下对音频的理解

[复制链接]

3

主题

72

回帖

306

积分

版主

积分
306
发表于 2024-9-24 20:04:48 | 显示全部楼层 |阅读模式
附件是个人对音频的一些理解,欢迎讨论

音频播放理解.pdf

569.06 KB, 下载次数: 38

13

主题

82

回帖

627

积分

管理员

积分
627
发表于 2024-9-24 22:56:36 | 显示全部楼层

0

主题

2

回帖

28

积分

英勇黄铜

积分
28
发表于 2025-2-22 10:57:39 | 显示全部楼层
        audio_config_mic_buf((unsigned short*)MicBuf,MIC_BUFFER_SIZE);
        audio_set_mute_pga(0);  ////enable audio need follow this step: 1 enable bias; 2 disable mute_pga;
        audio_amic_init(AUDIO_RATE_VAL);                                                          //3 init; 4 delay about 17ms; 5 enable mute_pga.
        sleep_ms(17);
        audio_set_mute_pga(1);


while(1)
        uart_send_dma((unsigned char *)MicBuf);


我通过sdk的代码初始化AMIC后然后在循环里用串口来发送存储音频数据的队列,然后我应该在另一端如何处理音频数据,或者音频数据的格式是什么样的,调试了很多次播放出来的都是杂音
datasheet里面“单声道模式会将 2 个 16 位数据从单个通道合并为 1 个 32 位数据”应该如何理解这句话

3

主题

72

回帖

306

积分

版主

积分
306
 楼主| 发表于 2025-2-25 11:12:21 | 显示全部楼层
“单声道模式会将 2 个 16 位数据从单个通道合并为 1 个 32 位数据” 个人认为意思就是 原先是一个int16_t 的变量存放两个 变成一个int32_t 的变量 存放一个

3

主题

72

回帖

306

积分

版主

积分
306
 楼主| 发表于 2025-2-25 11:14:34 | 显示全部楼层
不能简单的while(1)
        uart_send_dma((unsigned char *)MicBuf); 这样推送,要根据MIC BUF的读指针 来  依次送出数据,要不然会得到杂音,这个可以参考B91 驱动SDK的 音频demo

3

主题

72

回帖

306

积分

版主

积分
306
 楼主| 发表于 2025-2-25 14:58:27 | 显示全部楼层

static err_t CODEC_MSG_TEST_AUDIO_handle(codec_t* codec)
{
    /*-------------------------------------
                Mic------>SPK
    --------------------------------------*/
    int32_t ret_enc = 0;
    int32_t ret_dec = 0;
    int16_t loop_back_pcm[640];
        sa_adc_t pcm_mic_buf[640];
    uint8_t loop_back_encode_buf[60];
    uint32_t loop_back_audio_pcm32[640];
   
    if(play_samples_in_buf(codec) >= 320)
    {
        return ERR_INVALID_STATE;
    }

    codec_read_mic_data(codec, pcm_mic_buf, 640);

    for(int i = 0; i < 640; i++)
    {
        loop_back_pcm[i] = pcm_mic_buf[i] & 0x0000ffff;
    }

    for(int i = 0; i < 640; i++)
    {
        loop_back_audio_pcm32[i] = ((uint32_t)(loop_back_pcm[i]) << 16) |\
                        (((uint32_t)loop_back_pcm[i]) & 0xffff);
    }

    codec_push_buf(codec, loop_back_audio_pcm32, 640 * 4);

#if WAV_RECORD_EN
        wav_write(pcm_mic_buf, 320);
#endif
   
    return ERR_SUCCESS;
}

3

主题

72

回帖

306

积分

版主

积分
306
 楼主| 发表于 2025-2-25 15:00:45 | 显示全部楼层
上面我贴了一段代码  CODEC_MSG_TEST_AUDIO_handle每2ms会起来检查一次 然后使用play_samples_in_buf函数检查音频池中 剩下的样点数是否大于320个样点,如果不够了,就需要从MIC中取出样点数据,然后拼成双声道,然后推送进codec buff中

0

主题

2

回帖

28

积分

英勇黄铜

积分
28
发表于 2025-3-6 16:07:45 | 显示全部楼层
TL_CSJ 发表于 2025-2-25 11:14
不能简单的while(1)
        uart_send_dma((unsigned char *)MicBuf); 这样推送,要根据MIC BUF的读指针  ...

可以贴个读取MIC_BUF如何读数据的例程吗,不是很明白怎么提取MIC_BUF里面的数据,我自己读的数据都是一样的,读指针需要自己去更新吗

3

主题

72

回帖

306

积分

版主

积分
306
 楼主| 发表于 2025-3-7 13:07:11 | 显示全部楼层
image.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2025-4-4 18:09 , Processed in 0.088055 second(s), 22 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表