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.

AWR2944EVM: awr2944EVM

Part Number: AWR2944EVM

工程师,你好

我在2944demo的基础上,对原来的DPC作了一些修改,具体为更改了2DFFT后的数据排布和位数,使导出2DFFT的结果使用matlab作的3DFFT的结果和直接使用硬件加速器作3DFFT的结果不一致。原来的数据按照TX1 TX3 TX4 TX2连续排布,现在修改为TX1 TX2 TX3 TX4排布,且不连续,在16个虚拟通道之间补零后共43位数据进行3DFFT,全部的16个虚拟通道均作为水平天线虚拟通道,我对执行3DFFT的硬件加速器也作了相应更改,包括了dopplersubmat的大小为43*dopplerbins(每个子带的dopplerBin数量)*bytespersample(8byte)*2(pingpong),更改了HWA配置中的srcAidX为42,角度FFT的点数为64,obj->cfarAzimFFTCfg.numAzimFFTBins = 4 * mathUtils_getValidFFTSize(16); srcBidx = 43*bytespersample;对edma也作了相应的更改,将acount改为43*bytespersample,srcBidx = 43*bytespersample,dstBidx = 43*bytespersample;等,上面的更改在函数

DPU_DopplerProcHWA_configHwaCFARAzimFFT和DPU_DopplerProcHWA_configEdmaAzimFFTIn中。
总结:我已经对硬件加速器使用的相关数据的内存大小,硬件加速器的数据读取、FFT的大小,相关edma都作了修改,
请问能否这样更改?还需要作哪些修改?有没有使用硬件加速器的相关配置教程?
  • 你好,我今天试了一下数据注入测试,只对第10个距离门的第一个多普勒单元进行数据注入,其他全赋值为0,注入的测试数据是一个正弦的信号得到的图如下所示

    左图为导出dopplersubmat的数据用matlab处理得到的,右图为在2944上做完3DFFT后,由AzimuthScratchBuf导出的数据,在其他距离单元上也均为0,没有峰值,和matlab仿真结果是一致的

  • 你好

    因为每次迭代要读取43位的数据到HWA的内存中,所以我把cmultScaleEn设为DISABLE,从2944TRM上看到,如果把这位设为disable,同时cmultMode = 0110b时,会将读入的样本和Vector Multiplication Cofficient Ram里面的数进行相乘,我通过更改vecMultiMOde1RamAddrOffset=172,(偏移43位),出来的结果确实和之前不同了,请问要怎么更改Vector Multiplication Cofficient Ram里的数据,要使读入的样本保持不变,要改为什么值,是和校准时相同的虚部在前,实部在后,且虚部为0,实部为1吗

    我使用函数HWA_configRam(obj->hwahandle,HWA_RAM_TYPE_VECTORMULTIPLY_RAM,&BUFFER[0],86*sizeof(int32_t),0))对这块内存进行修改赋值,但是板子就会卡死在DPC里面,根据TRM中的描述,这块RAM支持最多1024个数据,我设置的startIdx=0,所以应该不会超。

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。

  • 你好

    我已经可以正常对HWA_RAM_TYPE_VECTORMULTIPLY_RAM所指向的内存空间赋值,也通过函数mathUtils_asymQuantInt()对所要写入RAM的数进行了转化,现在写入的数据是[0,1,0,1.....],得到的结果仍然不对,得到的VA图如下所示

  • 好的我们跟进给工程师了哈,您也可以查看以下链接来关注该问题的最新进展:

    e2e.ti.com/.../awr2944evm-how-to-change-the-data-in-vector-multiplication-cofficient-ram

  • 你好,

    昨天改完HWA_RAM_TYPE_VECTORMULTIPLY_RAM后,最后出来的结果如下图所示

    但是2944出来的旁瓣有些高,请问上面的结果是否正确?

    我没有配置窗函数,在FFT之后应该作完ABS和log2后就输出了,根据2944TRM的描述,输出的应该是16bit的数据,其中高8位是0,低8位为输出的数据,但是我实际读出的数据在高8位一般不为0,请问中间还有什么操作吗?麻烦跟进一下,谢谢。处理的框图见下图2,也是出自2944TRM。

  • 我们跟进给工程师看下哈。

  • 因为每次迭代要读取43位的数据到HWA的内存中,所以我把cmultScaleEn设为DISABLE

    1)没有理解这个问题,请问能详细描述下具体情况吗?

    2)这是您观察到的,还是发生的问题?

    3)cmultScaleEn 仅适用于 CMULT 模式 0101b。vecMultiMODe1RamAddrOffset 指明与输入样本相乘的向量的起始地址。

    因为每次迭代要读取43位的数据到HWA的内存中,所以我把cmultScaleEn设为DISABLE

    --> 没理解您表述的是什么意思?

    在通过将 CMULT_MODE 设置为 0b0000 触发 HWA 之前,您可以使用 memcpy 或 EDEMA 将数据直接加载到矢量 coeff RAM 中。否则,对 RAM 的访问将被锁定。

    要使读入的样本保持不变,要改为什么值

    --> CMULT 模式 0110b 默认情况下为每次迭代重置向量 coeff RAM 的起始地址。(如果这就是您提出这个问题的意思。)

    主要是对“43位”有些歧义。您想要达到什么目的以及您是如何做到的?

    在您最新一个回复中,旁瓣似乎是没有为输入样本应用窗口的结果。您能否确认使用Windows 后影响是否最小化?

    另外,FFT ABS 的输出是否已确认?

  • 你好

    感谢你的回复。

    1.读取43点到HWA中是因为使用新设计的天线前端不是均匀的线阵需要对16个虚拟通道中间进行lamda/2插值,最后的结果为43位

    2.cmultScaleEn的问题现在已经解决了,如果cmultScaleEn设置位Enable,会将输入的数据与12个I,Q通道的值进行复数相乘,但是现在每次迭代输入的数超过12个,所以设cmultScaleEn为Disable,让输入的数与coeff RAM中的数复乘。

    3.我在dopplerHWA_config中可以写入coeff RAM。我通过函数mathUtils_asymQuantInt对保存到coeff RAM中的数[0,1,0,1....]转换后,可以实现对输入的每个数在和coeff RAM中的数复乘后不变。

    4.在对输出的3DFFT结果根据2944TRM中的output formatter逆转换后,可以和matlab用2DFFT结果作的3DFFT相同。

    5.在验证完3DFFT后,出现了新的问题,是关于Local Maximum检测和os-cfar的,在暗室中测试,使用串口打印出了输出的结果,发现作64点的3DFFT,当检测到的峰值出现在最后一个角度通道(63)时,其加1的角度通道(0)上的信号幅度会比(63)通道上的高,这部分使用的是SDK自己的配置,我仅修改了角度FFT的点数由48点变为64点,请问这是什么原因导致的,我把所有CFAR检出的点的信息用串口发出来检查了一下,发现通道0的值是被os-cfar检出了的。

    谢谢

  • 很高兴听到你这边有了进展。

    关于你的第一点,了解您的用例,但是,请帮忙确认结果是 43 位 (bits)还是 43 字节(bytes)?在较早的情况下,如果可能的话,我想知道如何使用输入格式化程序将 43 bits馈入 HWA。

    5. 角度 FFT 似乎存在 bin 不匹配。我的理解正确吗?使用更高的 FFT 大小,您的能量将更适当地分布在各个区间,这就是为什么您可以看到一个小的偏移。这个增量可以改变 CFAR 选择的 bin。如果可能的话,你能分享你所指的情节吗?

  • 你好

    1.不好意思没有表述清楚。43指的是43个8字节的复数,即2DFFT的结果。

    2.我在暗室中测量发现,Local Maximum检测没有在beam(angle)-doppler图中将当前dopplerBin的64个角度通道中幅度值最大的通道检出,目前仅观察到最大值出现在第0个角度通道,但是local max检出的却是第63个角度通道的峰值,不管是否采用循环还是非循环的Local max检测这点都不合理。请问是什么原因导致的。我把所有的os-cfar检出的结果用串口输出,在os-cfar检测中是检测到了第0个角度通道的峰值的,但是在函数DPU_DopplerProcHWA_extractObjectList中将CFAR的结果和local max检测的BitMask合并后,通道0的峰值就不再被检出了,而第63个角度通道的峰值依然存在,是否可以认为最高的峰值反而没有通过local max检测?当然也存在正确的情况,即第63个角度通道的值高于第0个角度通道、第62个角度通道的值。

    但是,这个错误,对后面的角度估计来说非常关键,错误的峰值索引和错误的插值,将使角度没有任何意义。

  • 你好,

    我尝试把Local maximum检测的结果用串口打印出来,其结果为bitmask,检测到峰值为1,否则为0,输出的格式见2944TRM的第5844以及5845页,我作的3DFFT是64点的,应该用2个32bit的空间来存放值,且不存在高位补零的情况,但是用串口输出的情况为32bit数据的高两字节全为0,

    在函数DPU_DopplerProcHWA_extractObjectList中,使用指针传参,以rangeBin为单元存放local maximum的bitmask,dopplerBin的数量为32,所以一个rangeBin共需要64个uint32_t的空间,local_bitmax为uint32_t*类型。

     memcpy(local_bitmax+rangeBin*64,localMaxMat,256);
    最后使用串口输出了一个rangeBin上的bitmask如下图所示,每个uint32_t的高两字节全为0,
     for(local_max_pri=0;local_max_pri<64;local_max_pri+=2)
            {
                CLI_write("%x %x\r\n",*(result->local_bitmax+result->objOut[energy_max_index].rangeBin*64+local_max_pri),*(result->local_bitmax+result->objOut[energy_max_index].rangeBin*64+local_max_pri+1));
            }
    请问bitmask在内存中存放的顺序是否为按照dopplerBin0[ant0,ant1....ant63],dopplerBin1[ant0,ant1,...ant63],...,dopplerBin31的顺序
    谢谢
  • 你好,

    我现在成功的把local maximum峰值检测的bitmask用串口发了出来,在检测到的能量最高的目标所在的rangeBin和dopplerBin上的角度通道的输出如下文件所示。

    64个角度通道.txt
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    0,s virtual ant's energy = 42547
    1,s virtual ant's energy = 41710
    2,s virtual ant's energy = 39698
    3,s virtual ant's energy = 35494
    4,s virtual ant's energy = 36560
    5,s virtual ant's energy = 37542
    6,s virtual ant's energy = 37150
    7,s virtual ant's energy = 36932
    8,s virtual ant's energy = 37391
    9,s virtual ant's energy = 36321
    10,s virtual ant's energy = 34487
    11,s virtual ant's energy = 38531
    12,s virtual ant's energy = 39768
    13,s virtual ant's energy = 39870
    14,s virtual ant's energy = 39113
    15,s virtual ant's energy = 37467
    16,s virtual ant's energy = 35740
    17,s virtual ant's energy = 35225
    18,s virtual ant's energy = 34042
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    下图是检测到的最大能量目标的角度单元以及相邻角度通道的能量值,其中ANT sub表示检测到峰值的角度通道-1,ANT add表示检测到的角度通道加1,如图,在第63个角度通道检测到峰值,+1为第0个通道,减1为第62个通道,对应的输出也可以在上面的文件中找到对应值。其中第0个通道上的值大于当前检测到峰值的第63个通道的值。

    下图是能量最大的目标所在的rangeBin和dopplerBin上检出的所有目标,(其中 ,在os-cfar中,该rangeBin和dopplerBin 上所有的角度通道都被检出)

    下图是local maximum检出的该rangeBin上的bitmask,其中一行表示一个dopplerBin上峰值检测的结果,分别对应[31,0],[63,32]的多普勒通道,第一行表示第0个dopplerBin,为4882120  82304022,其中4882120表示[31,0]的通道峰值检测结果,以16进制表示,转换为2进制,可以看到上图的目标均在图中被检出,但是作为当前dopplerBin上最大值所在的角度通道0却没有被检出为峰值。(其他检测到的峰值,虽然在os-cfar中也被检测到了,但是超过设定的角度范围,在最后添加到目标列表时被滤除了)。请问硬件加速器的Local maximum检测功能为什么会检测不到最高的峰值?我现在把local maximum的横向和纵向的门限检测都关掉了,即设置LM_THRESH_BITMASK为11b,所以理论上应该只比较检测单元和他四周的参考单元的幅度值大小,为什么最大值无法被检测到?

  • 好的,我们需要跟进给工程师看下。

  • 你好

    我今天检查了一下代码。发现在配置LOCAL Maximum时,没有将原来的3个水平天线改为4个水平天线,导致后面处理时出现了问题

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    if ((cfg->staticCfg.numAzimTxAntennas) % 3 == 0){ /* If numSamples % 3 == 0 */
    hwaParamCfg[paramsetIdx].source.srcCircShiftWrap3 = 2; /* 'b020, means wrap in B dim */
    hwaParamCfg[paramsetIdx].source.srcBcircShiftWrap = mathUtils_ceilLog2((obj->cfarAzimFFTCfg.numAzimFFTBins/3) / 4);
    }
    else{
    hwaParamCfg[paramsetIdx].source.srcCircShiftWrap3 = 0;
    hwaParamCfg[paramsetIdx].source.srcBcircShiftWrap = mathUtils_ceilLog2(obj->cfarAzimFFTCfg.numAzimFFTBins / 4);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我将numAzimTxAntennas赋值为4后,之前的问题得到了解决。

    感谢