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.

[参考译文] Starterware/TMDSLCDK6748:具有 DSP 库的音频馈送演示

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/617451/starterware-tmdslcdk6748-audio-feed-thru-with-dsp-library-demo

器件型号:TMDSLCDK6748
主题中讨论的其他器件:EVMK2G

工具/软件:Starterware

大家好、

是否有一个演示展示了 添加了 DSPLib 滤波器的音频馈通? 我正在考虑使用 DSPF_sp_fir gen_*的 StarterWare McASP_*。  

谢谢、

Scott

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

    我想尝试更笼统地解释我的问题(但也特别与 C6748相关)。 据我了解、示例项目 MCAS_C674x_C6748_lcdkC6748 配置编解码器和 EDMS3通道。 然后、它使用直接存储器存取(DMA)在编解码器输入之间逐字节传输数据、以回路到输出。 如果我错了、请纠正我的问题。  

    我要做的是在编解码器输入和输出之间插入一个 FIR 滤波器。 这意味着我需要以某种方式抓取数据(rxBuf 或 txBuf)并对其进行处理。 我尝试了下面的第一遍作为示例、但我认为它有问题:

    /*复制缓冲区*/
    memcpy ((void *) txBufPtr [lastSentTxBuf]、
    (void *) rxBufPtr[lastFullRxBuf]、
    AUDIO_BUF_SIZE);
    
    // FIR 滤波器
    dSPF_sp_fir_gen (((const float *) rxBufPtr[lastSentTxBuf]、ptr_h、(float *) txBufPtr[lastSentTxBuf]、nh、NY);
    
    
    /*
    **通过相应地设置 DMA 参数来发送缓冲区。
    **此处要发送的缓冲区和样本数按原样传递
    **参数。 这一点很重要、如果只是传输段
    **将被使用。
    *
    BufferTxDMAActivate (lastSentTxBuf、NUM_Samples_per_AUDIO_BUF、
    (无符号短整型) parToSend、
    (无符号短整型) parToLink); 

    希望这将显示问题。 由于数据以 字节的形式传输到/从编解码器传输、我是否需要将数据汇编为4字节的块以重新创建原始浮点数? 如果是这样、它是否会引入过多的延迟、以便能够实时流式传输音频? 我上面的代码将字节发送到滤波器、而不是浮点数(参数为 float 类型)。   我必须插入大量代码来在 DSP 函数前后构建数据。 此外、我是否在正确的位置插入了 DSP 函数? 在不触发编解码器操作的情况下、我似乎无法读取 rxBuf/txBuf。

    我希望这是有道理的。  

    谢谢、

    Scott

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

    我已通知软件团队。 他们的反馈将在此处发布。

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

    Yordan、您好!

    感谢您的回答。 这是我正在处理的最新代码。 它从接收缓冲区中取出一个通道、将字节阵列转换为浮点值、调用 DSP 函数、然后反转该过程。

    if (lastFullRxBuf!= lastSentTxBuf)
    {
    /*
    **从链接参数集开始传输。 参数集
    ** 1将链接到 PAR_TX_START 处设置的参数。 所以请勿这样做
    **更新参数设置1。
    *
    parToSend = PAR_TX_START +(parOffTxToSend % NUM_PAR);
    parOffTxToSend =(parOffTxToSend + 1)% NUM_PAR;
    parToLink = PAR_TX_START + parOffTxToSend;
    
    lastSentTxBuf =(lastSentTxBuf + 1)% NUM_BUF;
    
    //剥离通道1
    deInterleave ((void *) rxBufPtr[lastFullRxBuf]、AUDIO_BUF_SIZE/4、buftemp);
    
    //将字符转换为浮点以进行筛选
    charToFloat (buftemp、audio_BUF_size/4、inputDemoSignal);
    
    //Filter blockprocessing
    dspf_sp_fir gen_cn (inputDemoSignal、coeffsFilter、outputDemoSignal、NUM_OF_TAPPS、NUM_SAMESSAMLE_PER_AUDIO_BUF);
    
    //重新组装到2通道缓冲器中
    Interleave (outputDemoSignal、AUDIO_BUF_SIZE/4、(void *) txBufPtr [lastSentTxBuf]);
    
    
    memcpy ((void *) txBufPtr [lastSentTxBuf]、
    (void *) rxBufPtr[lastFullRxBuf]、
    AUDIO_BUF_SIZE);
    
    /*
    **通过相应地设置 DMA 参数来发送缓冲区。
    **此处要发送的缓冲区和样本数按原样传递
    **参数。 这一点很重要、如果只是传输段
    **将被使用。
    *
    BufferTxDMAActivate (lastSentTxBuf、NUM_Samples_per_AUDIO_BUF、
    (无符号短整型) parToSend、
    (无符号短整型) parToLink); 

    它还不能工作、但我想知道我是否走上了正确的道路。

    谢谢、

    Scott

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

    我们现在已经准备好将音频直通与 DSPLIB 用于该特定器件、但确实有一个音频均衡演示、该演示在 K2G 器件的 C66x DSP 上具有音频直通功能。

    您可以查看 TI 参考设计、该设计还提供了此处提供的演示代码:
    www.ti.com/.../TIDEP0069

    这实现了具有可调增益的双二阶滤波器、以实现3频带均衡器。 实现的关键部分是使从 MCASP FIFO 获取的缓冲区了解 LR 格式、然后应用滤波器、并将数据以相同的格式放回 MCASP 发送缓冲区。

    希望这对您有所帮助。

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

    您好、Rahul、

    感谢您提供信息。 您能给我一个文件名、项目名称还是更具体的内容吗? 有很多链接、引用、库、RTOS、可以链接到您提到的项目。 我已经下载了很多库、但不确定项目或演示代码的位置。

    谢谢、

    Scott

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

    我指的是适用于 K2G 的 Processor SDK RTOS 中的 AudioEQ 项目。 您可以查看此处提供的说明:
    processors.wiki.ti.com/.../Processor_SDK_RTOS_MCASP

    在 Processor SDK RTOS 中、您需要运行 pdkProject 脚本、以便为 DSP 上的 K2G 生成 MCASP 项目、如下所述:
    processors.wiki.ti.com/.../Rebuilding_The_PDK

    希望这对您有所帮助。

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

    是否是该项目:
    processor_sdk_rtos_k2g_4_00_00_04/demos/audio-preprocess/realtime_demo_BIOS/k2g

    由于我没有 K2G 板、我只对源代码感兴趣。 我只想用它来了解我拥有的 LCDK 板。  

    谢谢、
    Scott

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

    音频预处理演示还可用作参考、因为它使用来自多个麦克风的输入并通过波束形成算法传递语音数据、以便对其进行处理以进行语音激活或语音识别。

    我所指的演示可在 C:\ti\K2G_PRSDK4\pdk_k2g_1_0_6\packages/ti\drv\mcasp\examples\src 中找到

    要查看与演示相关的所有源文件、请查看.txt 文件。
    pdk_k2g_1_0_6\packages \ti\drv\mcasp\examples\evmK2G\c66\BIOS\MCASP_AudioEQ_evmK2G_c66ExampleProject.txt

    希望这对您有所帮助。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rahul、
    感谢你的答复。 我认为问题是我尚未提出正确的问题。 您可能为我提供了一个很好的解决方案... 另一个问题。 让我尝试重新提出我的问题。

    我已经要求一个演示使用 DSP 的音频馈通、但(在阅读其他文章后)、我要问的是:

    如何使用 rxBufPtr 一次获取左右两个通道,而原始 memcpy()函数将其值直接复制到 txBufPtr?

    这实际上是另一篇文章的改述、所以我认为我有完全相同的问题。

    此外、这可能部分回答了我之前的问题:

    我的问题:由于数据以字节的形式传输到/从编解码器传输、我是否需要将数据汇编为4字节的块以重新创建原始浮点数?

    我的答案:不 您需要将数据"去交错"为16位有符号整数。 然后将数据"重新交错"到2个通道中、变为无符号字符。 您可以对交错数据执行任何类型的 DSP。

    该帖子中的建议(我不知道如何在此处引用)是:
    "要尝试的几件事以及帮助我的事情:

    -当复制到本地缓冲区时,请确保在添加处理前传递音频。

    -留意数据类型。 PCM 数据是一个有符号整数、示例中的缓冲区是无符号的(我认为"void *"…… 已经有一段时间了)。 这可能会导致一些奇数失真。

    -在示波器上查看波形以尝试辨别数据发生了什么会很有帮助。 这对我来说是最大的帮助之一。

    -请不要忘记、滤波器需要一些历史记录(以前的输入样本)才能工作。 时间为零时的样本需要之前的"n"个样本进行计算、其中"n"是脉冲响应的长度(或滤波器系数的数量)。

    复制方法应该起作用,但您可能需要尝试复制到较大的(r)缓冲区。 例如、我过去使用了4096个采样长缓冲器、像循环缓冲器一样以1024个采样块复制数据。 使用单独的读取和写入偏移量来复制到该缓冲区和从该缓冲区复制到该缓冲区、在您的筛选器处理数据后的某个点进行读取。"

    我想我想了解如何在 Rx/txBuf 中管理/传输/编码采样值。 是否有任何有关样本编码方式的参考?
    谢谢、
    Scott
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于 MCASP 演示、您知道使用哪种格式(单槽、单串行器、多槽、单串行器等)吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想了解如何在 Rx/txBuf 中管理/传输/编码采样值。 是否有任何有关样本编码方式的参考?