硬汉嵌入式论坛

 找回密码
 立即注册
查看: 956|回复: 5
收起左侧

[DSP] usb音频AUDIO,从原本的16bit修改为24bit,如何修改?

[复制链接]

11

主题

9

回帖

42

积分

新手上路

积分
42
发表于 2025-2-10 11:50:32 | 显示全部楼层 |阅读模式
MIC接收声音,STM32的MDF转为数据,然后USB音频类传输给PC,PC进行播放。
目前我用STM32U5芯片做一个功能,将MIC采集的数据通过MDF滤波,然后DMA将MDF滤波的数据传输到USB AUDIO的音频帧,通过USB传输到电脑。
目前可以传输,4通道(声道),采样深度16bit,采样频率22050,已经成功。
但是想要采样深度从16bit修改为24bit的,修改了音频搬运方式,但失败了。我进行了如下修改

1.【修改描述符为24bit和3字节】
修改
#define USB_AUDIO_CONFIG_MIC_RES_BIT                 16   /* 16 bit per sample */
#define USB_AUDIO_CONFIG_MIC_RES_BYTE                2    /* 2 bytes */
修改为
#define USB_AUDIO_CONFIG_MIC_RES_BIT                 24   /* 16 bit per sample */
#define USB_AUDIO_CONFIG_MIC_RES_BYTE                3    /* 2 bytes */
这个宏定义用于音频描述符
pMicASFormatDesc->bSubFramSize = USB_AUDIO_CONFIG_MIC_RES_BYTE;
pMicASFormatDesc->bBitResolution = USB_AUDIO_CONFIG_MIC_RES_BIT;


2.MDF传输半完成回调HAL_MDF_AcqHalfCpltCallback,和传输全完成回调HAL_MDF_AcqCpltCallback里,4个通道都【修改数据搬运方式为每次3字节】
原本的16bit:(这里for循环次数为96/2=48)
            for(int i=0;i<96/2;i++)
            {
                frame_buffer[8*i+0]=RecLeftChBuff[2*i];      
                frame_buffer[8*i+1]=RecLeftChBuff[2*i+1];   
            }
修改为24bit:(这里for循环次数设置为48,这样每个通道就是搬运48次*3字节=144字节)
            for(int i=0;i<144/3;i++)
            {
                frame_buffer[12*i+0]=RecLeftChBuff[3*i];      
                frame_buffer[12*i+1]=RecLeftChBuff[3*i+1];   
                frame_buffer[12*i+2]=RecLeftChBuff[3*i+2];
            }

3.【修改USB音频端点最大包大小为(144*4)】
原本
#define USBD_AUDIO_EPIN_FS_MPS                        (96*4)
修改为
#define USBD_AUDIO_EPIN_FS_MPS                        (144*4)
宏定义用于
ux_device_class_audio_stream_parameter_max_frame_buffer_size = USBD_AUDIO_EPIN_FS_MPS;

4.也已经考虑了usb端点传输内存大小,并进行了设置
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0xA0);//0xA0*4(WORD)=640字节
足以容纳
#define USBD_AUDIO_EPIN_FS_MPS                        (144*4)的576字节

结果失败了。现象是,在电脑上对这个MIC进行录音操作时,播放出来后的声音,是小声的类似于外星人一样的杂音,根本没有录下我说话的声音,完全没有我说话的声音的任何特征。比如我说“ABC”,但播放出来的声音之中完全没有任何近似“ABC”的声音。

尝试1:调换字节顺序,一共6种可能性,
012,021,102,120,201,210
例如
                frame_buffer[12*i+0]=RecLeftChBuff[3*i];      
                frame_buffer[12*i+1]=RecLeftChBuff[3*i+1];   
                frame_buffer[12*i+2]=RecLeftChBuff[3*i+2];

                frame_buffer[12*i+0]=RecLeftChBuff[3*i];      
                frame_buffer[12*i+1]=RecLeftChBuff[3*i+2];   
                frame_buffer[12*i+2]=RecLeftChBuff[3*i+1];
。。。等等6种可能性,都试过了,现象一样,失败。

尝试2:尝试在高字节添0
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+0]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_1];
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+1]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_2];
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+2]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_3];
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+3]=0;

也就是最后填一个0,并且以下每个通道都填0,同时frame_buffer+x的这个偏移量也往下延顺地增加。同时半传输回调和全传输回调都修改。

失败。结果是录音的时候,录音进度条直接在最开始的时候卡住。

尝试3:尝试在低字节添0

                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+0]=0;
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+1]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_1];
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+2]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_2];
                                frame_buffer[MIC_ALL_CH_RES_BYTE*i+3]=RecLeftChBuff[MIC_RES_BYTE*i+MIC_BUFF_BYTE_OFFSET_3];
也就是第一个最低位填一个0,并且以下每个通道都填0,同时frame_buffer+x的这个偏移量也往下延顺地增加。同时半传输回调和全传输回调都修改。

失败。结果是录音的时候,录音进度条直接在最开始的时候卡住。

尝试4:修改DMA搬运字节数为WORD
原本是HALFWORD
  pNodeConfig.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;// 源数据位宽16
  pNodeConfig.Init.DestDataWidth = DMA_DEST_DATAWIDTH_HALFWORD;// 目标数据位宽16
修改为
1.SrcDataWidthDestDataWidth都修改为WORD

失败,录音的时候,录音进度条直接在最开始卡住。

2.仅SrcDataWidth修改为WORD
失败,MCU卡死。
3.仅DestDataWidth 修改为WORD
失败,录音的时候,录音进度条直接在最开始卡住。




请问,进行什么修改可以将原本的采样频率16bit改成24bit,然后正常录音?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-2-11 07:31:51 | 显示全部楼层
早期处理过一个类似问题,我的是SPI + DMA驱动24bit寄存器控制的DAC8563
我是DMA配置成32bit,SPI配置24bit使用

1235.png

WW.png
回复

使用道具 举报

11

主题

9

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2025-2-12 17:03:06 | 显示全部楼层
将CicMode = MDF_TWO_FILTERS_MCIC_SINC3;修改为
MDF_TWO_FILTERS_MCIC_SINC2
有声音了,但是声音的音调比正常要高。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-2-14 10:46:36 | 显示全部楼层
ERI 发表于 2025-2-12 17:03
将CicMode = MDF_TWO_FILTERS_MCIC_SINC3;修改为
MDF_TWO_FILTERS_MCIC_SINC2
有声音了,但是声音的音调 ...

谢谢告知解决办法
回复

使用道具 举报

11

主题

9

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2025-2-14 17:06:16 | 显示全部楼层
还没完全解决,虽然通过调整时钟频率可以恢复正常音调,但能听得出似乎录音播放出来的说话人声,其声音数据有缺失。目前还不明白为什么。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-6-1 23:17:32 | 显示全部楼层
解决了么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 19:41 , Processed in 0.248360 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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