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.

[参考译文] AUDK2G:使用两个输入生成一个输出的示例用例

Guru**** 2589520 points
Other Parts Discussed in Thread: AUDK2G

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/569402/audk2g-example-use-case-of-using-two-inputs-to-generate-one-output

器件型号:AUDK2G

您好!

我正在通过 AUDK2G audioAnalogLoopbackTest 代码进行组合、以查看我是否可以完成特定的用例、但到目前为止无法确定如何完成此操作。

基本上、我想采用两个输入通道、特别是左侧的 ADC0和右侧的 ADC0、在两个通道上执行一个操作、并向左侧的 DAC0提供一个输出。  例如、如果我想获取两个输入通道(((channelInLeft[i]+ channelInRight[i])/2 = channelOutLeft[i])的平均值、并将结果提供给 DAC0的输出、我将从何处开始执行此操作/如何进行?  txBuf/rxBuf 中是否包含来自所有通道的所有数据?  如何访问特定的通道帧?  或者、我是否必须在初始化期间将通道"路由"到其他位置?

这种情况的简单示例将解答我在 ECHO_TASK 调用中有关数据操作的一些不同问题。

如果我缺少一些文档、请告诉我。  我一直在寻找、但很容易错过重要的部分。

--

Justyn

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

    Justyn,

    我n`t 我们有一个示例、可以执行您所需的类似操作、但我们正在研究一些 TI 设计、该设计将在2017年第1季度末或2017年第2季度初发布、该设计将采用多个模拟输入并输出单个立体声通道输出。

    您可以使用现有的 MCASP 驱动程序设计来完成您要实现的目标。 请查看路径 pdk_k2g_1_x_x\packages/ti\drv\McASP\docs 下的设计文档 MCASP_LLD_SDS.pdf。  

    将 RX_NUM_serializer 设置为2并将 TX_NUM_serializer 设置为1、要 从多个串行器获取输入、您可以设置 MCASP_CHANNEL 参数、如下所示:

    接收的/* McASP 通道参数 */
    McASP_ChanParams mcaspRxChanParam =
    {
    0x0002、 /*串行器数量 */
    {McASP_SerializerNum_0、
    McASP_SerializerNum_1、
    }、//串行器索引 */
    &mcaspRcvSetup、
    true、
    McASP_OpMode_TDM、 /*模式(TDM/DIT) */
    McASP_WordLength _32、
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 //
    //McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleave_1、
    McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_2、
    true、
    true
    };
    
    
    // McASP 发送通道参数 //
    McASP_ChanParams mcaspTxChanParam =
    {
    0x0001、 /*串行器数量 //
    {McASP_SerializerNum_2、}、// DAC0的串行器索引*/
    &mcaspXmtSetup、
    true、
    McASP_OpMode_TDM、
    McASP_WordLength _32、 /*字宽 */
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 */
    McASP_BufferFormat_1SER_MULTISLOT_Interleaved、
    //McASP_BufferFormat_1SER_MULTISLOT_NON_Interleaved、
    true、
    true
    };
    

    然后、TxBuff 中的多个串行器将以交错格式 S1_L、S2_L、S1_R、S2_R 提供这些数据

    注意:确保已分配 RXBUF 的大小为(BUFSIZE * RX_NUM_serializer)。

    希望这对您有所帮助。

    此致、

    Rahul

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

    感谢您提供更多信息。  就在您提供的代码小片段中、我可以更好地看到正在发生的情况。

    我进行了这些更改、并使用交错和非交错数据进行了播放、但我无法使音频正常工作。  充其量、我会听到声音微弱、失真的振铃。  我确定这是因为我复制数据的方式、但我可以验证正确的通道是否正常工作。

    我想知道您是否可以提供从非交错数据获取通道数据的示例。  过去、对于其他音频应用、您可以在交错数据和非交错数据之间进行选择。  使用非交错数据、您可以轻松访问输入/输出缓冲器的元素以获取通道(在本例中为串行器和通道)数据。

    例如、如果我配置 McASP 通道参数、如下所示:

    接收的/* McASP 通道参数 */
    McASP_ChanParams mcaspRxChanParam =
    {
    0x0002、 /*串行器数量 //
    {McASP_SerializerNum_0、
    McASP_SerializerNum_1}、//串行器索引 */
    &mcaspRcvSetup、
    true、
    McASP_OpMode_TDM、 /*模式(TDM/DIT) */
    McASP_WordLength _32、
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 //
    McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_2,
    true,
    true
    };
    
    //发送的 McASP 通道参数- DAC0 */
    McASP_ChanParams mcaspTx0ChanParam =
    {
    0x0001、 /*串行器数量 //
    {McASP_SerializerNum_0}、// DAC0的串行器索引*/
    &mcaspXmtSetup、
    true、
    McASP_OpMode_TDM、
    McASP_WordLength _32、 /*字宽 */
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 */
    McASP_BufferFormat_1SER_MULTISLOT_NON_Interleaved、
    true
    
    、true}; 

    能否从 rxBuf 访问各个通道/串行器?  如果是、我该怎么做?

    例如、在之前的音频项目中、使用 Portaudio 框架、您只需访问缓冲器的其中一个元素、就可以访问缓冲器的不同通道、而不必每次采样脱机。  例如:

    float * in_left_front =((float **) inputBuffer)[0];
    float * in_right_front =((float **) inputBuffer)[1];
    float * in_left_rear =((float **) inputBuffer)[2];
    float * in_right_rear =((float **) inputBuffer)[3];
    

    我在这里能做些类似的事情吗?

    在一天结束时、我想放入一个执行以下操作的函数:

    AVERAGE_AUDIO (ser_1_left、ser_1_right、ser_2_left、ser_2_right、output_left、 output_right、size){
    unsigned int i;
    对于(i = 0;i < size、i++){
    output_left[i]=(ser_1_left[i]+ ser_2_left[i])/2;
    output_right[i]=(ser_1_right[i]+ ser_2_right[i])/2;
    }
    } 

    我已根据我所能给出的信息正确配置了通道。  我认为非交错式数据格式就是我想要的、我有 txBuf 和 rxBuf。

    由于 rxBuf 包含我需要的所有音频数据、我如何才能获得这4个音频通道? (SER_1_LEFT、ser_1_right、ser_2_left、ser_2_right)?  如何获取两个通道的输出 output_left、output_right?

    这几乎是我现在需要的最后一个链接。  我会在这方面花费更多的时间、但我们正在积极开发复杂的算法、以便始终将这些算法投入到电路板上、我花费的时间越多、尝试了解所有 TI 细微差别、完成这些算法移植所需的时间就越少。

    再次感谢您、

    Justyn

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

    您好、Rahul。

    我将尝试浏览所有不同交错/非交错模式的文档

    /**
    *\brief 枚举,用于指定支持的缓冲区格式。
    *
    *交错和非交错是标准格式、此枚举
    *捕获标准和自定义数据格式。
    */
    typedef 枚举 McASP_BufferFormat_e
    {
    /*此模式用于包含连续数据的缓冲区 *
    *每个样本都是"wordWidth" long 的存储器位置。 这种情况 *
    以下配置支持*格式 *
    *
    * DSP 模式下的单串行器。DIT 模式也可以使用此格式*
    * *
    *注意:交错和非交错不适用于此情况 *
    *缓冲区格式 *
    McASP_BufferFormat_1SER_1SLOT、
    
    /*这用于在单个串行器上通过传输数据 *
    *多个 slots.please 请注意插槽数据不是交错的*
    *。 *
    * *
    *具有单个串行器和大于1的插槽的 TDM 使用此格式。DIT CAN *
    *也使用此格式 *
    McASP_BufferFormat_1SER_MULTISLOT_NON_Interleaved、
    /*这用于在单个串行器上通过传输数据 *
    *多个 slots.please 请注意插槽数据是交错的 *
    *。 *
    * *
    *具有单个串行器和大于1的插槽的 TDM 使用此格式。 DIT *
    这里也支持*模式 *
    McASP_BufferFormat_1SER_MULTISLOT_Interleaved、
    
    /*这用于在具有多个*的单个插槽上传输数据
    *串行器 enabled.please 注意到串行器数据是 *
    *以该格式交错。 *
    * *
    *具有多个串行器的 DSP 和 DIT 模式使用此格式 *
    McASP_BufferFormat_MULTISER_1SLOT_SER_Interleaved、
    
    /*这用于在具有多个*的单个插槽上传输数据
    *串行器 enabled.please 注意到串行器数据是 *
    *以该格式交错。 *
    * *
    *具有多个串行器的 DSP 和 DIT 模式使用此格式 *
    McASP_BufferFormat_MULTISER_1SLOT_SER_NON_Interleaved、
    
    /*这用于通过多个串行器和*传输数据
    *还有多个插槽 enabled.please 请注意,串行器数据是*
    *以该格式交错。 插槽数据也是交错的 *
    *请参阅用户指南以查看示例数据格式。 *
    *
    具有多个串行器和多个插槽的* TDM 和 DIT 模式*
    *此格式 *
    McASP_BufferFormat_MULTISER_MULTISLOT_SEMI 交错_1、
    
    /*这用于通过多个串行器和*传输数据
    *还有多个插槽 enabled.please 请注意,串行器数据是*
    *在此格式中不交错。 插槽数据是交错的 *
    *请参阅用户指南以查看示例数据格式。 *
    *
    具有多个串行器和多个插槽的* TDM 和 DIT 模式*
    *此格式 *
    McASP_BufferFormat_MULTISER_MULTISLOT_SEMI 交错_2
    
    /*由于 MCAASP 提供了*,我们无法支持此缓冲区格式
    * TX 欠运转错误。
    *当2个串行器均配置为2插槽模式时。 MCASP *
    *尽管它收到两个16位样本、但它认为它只是*
    *一个32位样本、因为它将始终提供欠运转*
    *错误。 因此不支持此缓冲区格式 *
    *这用于通过多个串行器和*传输数据
    *还有多个插槽 enabled.please 请注意插槽数据是 *
    *在此格式中不交错。 串行器数据是交错的*
    *请参阅用户指南以查看示例数据格式。 *
    *
    具有多个串行器和多个插槽的* TDM 和 DIT 模式*
    *此格式 *
    BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_3、
    */
    }McASP_BufferFormat; 

    我已经浏览过大多数文献、找不到这些不同模式含义的图示或示例。

    在 AUDK2G 回送示例以及 MCASP_Audio 回送示例中、在 ECHO_TASK 调用的核心部分、只有一个 memcpy。

    与使用 memcpy 相比、您实际上无法提供更少的样本处理方式详细信息。  我建议您不要使用 memcpy、而是使用 for 循环、显示如何逐一回送样本。


    但无论如何、现在、我仍然迷路了。  我找不到相关信息、代码未演示如何去交错数据。

    同样、理想情况下、我希望数据采用非交错格式。  这方面的一个例子对我来说是最有帮助的。

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

    显然、当使用多个样本时、采样从串行器交错的方式中缺少一些东西。

    当我仅使用一个串行器进行输入和输出时、我可以将样本脱机、并按照我的预期将其路由出去。  例如、以下是单串行器模式的配置:

    接收的/* McASP 通道参数 */
    McASP_ChanParams mcaspRxChanParam =
    {
    0x0001、 /*串行器数量 //
    {McASP_SerializerNum_0}、
    &mcaspRcvSetup、
    true、
    McASP_OpMode_TDM、 /*模式(TDM/DIT) */
    McASP_WordLength _32、
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 */
    McASP_BufferFormat_1SER_MULTISLOT_Interleaved、
    TRUE、
    TRUE
    };
    
    //发送的 McASP 通道参数- DAC0 */
    McASP_ChanParams mcaspTx0ChanParam =
    {
    0x0001、 /*串行器数量 //
    {McASP_SerializerNum_0}、// DAC0的串行器索引*/
    &mcaspXmtSetup、
    true、
    McASP_OpMode_TDM、
    McASP_WordLength _32、 /*字宽 */
    NULL、
    0、
    NULL、
    GblErr、
    2、 /* TDM 通道数 */
    McASP_BufferFormat_1SER_MULTISLOT_Interleaved、
    true
    
    、true};
    
    

    我在堆上分配了一些缓冲区用于调试。

    int32_t inBufTempL1[BUFSIZE * RX_NUM_serialer];
    int32_t inBufTempL2[BUFSIZE * RX_NUM_serialer];
    int32_t inBufTempR1[BUFSIZE * RX_NUM_serialer];
    int32_t inBufTempR2[BUFSIZE * RX_serialize]; 

    在回显任务调用中、我的代码如下所示:

    int32_t * inBuf;
    int32_t * outBuf;
    
    outBuf =(int32_t *) txBuf[gtxFrameIndexCount];
    inBuf =(int32_t *) rxBuf[grxFramexCount];
    
    unsigned int i、j;
    
    // Tempiize 输入*/
    for (i 32_t *
    、I = 1、I = 1、I、I = 1、I、I = 1、I、I = 1、I、I、I = 1、I、I = 1、I = 1、I、I = 1、I、I = 1、I、I、I = 1、I、I +、I、I、I、I = 1、I = 1、I、I = 1、I、I、I = 1、I、 等等...
    inBufTempR1[j]= inBuf[I + 1];
    }
    
    //对
    (I = 0、j = 0;I < BUFSIZE * TX_NUM_serializer / sizeof (Int32_t);I += 2、j++){
    outBuf[i]= inBufTempj1
    ;inBufTempl1[i +1]
    

    那么、我要做的是假设样本以 R、L、R、L 等形式出现  我将所有左侧样本放入一个缓冲器(inBufTempL1)、将所有右侧样本放入另一个缓冲器(inBufTempR1)。  然后、当我对输出进行序列化以回放时、我可以将右侧样本加倍、或将左侧样本加倍、以在耳机中听到左侧或右侧的输出。  在上面的代码中、我可以使用左通道。  我还可以通过将最后几行更改为来播放真正的立体声音频

    outBuf[i]= inBufTempL1[j];
    outBuf[i + 1]= inBufTempR1[j]; 

    However, nothing is making sense when I use more than one serializer.  My configuration formultiple input channels is:



    接收的/* McASP 通道参数 */ McASP_ChanParams mcaspRxChanParam = { 0x0002、 /*串行器数量 // {McASP_SerializerNum_0、 McASP_SerializerNum_1}、 &mcaspRcvSetup、 true、 McASP_OpMode_TDM、 /*模式(TDM/DIT) */ McASP_WordLength _32、 NULL、 0、 NULL、 GblErr、 2、 /* TDM 通道数 // McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_2, true, true }; //发送的 McASP 通道参数- DAC0 */ McASP_ChanParams mcaspTx0ChanParam = { 0x0001、 /*串行器数量 // {McASP_SerializerNum_0}、// DAC0的串行器索引*/ &mcaspXmtSetup、 true、 McASP_OpMode_TDM、 McASP_WordLength _32、 /*字宽 */ NULL、 0、 NULL、 GblErr、 2、 /* TDM 通道数 */ McASP_BufferFormat_1SER_MULTISLOT_Interleaved、 true 、true};

    根据您之前的评论、您提到样本应该是 S1_L、S2_L、S1_R、S2_R

    因此、在我的 ECHO_TASK 代码中、我执行类似的操作:

    int32_t * inBuf;
    int32_t * outBuf;
    
    outBuf =(int32_t *) txBuf[gtxFrameIndexCount];
    inBuf =(int32_t *) rxBuf[grxFramexCount];
    
    unsigned int i、j;
    
    // Tempiize 输入*/
    for (i 32_t *
    、I= 1、I = 1、I = 1、I、I = 1、I、I = 1、I、I = 1、I、I、I = 1、I、I = 1、I、I、I = 1、I、I、I = 1、I = 1、I、I +、I、I、I、I = 1、I = 1、I = 1、I、I、I = 1、I、I、 等等...
    inBufTempR1[j]= inBuf[I + 1];
    inBufTempL2[j]= inBuf[I + 2];
    inBufTempR2[j]= inBuf[I + 3];
    }
    
    //串行输出*
    对于(I = 0、j = 0;I < BUFZE * TX_OUTx+= 32
    );inbuf1+ outl1[i
    + out1
    + out1 + out1;inTempeout1 = out1 + out1 + out1 

    这不奏效。  我在输出端收到一些垃圾噪声、并有一些实际的信号。  当我按照您的建议使用 semi interleaved_2宏时、我可以听到输出上的多个输入、这绝对不是预期的。  当我使用 semi interleaved_1时、我只听到4个输出中的一个(两个串行器、两个通道(L 和 R))、但是音频仍然听起来像垃圾。

    我将附加我的 McASP_cfg.c 和 mcasp_cfg.h 文件、因为这是我迄今为止唯一进行了更改的地方。  标头中有一个名为"two_input"的宏、当您将其关闭/打开时、它将按照建议配置通道、并在 ECHO_TASK 调用中使用代码的不同部分。  请提供建议、因为这将获得漂亮的 tedius.e2e.ti.com/.../mcasp_5F00_cfg.he2e.ti.com/.../mcasp_5F00_cfg.c

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

    Justyn,

    我n`t 不回答这个问题、但我正在处理一项高优先级任务、因此不能在这个问题上花费太多时间。  我联系了开发人员以提供一些指导或文档、这里是我能够从他们那里获得的文档。

    e2e.ti.com/.../MCASP_5F00_DataFormats.pdf

    我n`t 审查了整个文件,但对半交错的解释与我提到的一致。 我将尝试使用这些设置进行实验、并查看您的代码、看看我是否可以提供一些额外的指导。

    您是否正在创建测试向量并使用一个立体声输入来检查缓冲区格式?  

    此致、

    Rahul

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

    Justyn,

    下面是指定的不同格式的 MCASP LLD 输入和输出缓冲器的图形表示。 我先前的解释似乎不正确。 这些格式已由我的同事独立验证、他正在使用多麦克风输入板和 MCASP LLD 驱动器。

    对于数据格式为 McASP_BufferFormat_MULTISER_MULTISLOT_Semi_Interleaved_1的 I2S 模式

    对于数据格式为 McASP_BufferFormat_MULTISER_MULTISLOT_Semi_Interleaved_2的 I2S 模式

     

    希望这能为数据的解串和处理提供一些明确的说明


    此致、

    Rahul

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

    好的、它最后使用的是 McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_2。

    同时出现了几个问题、由于一些错误信息、没有任何事情能够同时正常工作。

    为了使其正常工作、需要在 McASP_cfg.c 的第81行和第82行中正确分配 TX/RX 缓冲区。

    /* McASP Tx 和 Rx 帧缓冲区指针*/
    ptr txBuf[NUM_bufs * TX_NUM_serialer];
    ptr rxBuf[NUM_bufs * RX_NUM_serialer];
    

    我想您在我最初提出问题时提到过这一点。  但也必须在第331行和第352行中修改 Rx/txFrame 的 size 属性

    rxFrame [count].size = BUFSIZE * RX_NUM_serializer;
    

    txFram[count].size = BUFSIZE * TX_NUM_serializer; 

    这也必须在实际回声回送调用中以及在第529和539行中进行更改。

    基本上、您警告我为 rxBuf 和 txBuf 分配足够的缓冲空间、但我也没有考虑对 rxFrame 和 txFrame 进行更改。  我确实在 ADC 上使用了测试矢量、但在缓冲器内容方面看到了非常错误的结果。  我认为它分配不正确、再加上轻微的错误信息、我无法让它工作一段时间。  此外、我的项目暂时放宽了使用一个 TX 和一个 RX 串行器的要求、因此我没有为此付出太多的努力。

    简而言之、再次感谢大家的帮助。

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

    感谢您确认您的设置正常工作、Justyn。

    请您澄清您使用的格式、并确认获取数据的格式与提供的图形相匹配。 我们计划将类似的图形添加到驱动程序文档中、以便您的确认将重新强制执行我们对发布此帖子的其他人的观察结果。

    此致、
    Rahul

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

    很抱歉、我已经有一段时间了、在得到上述答案后、我开始进行开发。

    但是、我确实有一些时间对此做出响应。

    我使用的工作模式是 I2S 模式、数据格式为 McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_2

    我可以确认它与上表匹配。

    但是、McASP_BufferFormat_MULTISER_MULTISLOT_Semi_interleaved_1模式的表中有一些拼写错误。  SEMI 交错_1的正确格式为 SR1_L1、SR2_L1、SR1_R1、SR2_R1、SR1_L2、 SR2_L2、SR1_R2、SR2_R2等

    也许更清楚一点、样本会像 L、L、R、R、L、L、R、R、R、其中第一个 L 是 SR1、第二个 SR2等  工程师可能是正确的、但 semi interleaved_1的表格全部乱码。

    --

    Justyn

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

    我们在随附的文档中直观地展示了这一点。 感谢您的反馈、并帮助我们在配套资料中找出这一差距。
    processors.wiki.ti.com/.../Processor_SDK_RTOS_MCASP

    此致、
    Rahul