This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDSLCDK6748:RTOS 中的 McASP 示例:获取单个采样&放大器;工作详细信息

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1035277/tmdslcdk6748-mcasp-example-in-rtos-getting-single-sample-working-details

器件型号:TMDSLCDK6748

您好!

我目前正在处理6748LCDK 板上 RTOS 中提供的 McASP 示例。 我对代码有疑问:

1) 1)是否可以一次只从输入/麦克风端口获取一个样本、立即对其进行处理并将其转发到输出扬声器/音频端口? 如何做到这一点? 目前、代码被设置为将128个样本(总共128*4 = 512字节、因为每个样本是32位字)传入 Rx 缓冲区、并将相同数量的字节写入输出缓冲区。 如何将其更改为每次仅采样一次、即在缓冲器中一次只采样4个字节或32个位?

2) 2)我需要清楚地了解音频任务的控制流程。 我目前的理解是、McASP 从音频编解码器获取样本、并将其写入512字节存储器 Rx 缓冲器。 只有当这个缓冲器被512字节填满时、音频任务才能够处理采样并输出到 TX 缓冲器。 一旦512字节输出缓冲器被填满、McASP 为 TX 缓冲器提供服务并将样本发送到编解码器以将其输出到扬声器。 我不确定这是否正确。 但是、如果确实如此、则意味着必须先填充 Rx 缓冲器、然后才能处理样本、并且必须填充 TX 缓冲器才能输出样本。

现在、当我使用时间戳来确定将输入/ Rx 缓冲器复制到输出/ TX 缓冲器的每个周期所需的时间时、结果是2.73毫秒。 然而、鉴于采样率为44100Hz、128个采样应该至少需要2.9毫秒(128/44100)+一些开销才能将这些采样写入内存。 这里似乎存在差异。 我对事物工作方式的理解是否不正确? 即使在128个样本被写入缓冲存储器之前、Rx 缓冲器也开始被处理吗?

如果有人能为我提供准确的详细信息、那会更好。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="483120" URL"~/support/audio-group/audio/f/audio-forum/1035277/tmdslcdk6748-mcasp-example-in-rtos-getting-single-sample-working-details ]1)是否可以一次只从输入/麦克风端口获取一个样本、立即对其进行处理并将其转发到输出扬声器/音频端口? 如何做到这一点? 目前、代码被设置为将128个样本(总共128*4 = 512字节、因为每个样本是32位字)传入 Rx 缓冲区、并将相同数量的字节写入输出缓冲区。 如何将其更改为每次仅一个样本、即缓冲区中一次4个字节或32位?

    驱动程序当前使用 FIFO 模式和 EDMA 来与 TX 和 RX FIFO 之间移动数据。 为了同时从 MCASP 接收单个采样、您可以从 MCASP 串行器数据寄存器中读取并一次读取一个采样、而不是使用 FIFO 或基于驱动程序的机制。 为此、您可能需要参考更简单的 MCASP 裸机示例。 一个参考点是我们在较早的 Starterware 包中提供的 McASP 示例:

    https://www.ti.com/tool/STARTERWARE-DSPARM 

    请注意、我们不再支持此传统软件包。 我指向该软件包只是为了提供用于构建示例的参考代码。  

    [引用 userid="483120" URL"~/support/audio-group/audio/f/audio-forum/1035277/tmdslcdk6748-mcasp-example-in-rtos-getting-single-sample-working-details ]2)我需要清楚地了解音频任务的控制流程。 我目前的理解是、McASP 从音频编解码器获取样本、并将其写入512字节存储器 Rx 缓冲器。 只有当这个缓冲器被512字节填满时、音频任务才能够处理采样并输出到 TX 缓冲器。 一旦512字节输出缓冲器被填满、McASP 为 TX 缓冲器提供服务并将样本发送到编解码器以将其输出到扬声器。 我不确定这是否正确。 但是、如果确实如此、则意味着必须先填充 Rx 缓冲区、然后才能处理样本、并且必须填充 TX 缓冲区才能输出样本。

    您的理解是正确的。 DMA 用于将数据从 FIFO 移入和移出 TX 和 RX 缓冲区、并且只有在接收到下一个缓冲区已满时、应用程序才会中断。  

    [引用 userid="483120" URL"~/support/audio-group/audio/f/audio-forum/1035277/tmdslcdk6748-mcasp-example-in-rtos-getting-single-sample-working-details 时]现在、当我使用时间戳来确定将输入/ Rx 缓冲器复制到输出/ TX 缓冲器的每个周期所需的时间时、结果为2.73毫秒。 然而、鉴于采样率为44100Hz、128个采样应该至少需要2.9毫秒(128/44100)+一些开销才能将这些采样写入内存。 这里似乎存在差异。 我对事物工作方式的理解是否不正确? 即使在将128个样本写入缓冲器存储器之前、Rx 缓冲器是否开始被处理?[/quot]

    是采样率44100或48KHz。 我的回忆是、对于 LCDK、MCASP 时钟从内部衍生自24MHz 时钟、因此位时钟可能为48kHz、而不是44.1KHz。  请注意、每个帧都有左右通道数据 、每个通道可以有16位或32位数据。 因此、请确保您要考虑这一点。 您可以在帧同步位时钟上放置一个示波器、以便在从 MCASP 输入或输出数据时查看数据格式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    、关于您对 McASP 时钟的答复:示例中有一个 McASP_cfg.c 文件、该文件具有一个 ICodec_ChannelConfig 结构、用于修改编解码器的采样率。 audiosample_io.c 脚本也使用此结构。 那么、您是说 McASP 仍然使用内部时钟吗? 但是、如果音频编解码器本身以较低的采样率进行采样、那么 McASP 以较高的采样率进行采样是有道理的? 编解码器和 McASP 的采样率是否必须匹配? 此外、我确实发现每个通道都有16位、因此我将缓冲区指针存储为一个短类型、当我通过 Rx 缓冲区迭代以获取输入样本时、每个备用样本来自同一通道。 但是、我不理解您关于在帧同步中放置一个范围的评论。 此外、TX 和 Rx 缓冲器数据是仅用于原始音频样本、还是需要对其进行解码?

    我还想知道、将音频样本从寄存器移至缓冲器的整个过程是否会增加大量延迟? 此外、我想知道、如果我处理存储在 Rx 缓冲器中的样本(这需要一些时间)、并且在处理这些样本后、我将它们复制到 TX 缓冲器中、会发生什么情况? 那么、输出音频端口上会发送什么内容?

    在我当前使用 RTOS 和 McASP 驱动程序示例开发的应用中、如果我增加迭代次数(用于与多达32个滤波器抽头进行乘法)、我的输出将变得非常嘈杂。 我确定噪声不是因为与滤波器抽头相乘、因为即使我在进行处理后只将 Rx 缓冲器复制到 TX 缓冲器(以考虑处理延迟)、我也会听到有噪声的音频。

    最糟糕的是、TI 的6713能够处理更多的迭代次数(应用900个滤波器抽头)。 我一直在尝试简单地移植在6713开发的应用程序到6748。 然而,已经有几个月了,这种简单的实施仍然没有效果。 TI 的人员建议使用6748进行原型设计、以实现需要多个麦克风输入的应用。 如果使用单个麦克风输入设置简单应用需要很多月的时间、我想知道该板是否完全能够支持多个麦克风。

    我想直接回答一下该板是否能够支持实时音频处理。 TI 是否为连接该板上的多个麦克风提供支持? 如果没有、TI 是否有具有多个麦克风输入端口的更好的实时音频处理解决方案?