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.

AWRL1432: SDK5.3 mmw demo questions about cfar

Part Number: AWRL1432

Hi experts, 

    I am testing the performance of the AWRL1432 development board.

    The configured maximum range is about 85 metersThe configuration parameters are as follows:

    

    In the mmwDemo_TransmitProcessedOutputTask function, I output all moving point clouds (speed greater than 0.5m/s) through the serial port:

    

    I held the corner reflector away from and then closer to the radar at a speed of about 1.5m/s. There is no interference from other moving targets in the environment.

    I found that the stable detection distance was only about 20 meters, but even at a position of 40 meters, the SNR was above 20. 

    Attached is the point cloud data. Are there other conditions that limit the detection results of point clouds?

point:20 frame:430
06 x  0.43 y:10.6 v  1.36 peak:72.0 snr:32.3
07 x  0.44 y:10.6 v  1.43 peak:69.7 snr:30.9
08 x  0.83 y:10.6 v  1.43 peak:69.7 snr:30.9
point:26 frame:431
06 x  0.55 y:10.6 v  1.39 peak:73.2 snr:33.0
07 x  0.50 y:10.6 v  1.45 peak:71.2 snr:33.4
08 x  0.50 y:10.6 v  1.45 peak:71.2 snr:33.4
09 x  0.22 y:10.9 v  1.35 peak:67.3 snr:28.1
10 x -0.12 y:10.9 v  1.47 peak:64.9 snr:26.3
point:27 frame:432
06 x  0.29 y:10.9 v  1.38 peak:70.7 snr:30.5
07 x  0.28 y:10.9 v  1.44 peak:68.8 snr:29.5
point:22 frame:433
07 x  0.65 y:11.0 v  1.52 peak:69.7 snr:28.1
08 x  0.56 y:11.0 v  1.61 peak:71.0 snr:31.5
point:29 frame:434
07 x  0.47 y:11.1 v  1.48 peak:69.8 snr:29.2
08 x  0.44 y:11.0 v  1.54 peak:70.0 snr:30.9
09 x  2.76 y:11.3 v  1.38 peak:68.6 snr:27.0
10 x  2.92 y:11.2 v  1.47 peak:67.2 snr:28.4
point:33 frame:435
07 x  0.25 y:11.2 v  1.49 peak:69.7 snr:30.9
08 x  0.10 y:11.2 v  1.55 peak:69.5 snr:32.0
09 x  0.53 y:11.2 v  1.55 peak:69.5 snr:32.0
10 x  1.49 y:11.9 v  1.28 peak:65.4 snr:26.4
11 x  1.52 y:11.9 v  1.52 peak:64.3 snr:26.2
point:29 frame:436
07 x  0.45 y:11.4 v  1.57 peak:67.4 snr:28.9
08 x  0.42 y:11.4 v  1.59 peak:68.5 snr:30.9
point:26 frame:437
08 x  0.18 y:11.5 v  1.45 peak:68.6 snr:28.4
09 x  0.58 y:11.5 v  1.45 peak:68.6 snr:28.4
10 x  0.51 y:11.5 v  1.65 peak:70.6 snr:31.2
point:24 frame:438
08 x  0.71 y:11.7 v  1.39 peak:69.7 snr:29.4
09 x  0.67 y:11.7 v  1.57 peak:70.3 snr:31.0
point:28 frame:439
09 x  0.29 y:11.9 v  1.23 peak:70.5 snr:31.4
10 x  0.35 y:11.8 v  1.39 peak:67.1 snr:28.6
point:21 frame:440
06 x  0.32 y:12.0 v  1.40 peak:70.0 snr:30.1
07 x  0.18 y:12.0 v  1.43 peak:67.9 snr:27.7
point:32 frame:441
07 x  0.43 y:12.2 v  1.51 peak:69.1 snr:29.5
08 x  0.43 y:12.2 v  1.54 peak:69.2 snr:30.5
point:23 frame:442
06 x  0.39 y:12.3 v  1.48 peak:71.2 snr:31.4
07 x  0.66 y:12.3 v  1.52 peak:70.8 snr:32.6
point:28 frame:443
10 x  0.57 y:12.5 v  1.45 peak:68.5 snr:29.6
11 x  0.38 y:12.5 v  1.51 peak:67.8 snr:28.9
point:34 frame:444
08 x  0.41 y:12.6 v  1.42 peak:69.2 snr:31.3
09 x  0.18 y:12.6 v  1.50 peak:68.2 snr:30.1
10 x  0.64 y:12.6 v  1.50 peak:68.2 snr:30.1
point:29 frame:445
07 x  0.46 y:12.7 v  1.47 peak:68.0 snr:28.7
08 x  0.56 y:12.8 v  1.54 peak:68.0 snr:28.4
point:34 frame:446
08 x  0.46 y:12.9 v  1.29 peak:66.1 snr:27.0
09 x  0.54 y:12.8 v  1.56 peak:66.8 snr:26.1
point:29 frame:447
09 x  0.50 y:13.1 v  1.41 peak:70.2 snr:29.9
10 x  0.51 y:13.0 v  1.44 peak:68.0 snr:27.4
point:26 frame:448
07 x  0.19 y:13.2 v  0.58 peak:68.7 snr:12.4
08 x  0.44 y:13.2 v  1.12 peak:69.4 snr:32.1
09 x  0.59 y:13.2 v  1.41 peak:65.3 snr:26.2
point:29 frame:449
07 x  0.52 y:13.2 v  0.55 peak:68.4 snr:11.9
08 x  0.62 y:13.3 v  1.13 peak:68.9 snr:29.3
09 x  0.62 y:13.3 v  1.13 peak:68.9 snr:29.3
10 x  0.64 y:13.3 v  1.40 peak:65.6 snr:26.7
point:32 frame:450
08 x  0.78 y:13.5 v  1.39 peak:66.5 snr:27.7
09 x  0.93 y:13.5 v  1.49 peak:65.4 snr:25.8
point:25 frame:451
07 x  0.83 y:13.6 v  1.42 peak:68.6 snr:27.1
08 x  0.72 y:13.6 v  1.50 peak:67.9 snr:27.1
point:31 frame:452
07 x  0.46 y:13.8 v  1.43 peak:69.5 snr:30.2
08 x  0.35 y:13.8 v  1.47 peak:68.2 snr:28.1
point:32 frame:453
08 x  0.59 y:13.9 v  1.40 peak:65.1 snr:26.7
09 x  0.84 y:13.9 v  1.46 peak:64.1 snr:25.0
point:26 frame:454
08 x  0.09 y:14.1 v  1.41 peak:68.0 snr:28.4
09 x  0.07 y:14.1 v  1.54 peak:68.0 snr:28.4
point:24 frame:455
06 x  1.44 y:14.3 v  1.41 peak:70.5 snr:30.9
07 x  1.30 y:14.3 v  1.54 peak:70.2 snr:32.3
point:28 frame:456
07 x  0.86 y:14.4 v  1.35 peak:72.6 snr:35.1
08 x  0.77 y:14.4 v  1.44 peak:70.4 snr:33.0
09 x -0.43 y:14.5 v  0.68 peak:67.2 snr:10.5
point:32 frame:457
08 x  0.91 y:14.6 v  1.28 peak:69.9 snr:31.2
09 x  0.75 y:14.6 v  1.45 peak:67.1 snr:28.2
point:25 frame:458
06 x  0.45 y:14.5 v  1.13 peak:66.5 snr:27.0
point:26 frame:459
07 x  0.26 y:14.7 v  1.20 peak:69.3 snr:29.4
08 x  0.32 y:14.7 v  1.37 peak:65.8 snr:26.3
point:26 frame:460
07 x  2.05 y:14.8 v  1.28 peak:65.1 snr:26.6
point:29 frame:461
07 x  0.33 y:15.0 v  1.27 peak:67.9 snr:28.6
08 x  0.38 y:15.0 v  1.46 peak:66.4 snr:27.4
point:27 frame:462
07 x  0.46 y:15.2 v  0.85 peak:66.5 snr:28.4
08 x  0.40 y:15.2 v  1.45 peak:64.6 snr:25.0
point:29 frame:463
06 x  0.80 y:15.3 v  0.93 peak:67.0 snr:28.9
07 x  0.63 y:15.3 v  1.47 peak:65.9 snr:27.7
point:27 frame:464
07 x  0.38 y:15.4 v  0.82 peak:65.4 snr:25.6
08 x  0.43 y:15.4 v  1.51 peak:64.2 snr:23.7
point:30 frame:465
08 x  0.59 y:15.6 v  0.90 peak:68.5 snr:31.1
09 x  0.54 y:15.6 v  1.53 peak:68.0 snr:29.6
point:32 frame:466
10 x -0.02 y:15.8 v  0.90 peak:69.7 snr:30.9
11 x  0.03 y:15.8 v  1.44 peak:67.4 snr:28.8
point:32 frame:467
11 x  0.01 y:16.0 v  1.02 peak:69.7 snr:30.5
12 x  0.30 y:16.0 v  1.37 peak:66.0 snr:26.9
point:27 frame:468
11 x  0.95 y:16.1 v  1.09 peak:66.1 snr:25.1
12 x  0.61 y:16.1 v  1.45 peak:64.5 snr:25.0
point:28 frame:469
11 x  1.02 y:16.3 v  1.32 peak:69.4 snr:30.5
12 x  1.08 y:16.3 v  1.49 peak:68.2 snr:26.8
point:28 frame:470
11 x  1.44 y:16.2 v  1.29 peak:69.3 snr:30.2
12 x  1.28 y:16.3 v  1.46 peak:67.9 snr:29.2
13 x  1.28 y:16.3 v  1.46 peak:67.9 snr:29.2
point:30 frame:471
11 x  2.38 y:16.5 v  1.42 peak:67.4 snr:28.5
point:25 frame:472
10 x  0.40 y:16.6 v  1.37 peak:67.5 snr:29.4
point:28 frame:473
11 x  1.10 y:16.5 v  1.31 peak:64.2 snr:24.0
12 x  1.35 y:16.6 v  1.49 peak:63.1 snr:24.0
point:26 frame:474
10 x  0.06 y:16.9 v  1.47 peak:66.8 snr:25.6
point:27 frame:475
11 x  0.14 y:17.1 v  1.36 peak:69.9 snr:29.5
12 x  0.00 y:17.1 v  1.46 peak:67.6 snr:28.2
point:23 frame:476
09 x  0.61 y:17.1 v  1.27 peak:64.6 snr:24.3
point:28 frame:477
11 x  0.01 y:17.3 v  1.32 peak:69.7 snr:27.1
12 x  0.05 y:17.3 v  1.39 peak:66.5 snr:26.1
point:30 frame:478
10 x  0.16 y:17.5 v  1.46 peak:68.3 snr:26.9
11 x  0.24 y:17.4 v  1.54 peak:68.4 snr:29.2
point:28 frame:479
10 x  0.30 y:17.6 v  1.34 peak:66.1 snr:23.6
11 x  0.49 y:17.6 v  1.51 peak:65.5 snr:24.5
point:29 frame:480
11 x  0.45 y:17.7 v  1.42 peak:69.6 snr:29.2
12 x  0.34 y:17.7 v  1.44 peak:67.6 snr:29.5
point:27 frame:481
11 x  1.86 y:17.8 v  1.32 peak:66.8 snr:27.2
12 x  1.61 y:17.9 v  1.50 peak:65.9 snr:24.5
point:25 frame:482
11 x  2.63 y:18.2 v  1.35 peak:65.4 snr:24.4
12 x  2.52 y:18.2 v  1.51 peak:64.5 snr:24.8
point:27 frame:483
10 x -1.33 y:18.2 v  1.41 peak:70.2 snr:29.0
11 x -1.62 y:18.1 v  1.49 peak:69.3 snr:30.3
point:25 frame:484
10 x  1.34 y:18.1 v  1.39 peak:66.4 snr:25.5
11 x  1.65 y:18.2 v  1.41 peak:64.3 snr:24.2
point:24 frame:485
10 x  0.73 y:18.5 v  1.29 peak:72.3 snr:31.6
11 x  0.69 y:18.5 v  1.35 peak:67.8 snr:27.7
point:27 frame:486
10 x  1.92 y:18.8 v  1.39 peak:71.1 snr:29.9
11 x  1.89 y:18.8 v  1.36 peak:67.2 snr:28.9
point:27 frame:487
10 x  0.81 y:18.7 v  1.26 peak:67.7 snr:26.8
11 x  0.85 y:18.7 v  1.47 peak:66.3 snr:26.7
point:27 frame:488
11 x  0.27 y:18.9 v  1.33 peak:73.2 snr:32.4
12 x  0.22 y:19.0 v  1.42 peak:70.7 snr:31.6
point:26 frame:489
10 x  0.06 y:19.0 v  1.30 peak:67.9 snr:25.9
11 x -0.10 y:19.0 v  1.46 peak:65.4 snr:24.8
point:30 frame:490
point:30 frame:491
10 x  1.27 y:19.3 v  1.39 peak:68.2 snr:28.3
11 x  1.19 y:19.3 v  1.48 peak:66.9 snr:29.2
point:29 frame:492
point:30 frame:493
10 x -1.61 y:19.5 v  1.25 peak:66.7 snr:26.7
11 x -1.53 y:19.5 v  1.43 peak:64.4 snr:23.8
12 x -1.53 y:19.5 v  1.43 peak:64.4 snr:23.8
point:24 frame:494
10 x  0.46 y:19.7 v  1.18 peak:70.7 snr:32.0
point:24 frame:495
10 x  2.03 y:19.8 v  1.15 peak:67.2 snr:26.4
point:25 frame:496
10 x  1.70 y:19.9 v  1.58 peak:61.9 snr:22.3
point:27 frame:497
10 x  0.39 y:20.1 v  1.19 peak:62.9 snr:23.4
point:22 frame:498
10 x -0.02 y:20.3 v  1.21 peak:66.7 snr:25.7
point:23 frame:499
point:23 frame:500
point:25 frame:501
10 x  1.98 y:20.5 v  1.35 peak:64.4 snr:26.6
11 x  1.72 y:20.5 v  1.48 peak:63.3 snr:24.0
point:23 frame:502
point:22 frame:503
point:27 frame:504
10 x  0.24 y:21.1 v  1.17 peak:64.8 snr:24.7
point:25 frame:505
11 x -1.17 y:21.2 v  0.88 peak:62.7 snr:22.5
12 x -0.18 y:21.2 v  0.88 peak:62.7 snr:22.5
point:25 frame:506
10 x  0.96 y:21.2 v  1.26 peak:62.8 snr:23.4
point:27 frame:507
point:27 frame:508
11 x  0.65 y:21.6 v  1.01 peak:64.4 snr:24.9
12 x  0.56 y:21.6 v  1.52 peak:63.6 snr:23.7
point:30 frame:509
point:28 frame:510
12 x  1.10 y:21.9 v  1.15 peak:64.1 snr:22.3
13 x  1.16 y:21.9 v  1.59 peak:65.3 snr:23.6
point:31 frame:511
12 x  0.98 y:22.1 v  1.10 peak:65.3 snr:25.1
13 x  1.78 y:22.0 v  1.10 peak:65.3 snr:25.1
14 x  1.00 y:22.0 v  1.50 peak:63.9 snr:24.4
15 x  1.85 y:22.0 v  1.50 peak:63.9 snr:24.4
point:27 frame:512
12 x  1.12 y:22.2 v  1.22 peak:64.6 snr:27.1
point:29 frame:513
13 x  0.23 y:22.4 v  1.32 peak:66.1 snr:25.9
point:26 frame:514
point:25 frame:515
10 x  0.44 y:22.7 v  1.39 peak:65.8 snr:24.6
11 x  0.43 y:22.7 v  1.61 peak:67.0 snr:27.3
point:27 frame:516
point:28 frame:517
10 x  0.30 y:23.0 v  1.46 peak:64.1 snr:25.7
11 x  0.02 y:23.0 v  1.55 peak:64.1 snr:25.6
point:25 frame:518
point:23 frame:519
point:26 frame:520
point:25 frame:521
point:27 frame:522
point:27 frame:523
12 x  0.98 y:23.8 v  1.56 peak:61.8 snr:21.8
point:26 frame:524
point:23 frame:525
point:27 frame:526
point:24 frame:527
point:25 frame:528
10 x  0.82 y:24.7 v  1.29 peak:64.5 snr:23.0
11 x  0.77 y:24.7 v  1.53 peak:64.3 snr:25.3
point:23 frame:529
point:25 frame:530
point:23 frame:531
point:23 frame:532
point:24 frame:533
point:25 frame:534
13 x  3.48 y:25.4 v  1.36 peak:66.0 snr:25.9
14 x  4.44 y:25.2 v  1.36 peak:66.0 snr:25.9
point:24 frame:535
point:26 frame:536
point:25 frame:537
13 x  1.51 y:26.0 v  1.47 peak:65.9 snr:27.0
14 x  2.61 y:26.1 v  1.26 peak:67.3 snr:27.6
point:27 frame:538
point:30 frame:539
point:27 frame:540
point:26 frame:541
point:25 frame:542
14 x  1.86 y:26.6 v  1.51 peak:65.1 snr:25.9
point:23 frame:543
point:24 frame:544
point:24 frame:545
12 x  0.54 y:27.1 v  1.59 peak:62.7 snr:21.7
point:22 frame:546
point:21 frame:547
point:22 frame:548
point:23 frame:549
point:28 frame:550
15 x  1.83 y:27.9 v  1.42 peak:65.2 snr:24.8
16 x  1.21 y:27.9 v  1.43 peak:62.9 snr:23.2
17 x  2.31 y:27.8 v  1.43 peak:62.9 snr:23.2
point:28 frame:551
14 x  0.23 y:27.9 v  1.37 peak:62.9 snr:24.5
point:24 frame:552
point:23 frame:553
point:28 frame:554
point:24 frame:555
point:25 frame:556
point:25 frame:557
13 x  1.84 y:28.8 v  1.27 peak:61.7 snr:21.1
point:27 frame:558
15 x -1.49 y:28.7 v  1.34 peak:63.8 snr:23.1
point:28 frame:559
16 x -0.91 y:28.8 v  1.36 peak:64.7 snr:23.9
point:22 frame:560
point:23 frame:561
point:23 frame:562
point:22 frame:563
point:25 frame:564
point:28 frame:565
point:27 frame:566
point:28 frame:567
point:27 frame:568
point:25 frame:569
point:27 frame:570
point:26 frame:571
point:25 frame:572
point:28 frame:573
point:26 frame:574
point:24 frame:575
point:25 frame:576
point:24 frame:577
point:24 frame:578
point:29 frame:579
point:29 frame:580
point:25 frame:581
point:29 frame:582
point:25 frame:583
point:26 frame:584
point:26 frame:585
point:26 frame:586
point:24 frame:587
point:22 frame:588
point:24 frame:589
point:27 frame:590
point:27 frame:591
point:26 frame:592
point:23 frame:593
point:27 frame:594
point:24 frame:595
point:25 frame:596
point:23 frame:597
point:25 frame:598
point:26 frame:599
point:23 frame:600
point:23 frame:601
point:23 frame:602
point:28 frame:603
point:26 frame:604
point:23 frame:605
point:22 frame:606
point:24 frame:607
point:26 frame:608
point:28 frame:609
point:26 frame:610
point:24 frame:611
point:25 frame:612
point:27 frame:613
point:21 frame:614
point:27 frame:615
point:25 frame:616
point:24 frame:617
point:24 frame:618
17 x  0.09 y:37.3 v  1.15 peak:62.9 snr:22.0
point:27 frame:619
point:26 frame:620
point:27 frame:621
point:25 frame:622
point:26 frame:623
point:25 frame:624
point:25 frame:625
point:24 frame:626
point:25 frame:627
point:23 frame:628
point:24 frame:629
point:24 frame:630
point:25 frame:631
point:28 frame:632
point:25 frame:633
point:23 frame:634
point:29 frame:635
point:23 frame:636
point:22 frame:637
point:27 frame:638
18 x  0.63 y:40.2 v  1.49 peak:65.0 snr:23.4
19 x  0.63 y:40.1 v  1.49 peak:65.0 snr:23.4
20 x  0.42 y:40.2 v  1.48 peak:64.0 snr:24.8
point:26 frame:639
point:24 frame:640
point:23 frame:641
point:24 frame:642
point:22 frame:643
point:22 frame:644
point:26 frame:645
19 x -0.39 y:41.2 v  1.33 peak:65.0 snr:22.9
point:24 frame:646
point:24 frame:647
point:24 frame:648
point:25 frame:649
17 x -0.14 y:41.6 v  1.40 peak:63.9 snr:24.0
point:24 frame:650
point:26 frame:651
point:23 frame:652
point:23 frame:653
point:24 frame:654
point:27 frame:655
point:24 frame:656
point:27 frame:657
point:23 frame:658
point:27 frame:659
point:23 frame:660
point:27 frame:661
point:25 frame:662
point:28 frame:663
point:23 frame:664
point:23 frame:665
point:27 frame:666
point:25 frame:667
point:26 frame:668
point:22 frame:669
point:24 frame:670
point:27 frame:671
point:23 frame:672
point:25 frame:673
point:25 frame:674
point:23 frame:675
point:25 frame:676
point:22 frame:677
point:25 frame:678
point:24 frame:679
point:26 frame:680
point:22 frame:681
point:27 frame:682
point:26 frame:683
point:27 frame:684
point:22 frame:685
point:25 frame:686
point:24 frame:687
point:25 frame:688
point:29 frame:689
point:24 frame:690
point:24 frame:691
point:26 frame:692
point:25 frame:693
point:25 frame:694
point:26 frame:695
point:26 frame:696
point:23 frame:697
point:30 frame:698
point:23 frame:699
point:23 frame:700
point:25 frame:701
point:23 frame:702
point:24 frame:703
point:23 frame:704
point:21 frame:705
point:27 frame:706
point:23 frame:707
point:25 frame:708
point:25 frame:709
point:25 frame:710
point:30 frame:711
point:28 frame:712
point:28 frame:713
point:27 frame:714
point:25 frame:715
point:27 frame:716
point:26 frame:717
point:28 frame:718
point:29 frame:719
point:27 frame:720
point:27 frame:721
point:25 frame:722
point:29 frame:723
point:25 frame:724
point:26 frame:725
point:24 frame:726
point:25 frame:727
point:27 frame:728
point:27 frame:729
point:27 frame:730
point:28 frame:731
point:28 frame:732
point:32 frame:733
point:31 frame:734
point:27 frame:735
point:24 frame:736
point:26 frame:737
point:29 frame:738
point:26 frame:739
point:30 frame:740
point:27 frame:741
point:27 frame:742
point:25 frame:743
point:31 frame:744
point:26 frame:745
point:27 frame:746
point:25 frame:747
point:26 frame:748
point:26 frame:749
18 x  0.97 y:40.2 v -1.89 peak:64.5 snr:25.0
point:27 frame:750
point:28 frame:751
point:25 frame:752
point:29 frame:753
point:26 frame:754
point:27 frame:755
point:28 frame:756
point:22 frame:757
point:24 frame:758
point:25 frame:759
point:24 frame:760
point:23 frame:761
16 x  0.20 y:38.2 v -1.78 peak:63.0 snr:22.7
point:21 frame:762
point:20 frame:763
point:23 frame:764
16 x  0.08 y:37.6 v -1.70 peak:64.2 snr:24.2
point:20 frame:765
point:21 frame:766
point:23 frame:767
point:27 frame:768
point:31 frame:769
point:26 frame:770
point:26 frame:771
point:26 frame:772
point:26 frame:773
point:24 frame:774
point:21 frame:775
point:26 frame:776
point:30 frame:777
point:22 frame:778
point:28 frame:779
point:26 frame:780
point:27 frame:781
21 x  0.73 y:34.5 v -1.97 peak:60.2 snr:20.8
22 x -0.19 y:34.5 v -1.94 peak:63.8 snr:23.4
point:25 frame:782
point:25 frame:783
point:28 frame:784
point:26 frame:785
point:28 frame:786
point:27 frame:787
point:31 frame:788
point:25 frame:789
point:25 frame:790
point:26 frame:791
point:32 frame:792
point:25 frame:793
point:25 frame:794
point:26 frame:795
point:27 frame:796
point:24 frame:797
point:27 frame:798
point:23 frame:799
point:21 frame:800
point:19 frame:801
point:23 frame:802
point:21 frame:803
point:16 frame:804
point:18 frame:805
point:19 frame:806
point:17 frame:807
10 x -0.36 y:29.9 v -1.68 peak:63.9 snr:23.6
point:16 frame:808
point:20 frame:809
point:18 frame:810
10 x -1.42 y:29.0 v -1.82 peak:64.7 snr:23.3
11 x -0.34 y:29.1 v -1.82 peak:64.7 snr:23.3
point:18 frame:811
11 x  0.36 y:29.3 v -1.75 peak:62.8 snr:23.5
point:22 frame:812
13 x  1.22 y:28.9 v -1.67 peak:62.3 snr:23.6
point:22 frame:813
point:18 frame:814
09 x  0.27 y:28.7 v -1.57 peak:65.9 snr:24.4
10 x -0.02 y:28.9 v -1.56 peak:65.4 snr:24.0
point:18 frame:815
10 x  0.96 y:28.6 v -1.78 peak:64.0 snr:24.9
point:15 frame:816
point:19 frame:817
point:15 frame:818
point:18 frame:819
point:18 frame:820
point:15 frame:821
point:17 frame:822
point:17 frame:823
point:22 frame:824
14 x  2.98 y:27.0 v -1.65 peak:61.9 snr:22.3
15 x  2.98 y:27.0 v -1.65 peak:61.9 snr:22.3
point:20 frame:825
point:22 frame:826
point:23 frame:827
point:18 frame:828
point:25 frame:829
point:25 frame:830
point:21 frame:831
point:21 frame:832
point:22 frame:833
point:29 frame:834
14 x  0.69 y:25.3 v -1.73 peak:66.2 snr:27.6
15 x  0.75 y:25.3 v -1.44 peak:62.7 snr:24.2
point:22 frame:835
10 x  1.79 y:25.2 v -1.87 peak:65.0 snr:24.8
point:23 frame:836
10 x  1.52 y:25.0 v -1.82 peak:67.8 snr:28.3
point:21 frame:837
point:23 frame:838
10 x  0.22 y:24.6 v -1.73 peak:67.8 snr:28.6
point:21 frame:839
point:22 frame:840
09 x  0.82 y:24.1 v -1.87 peak:64.3 snr:25.7
point:24 frame:841
11 x  0.05 y:24.0 v -1.68 peak:66.3 snr:25.8
point:25 frame:842
10 x -0.94 y:23.9 v -1.53 peak:63.9 snr:23.6
11 x -1.01 y:23.9 v -1.53 peak:63.7 snr:23.2
point:22 frame:843
point:26 frame:844
10 x -0.03 y:23.5 v -1.83 peak:64.3 snr:23.5
point:25 frame:845
10 x -0.13 y:23.3 v -1.89 peak:67.3 snr:28.5
point:26 frame:846
10 x -0.53 y:23.2 v -1.79 peak:65.9 snr:26.1
11 x -0.78 y:23.3 v -1.62 peak:61.8 snr:22.1
point:21 frame:847
09 x  0.40 y:23.0 v -1.61 peak:65.7 snr:24.1
point:24 frame:848
10 x  0.36 y:22.9 v -1.67 peak:65.1 snr:25.8
point:21 frame:849
09 x  0.73 y:22.6 v -1.87 peak:65.4 snr:26.0
point:25 frame:850
12 x -0.85 y:22.5 v -1.79 peak:68.1 snr:26.9
point:32 frame:851
point:25 frame:852
point:29 frame:853
14 x  0.73 y:21.9 v -1.70 peak:63.1 snr:23.1
point:34 frame:854
15 x  0.48 y:21.8 v -1.96 peak:64.7 snr:24.0
16 x -0.36 y:21.8 v -1.88 peak:69.1 snr:27.9
17 x  0.52 y:21.9 v -1.88 peak:69.1 snr:27.9
18 x -0.40 y:21.9 v -1.26 peak:62.1 snr:21.8
point:33 frame:855
15 x  0.11 y:21.7 v -1.86 peak:65.6 snr:26.3
point:28 frame:856
10 x  0.48 y:21.4 v -1.68 peak:65.5 snr:28.3
point:24 frame:857
point:26 frame:858
09 x  0.09 y:21.2 v -1.91 peak:62.3 snr:23.4
10 x -0.12 y:21.2 v -1.78 peak:68.3 snr:29.2
point:26 frame:859
point:29 frame:860
10 x  0.46 y:20.7 v -1.68 peak:64.2 snr:25.4
point:28 frame:861
11 x  0.41 y:20.6 v -1.58 peak:65.2 snr:25.3
12 x  0.51 y:20.6 v -1.37 peak:63.8 snr:23.6
point:29 frame:862
point:29 frame:863
09 x  0.62 y:20.2 v -1.77 peak:64.7 snr:25.5
point:28 frame:864
10 x  0.22 y:20.1 v -1.86 peak:65.5 snr:27.2
point:28 frame:865
09 x -0.37 y:19.9 v -1.75 peak:65.7 snr:24.2
point:27 frame:866
10 x  0.47 y:19.5 v -1.65 peak:64.4 snr:24.2
point:28 frame:867
09 x  0.88 y:19.6 v -1.67 peak:66.5 snr:25.3
10 x  0.81 y:19.6 v -1.41 peak:63.9 snr:22.8
point:26 frame:868
10 x -0.05 y:19.4 v -1.77 peak:66.9 snr:27.5
point:27 frame:869
point:26 frame:870
12 x  0.44 y:19.0 v -1.66 peak:66.5 snr:26.6
point:24 frame:871
point:30 frame:872
10 x  0.27 y:18.7 v -1.58 peak:66.3 snr:27.2
11 x  0.20 y:18.7 v -1.43 peak:65.5 snr:25.3
point:27 frame:873
11 x  0.31 y:18.5 v -1.76 peak:67.6 snr:27.1
point:37 frame:874
13 x  0.08 y:18.4 v -1.83 peak:69.0 snr:29.6
14 x  0.04 y:18.4 v -1.65 peak:63.3 snr:22.0
point:31 frame:875
03 x  2.30 y: 6.3 v -0.73 peak:62.6 snr:22.4
12 x  0.03 y:18.2 v -1.74 peak:67.1 snr:26.6
point:30 frame:876
11 x -0.05 y:18.0 v -1.66 peak:68.7 snr:27.6
12 x  0.09 y:18.0 v -1.56 peak:66.1 snr:26.1
point:36 frame:877
12 x  0.45 y:17.9 v -1.71 peak:68.7 snr:28.7
13 x  0.31 y:17.9 v -1.60 peak:65.4 snr:22.4
point:34 frame:878
13 x  0.18 y:17.7 v -1.84 peak:67.0 snr:26.2
point:35 frame:879
15 x  1.41 y:17.5 v -1.73 peak:65.6 snr:24.2
point:30 frame:880
12 x  0.44 y:17.4 v -1.68 peak:68.6 snr:27.1
13 x  0.61 y:17.4 v -1.59 peak:66.1 snr:24.9
point:29 frame:881
06 x  0.54 y:17.2 v -1.59 peak:65.4 snr:26.2
07 x  0.75 y:17.2 v -1.46 peak:65.0 snr:23.3
point:31 frame:882
10 x  0.54 y:17.0 v -1.54 peak:65.2 snr:25.0
point:30 frame:883
10 x  1.03 y:16.9 v -1.73 peak:67.1 snr:27.3
11 x  1.19 y:16.9 v -1.56 peak:63.4 snr:22.6
point:30 frame:884
09 x -0.34 y:16.7 v -1.85 peak:66.4 snr:27.1
point:28 frame:885
09 x  0.63 y:16.4 v -1.79 peak:65.4 snr:25.2
point:29 frame:886
10 x  0.10 y:16.3 v -1.71 peak:69.9 snr:29.5
11 x  0.15 y:16.3 v -1.43 peak:66.7 snr:24.7
point:28 frame:887
03 x  1.01 y: 4.8 v -1.14 peak:64.4 snr:24.9
04 x  1.17 y: 4.8 v -1.14 peak:64.4 snr:24.9
point:30 frame:888
point:29 frame:889
08 x  0.62 y:15.7 v -1.73 peak:67.7 snr:27.9
09 x  0.22 y:15.7 v -0.88 peak:64.5 snr:24.2
10 x  0.83 y:15.7 v -0.88 peak:64.5 snr:24.2
point:28 frame:890
08 x  1.44 y:15.5 v -1.61 peak:67.5 snr:27.8
09 x  1.05 y:15.6 v -0.89 peak:66.0 snr:25.0
point:28 frame:891
07 x  0.38 y:15.4 v -1.57 peak:67.4 snr:27.4
08 x  0.39 y:15.4 v -0.94 peak:66.9 snr:26.0
point:29 frame:892
06 x  1.25 y:15.3 v -1.63 peak:68.2 snr:27.4
07 x  1.26 y:15.3 v -0.97 peak:66.6 snr:24.7
point:27 frame:893
06 x  0.18 y:15.1 v -1.75 peak:69.4 snr:30.4
07 x  0.20 y:15.1 v -1.41 peak:65.4 snr:24.9
point:31 frame:894
07 x  0.67 y:15.0 v -1.88 peak:64.5 snr:25.2
08 x  0.81 y:15.0 v -1.76 peak:71.4 snr:32.5
09 x  0.76 y:15.0 v -1.46 peak:67.1 snr:27.2
point:28 frame:895
07 x  0.16 y:14.7 v -1.79 peak:67.5 snr:27.5
point:28 frame:896
06 x  1.12 y:14.7 v -1.68 peak:71.1 snr:32.1
07 x  1.12 y:14.7 v -1.39 peak:68.2 snr:28.3
point:29 frame:897
03 x  1.42 y: 3.5 v -0.93 peak:67.1 snr:23.7
07 x  0.49 y:14.4 v -1.66 peak:69.4 snr:30.0
08 x  0.65 y:14.4 v -1.46 peak:66.9 snr:28.5
point:31 frame:898
06 x  0.69 y:14.2 v -1.92 peak:64.8 snr:27.4
07 x  0.61 y:14.2 v -1.84 peak:70.2 snr:30.9
08 x  0.59 y:14.1 v -1.52 peak:64.2 snr:23.1
point:28 frame:899
06 x  0.49 y:14.0 v -1.76 peak:68.8 snr:31.2
point:28 frame:900
06 x  0.33 y:14.0 v -1.88 peak:63.6 snr:24.9
07 x  0.39 y:14.0 v -1.68 peak:71.8 snr:32.8
08 x  0.66 y:14.0 v -1.55 peak:69.3 snr:29.8
09 x  0.66 y:14.0 v -1.55 peak:69.3 snr:29.8
point:28 frame:901
06 x  0.58 y:13.7 v -1.58 peak:70.3 snr:30.4
07 x  0.48 y:13.7 v -1.55 peak:69.5 snr:28.9
point:34 frame:902
06 x  0.08 y:13.6 v -1.69 peak:71.1 snr:32.2
07 x  0.11 y:13.6 v -1.62 peak:67.9 snr:29.0
point:27 frame:903
06 x  0.31 y:13.4 v -1.92 peak:65.3 snr:26.9
07 x  0.39 y:13.4 v -1.81 peak:71.0 snr:32.6
08 x  0.45 y:13.4 v -1.42 peak:65.6 snr:28.1
point:31 frame:904
06 x  0.46 y:13.2 v -1.79 peak:69.7 snr:31.7
07 x  0.79 y:13.2 v -1.36 peak:64.7 snr:25.6
point:30 frame:905
06 x  0.11 y:13.0 v -1.90 peak:64.0 snr:24.2
07 x  0.29 y:13.0 v -1.77 peak:71.0 snr:31.6
08 x  0.38 y:13.0 v -1.44 peak:65.9 snr:25.7
point:29 frame:906
06 x  0.50 y:12.9 v -1.68 peak:70.0 snr:29.9
07 x  0.62 y:12.9 v -1.38 peak:67.2 snr:26.3
point:33 frame:907
02 x  1.34 y: 2.3 v -0.58 peak:64.9 snr:22.3
07 x  0.49 y:12.7 v -1.89 peak:65.5 snr:25.5
08 x  0.48 y:12.7 v -1.77 peak:72.3 snr:32.7
09 x  0.38 y:12.7 v -1.69 peak:67.6 snr:27.0
point:35 frame:908
06 x  0.59 y:12.5 v -1.92 peak:64.9 snr:25.8
07 x  0.59 y:12.5 v -1.92 peak:64.9 snr:25.8
08 x  0.56 y:12.5 v -1.83 peak:70.4 snr:30.8
09 x  0.57 y:12.6 v -1.69 peak:64.5 snr:24.8
point:33 frame:909
00 x  1.42 y: 2.0 v -0.62 peak:67.6 snr:25.1
07 x  0.08 y:12.4 v -1.88 peak:63.9 snr:23.2
08 x  0.18 y:12.4 v -1.73 peak:71.3 snr:30.9
09 x  0.32 y:12.4 v -1.62 peak:67.7 snr:25.9
point:23 frame:910
06 x  0.40 y:12.2 v -1.65 peak:71.1 snr:31.9
07 x  0.61 y:12.2 v -1.53 peak:69.1 snr:28.6
point:24 frame:911
06 x  0.34 y:12.0 v -1.60 peak:72.7 snr:32.9
07 x  0.33 y:12.0 v -1.58 peak:71.4 snr:30.7
point:29 frame:912
07 x  0.51 y:11.9 v -1.88 peak:62.7 snr:25.2
08 x  0.54 y:11.9 v -1.69 peak:71.3 snr:32.2
09 x  0.62 y:11.9 v -1.53 peak:68.1 snr:26.8
point:29 frame:913
06 x  0.31 y:11.6 v -1.92 peak:66.9 snr:28.4
07 x  0.24 y:11.6 v -1.86 peak:71.9 snr:30.6
08 x  0.16 y:11.7 v -1.51 peak:65.5 snr:24.7
09 x  2.67 y:12.0 v -1.79 peak:68.2 snr:26.7
point:35 frame:914
06 x  0.54 y:11.4 v -1.84 peak:71.2 snr:31.7
07 x  0.54 y:11.5 v -1.84 peak:71.2 snr:31.7
08 x  0.48 y:11.4 v -1.64 peak:65.3 snr:26.2
09 x  2.93 y:11.6 v -1.54 peak:65.6 snr:26.4
point:27 frame:915
07 x  0.28 y:11.3 v -1.89 peak:65.6 snr:26.8
08 x  0.14 y:11.3 v -1.75 peak:73.0 snr:34.2
09 x  0.17 y:11.3 v -1.63 peak:68.6 snr:28.4
point:28 frame:916
06 x  0.16 y:11.2 v -1.86 peak:66.2 snr:26.2
07 x  0.59 y:11.2 v -1.86 peak:66.2 snr:26.2
08 x  0.53 y:11.2 v -1.71 peak:73.9 snr:33.4
09 x  0.49 y:11.2 v -1.55 peak:70.7 snr:31.0
point:28 frame:917
07 x  0.30 y:10.9 v -1.90 peak:66.4 snr:27.2
08 x  0.30 y:10.9 v -1.79 peak:72.6 snr:33.0
09 x  0.29 y:10.9 v -1.70 peak:67.5 snr:26.3
point:30 frame:918
06 x  0.42 y:10.8 v -1.78 peak:72.3 snr:32.9
07 x  0.45 y:10.8 v -1.65 peak:67.5 snr:25.5
point:23 frame:919
06 x  0.07 y:10.7 v -1.86 peak:66.1 snr:27.6
07 x  0.21 y:10.6 v -1.72 peak:73.8 snr:33.9
08 x  0.53 y:10.6 v -1.65 peak:70.3 snr:30.3
point:23 frame:920
06 x  0.29 y:10.4 v -1.60 peak:71.3 snr:32.1
07 x  0.13 y:10.4 v -1.56 peak:69.6 snr:28.8
08 x  0.55 y:10.4 v -1.56 peak:69.6 snr:28.8

    Thanks!

  • Hi,

    I will need some time to review this with the sw team. WIll get back to you by end of the week

    thank you

    Cesar

  • Hi Cesar,

        I found that one reason why there are few long-distance point clouds is: in the DPU_Aoa2dProc_process function, among the point clouds selected by cfar, some of the numAzimuthPeaks values obtained after calling the HWA_readCFARPeakCountReg function are 0. This results in the final number of point clouds being less than the number of point clouds selected by cfar. 

        

        I think that for any point cloud selected by cfar, the value of numAzimuthPeaks should be at least 1.

        Could you please  tell me the implementation of HWA_readCFARPeakCountReg function? Are there any parameters that can be adjusted?

        thank you!

  • Hi,

    Thank you for this additional information.

    We have also performed some tests on our side and we have also noticed that the CFAR is not detecting some peaks.

    We are working with development team to root cause this issue and will get back to you as soon as possible

    thank you

    Cesar

  • HI,

    We have identified a bug in the AoA2D.

    Please find upated file. Please replace and re-build the AoA. We have tested the fix and we are now able to detect correctly the points

    Sorry for the delay

    thank you

    Cesar

    /**
     *   @file  aoa2dproc.c
     *
     *   @brief
     *      Implements Data path range gate processing Unit using HWA.
     *
     *  \par
     *  NOTE:
     *      (C) Copyright 2023 Texas Instruments, Inc.
     *
     *  Redistribution and use in source and binary forms, with or without
     *  modification, are permitted provided that the following conditions
     *  are met:
     *
     *    Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     *    Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the
     *    distribution.
     *
     *    Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /**************************************************************************
     *************************** Include Files ********************************
     **************************************************************************/
    
    /* Standard Include Files. */
    #include <stdint.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <string.h>
    #include <stdio.h>
    #include <math.h>
    
    /* mmWave SDK driver/common Include Files */
    #include <common/syscommon.h>
    #include <kernel/dpl/SemaphoreP.h>
    #include <kernel/dpl/CacheP.h>
    #include <kernel/dpl/HeapP.h>
    #include <drivers/edma.h>
    #include <drivers/soc.h>
    #include <drivers/hw_include/hw_types.h>
    
    /* Utils */
    #include <utils/mathutils/mathutils.h>
    
    /* Data Path Include files */
    #include <datapath/dpedma/v0/dpedmahwa.h>
    #include <datapath/dpu/aoa2dproc/v0/aoa2dproc.h>
    #include <datapath/dpu/aoa2dproc/v0/aoa2dprocinternal.h>
    
    /* Flag to check input parameters */
    #define DEBUG_CHECK_PARAMS   1
    
    #define DPU_AOA2DPROC_BANK_0   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[0])
    #define DPU_AOA2DPROC_BANK_1   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[1])
    #define DPU_AOA2DPROC_BANK_2   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[2])
    #define DPU_AOA2DPROC_BANK_3   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[3])
    
    /* HWA ping/pong buffers offset */
    #define DPU_AOA2DPROC_SRC_PING_OFFSET   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[0])
    #define DPU_AOA2DPROC_SRC_PONG_OFFSET   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[1])
    #define DPU_AOA2DPROC_DST_PING_OFFSET   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[2])
    #define DPU_AOA2DPROC_DST_PONG_OFFSET   HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaMemBankAddr[3])
    
    #define DPU_AOA2DPROC_AZIMUTH_OUTPUT_BASE_OFFSET   DPU_AOA2DPROC_BANK_0
    
    
    /**
     * @brief   Detection matrix data format ToDo should be defined in SDK
     */
    #define DPU_AOA2DPROC_DPIF_DETMATRIX_FORMAT_2 2
    
    /* User defined heap memory and handle */
    #define AOA2DPROC_HEAP_MEM_SIZE  (sizeof(DPU_Aoa2dProc_Obj))
    
    static uint8_t gAoa2dProcHeapMem[AOA2DPROC_HEAP_MEM_SIZE] __attribute__((aligned(HeapP_BYTE_ALIGNMENT)));
    
    /*===========================================================
     *                    Internal Functions
     *===========================================================*/
    
    /**
     *  @b Description
     *  @n
     *     The function creates the list of active range gates (the range gates with point-cloud points) with the
     *     number of detected points for each active range gate). This is calculated based on the input list of point-cloud 
     *     points defined as {rangeInd, dopplerInd}, where the list is arranged with range indices rangeInd  in increasing order.
     *      HWA processing completion call back function.
     *  \ingroup    DPU_AOA2D_INTERNAL_FUNCTION
     */
    void aoa2dProc_findRangeGates(DPIF_CFARRngDopDetListElement * detRngDopList, uint32_t numDetectedPoints, DPIF_DetectedRangeGates *rangeGates)
    {
        uint32_t rangeGateIdx = 0;
        uint32_t pointIdx = 0;
        uint32_t maxNumRangeGates = rangeGates->maxNumRangeGates;
        DPIF_DetectedRangeGate *rngGateArray = rangeGates->array;
    
        if (numDetectedPoints == 0)
        {
           goto exit;
        }
    
        /*Set the first range gate */
        rngGateArray[rangeGateIdx].rangeIdx = detRngDopList[pointIdx].rangeIdx;
        rngGateArray[rangeGateIdx].numDopplerBins = 1;
        rangeGateIdx++;
    
        for (int pointIdx = 1; pointIdx < numDetectedPoints; pointIdx++)
        {
           if (detRngDopList[pointIdx].rangeIdx == detRngDopList[pointIdx-1].rangeIdx)
           {
               rngGateArray[rangeGateIdx-1].numDopplerBins++;
           }
           else
           {
               rngGateArray[rangeGateIdx].rangeIdx = detRngDopList[pointIdx].rangeIdx;
               rngGateArray[rangeGateIdx].numDopplerBins = 1;
               rangeGateIdx++;
               if (rangeGateIdx == maxNumRangeGates)
               {
                   break;
               }
           }
        }
    
    exit:
        rangeGates->numRangeGates = rangeGateIdx;
    }
    
    
    /**
     *  @b Description
     *  @n
     *      HWA processing completion call back function.
     *  \ingroup    DPU_AOA2D_INTERNAL_FUNCTION
     */
    static void aoa2dProc_hwaDoneIsrCallback(void * arg)
    {
        if (arg != NULL) {
            SemaphoreP_post((SemaphoreP_Object *)arg);
        }
    }
    
    /**
     *  @b Description
     *  @n
     *      EDMA completion call back function.
     *
     *  @param[in] intrHandle    EDMA Interrupt handle
     *  @param[in] arg           Input argument is pointer to semaphore object
     *
     *  \ingroup    DPU_AOA2D_INTERNAL_FUNCTION
     */
    static void aoa2dProc_edmaDoneIsrCallback(Edma_IntrHandle intrHandle, void *arg)
    {
        if (arg != NULL) {
            SemaphoreP_post((SemaphoreP_Object *)arg);
        }
    }
    
    /**
     *  @b Description
     *  @n
     *      Configures HWA for Doppler processing.
     *
     *  @param[in] obj    - DPU obj
     *  @param[in] cfg    - DPU configuration
     *
     *  \ingroup    DPU_AOA2D_INTERNAL_FUNCTION
     *
     *  @retval error code.
     */
    static inline int32_t aoa2dProc_configHwa
    (
        DPU_Aoa2dProc_Obj      *obj,
        DPU_Aoa2dProc_Config   *cfg
    )
    {
        HWA_ParamConfig         hwaParamCfg;
        uint32_t                paramsetIdx = 0;
        int32_t                 retVal = 0U;
    
        uint32_t                numAntRow, numAntCol;
    
        uint16_t skipOutputDopplerBins;
        uint16_t numAzimuthBins;
        uint16_t guardLen;
        uint16_t winLen;
        uint8_t  noiseDivShift;
        uint32_t hwaMemOffset;
    
    
    
        skipOutputDopplerBins = 0;
    
    #if 0  //ToDo
        /* Check if we have the correct number of paramsets.*/
        if(cfg->hwRes.hwaCfg.numParamSets != (2 * cfg->staticCfg.numTxAntennas + 2))
        {
            retVal = DPU_AOA2DPROC_EHWARES;
            goto exit;
        }
    #endif
    
        numAntRow = cfg->staticCfg.numAntRow;
        numAntCol = cfg->staticCfg.numAntCol;
    
    
        /********************************************************************************/
        /* First HWA loop for Doppler calculation */
        /********************************************************************************/
        /* Currently no scaling in Doppler FFT. */
        obj->dopFftSumDiv = 0; //mathUtils_ceilLog2(cfg->staticCfg.numDopplerBins);
    
        paramsetIdx = cfg->hwRes.hwaCfg.paramSetStartIdx;
    
        obj->dopplerHwaComp.startIdx = (uint16_t) paramsetIdx;
    
        /********************************************************************************/
        /*                    Doppler FFT Configuration                                 */
        /********************************************************************************/
        memset((void*) &hwaParamCfg, 0, sizeof(HWA_ParamConfig));
        hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
        hwaParamCfg.dmaTriggerSrc = cfg->hwRes.hwaCfg.dmaTrigSrcChan;
    
        hwaParamCfg.accelMode = HWA_ACCELMODE_FFT;
        hwaParamCfg.source.srcAddr =  DPU_AOA2DPROC_BANK_0;
        hwaParamCfg.source.srcAcnt = cfg->staticCfg.numBpmDopplerChirps - 1; //size in samples - 1
    
        hwaParamCfg.source.srcAIdx = cfg->staticCfg.numRxAntennas * sizeof(cmplx16ImRe_t);
        hwaParamCfg.source.srcBcnt = cfg->staticCfg.numRxAntennas - 1;
        hwaParamCfg.source.srcBIdx = sizeof(cmplx16ImRe_t);
        hwaParamCfg.source.srcShift = 0;
        hwaParamCfg.source.srcCircShiftWrap = 0;
        hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
        hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_16BIT;
        hwaParamCfg.source.srcSign = HWA_SAMPLES_SIGNED;
        hwaParamCfg.source.srcConjugate = 0; //no conjugate
        hwaParamCfg.source.srcScale = 8;
        hwaParamCfg.source.bpmEnable = 0;
        hwaParamCfg.source.bpmPhase = 0;
    
        hwaParamCfg.dest.dstAddr = DPU_AOA2DPROC_BANK_1;
        hwaParamCfg.dest.dstAcnt = cfg->staticCfg.bpmDopplerFftSize - 1; //this is samples - 1
        hwaParamCfg.dest.dstAIdx = cfg->staticCfg.numRxAntennas * sizeof(cmplx32ImRe_t);
        hwaParamCfg.dest.dstBIdx = sizeof(cmplx32ImRe_t);
        hwaParamCfg.dest.dstRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
        hwaParamCfg.dest.dstWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.dest.dstSign = HWA_SAMPLES_SIGNED;
        hwaParamCfg.dest.dstConjugate = 0; //no conjugate
        hwaParamCfg.dest.dstScale = 8;
        hwaParamCfg.dest.dstSkipInit = skipOutputDopplerBins; //Doppler zero skipped - CLUTTER RMOVAL
    
        hwaParamCfg.accelModeArgs.fftMode.fftEn = 1;
        hwaParamCfg.accelModeArgs.fftMode.fftSize = cfg->staticCfg.log2BpmDopplerFftSize;
    
        /* scaling is disabled in all stages */
        hwaParamCfg.accelModeArgs.fftMode.butterflyScaling = (cfg->staticCfg.bpmDopplerFftSize - 1) >> 5;
    
    
        hwaParamCfg.accelModeArgs.fftMode.interfZeroOutEn = 0; //disabled
        hwaParamCfg.accelModeArgs.fftMode.windowEn = 1;
        hwaParamCfg.accelModeArgs.fftMode.windowStart = cfg->hwRes.hwaCfg.dopplerWindow.winRamOffset;
        hwaParamCfg.accelModeArgs.fftMode.winSymm = cfg->hwRes.hwaCfg.dopplerWindow.winSym;
        hwaParamCfg.accelModeArgs.fftMode.winInterpolateMode = 0;
        hwaParamCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_LOG2_DISABLED;
        hwaParamCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_DEFAULT;
        hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
    
        retVal = HWA_configParamSet(obj->hwaHandle,
                                    paramsetIdx,
                                    &hwaParamCfg, NULL);
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Make sure DMA interrupt/trigger is disabled for this paramset*/
        retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                              paramsetIdx,
                                              HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
        if (retVal != 0)
        {
            goto exit;
        }
        paramsetIdx++;
        obj->dopplerHwaComp.numParams = paramsetIdx - obj->dopplerHwaComp.startIdx;
    
        /********************************************************************************/
        /* Second HWA loop for angle calculation */
        /********************************************************************************/
        if (cfg->staticCfg.angleDimension > 0)
        {
            numAzimuthBins = cfg->staticCfg.azimuthFftSize;
        }
        else
        {
            numAzimuthBins = 1;
        }
    
        /* Save intermediate addresses */
        hwaMemOffset = numAntRow * numAntCol * sizeof(cmplx32ImRe_t);
        if(cfg->staticCfg.angleDimension == 2)
        {
            /* Azimuth and elevation */
            obj->hwaAngleProcOut.azimFftOutPtr = (int32_t *) (obj->hwaMemBankAddr[2] + hwaMemOffset); //Complex output
            obj->hwaAngleProcOut.azimSpectElevIndPtr = (DPIF_HWA_STATS_MaxOutput *) (obj->hwaMemBankAddr[3] + hwaMemOffset);
            hwaMemOffset += numAntRow * numAzimuthBins * sizeof(cmplx32ImRe_t);
            obj->hwaAngleProcOut.azimMaxPeakAzimIndPtr = (DPIF_HWA_STATS_MaxOutput *) (obj->hwaMemBankAddr[2] + hwaMemOffset);
            hwaMemOffset += sizeof(DPIF_HWA_STATS_MaxOutput);
            obj->hwaAngleProcOut.azimPeakList =  (DPIF_HWA_CFAR_DetOutput *) (obj->hwaMemBankAddr[2] + hwaMemOffset);
        }
        else
        {
            /* Azimuth only */
            obj->hwaAngleProcOut.azimFftOutPtr = (int32_t *) (obj->hwaMemBankAddr[2] + hwaMemOffset); //Magnitude output
            obj->hwaAngleProcOut.azimSpectElevIndPtr = NULL;
            obj->hwaAngleProcOut.azimMaxPeakAzimIndPtr = (DPIF_HWA_STATS_MaxOutput *) (obj->hwaMemBankAddr[3] + hwaMemOffset);
            hwaMemOffset += sizeof(DPIF_HWA_STATS_MaxOutput);
            obj->hwaAngleProcOut.azimPeakList =  (DPIF_HWA_CFAR_DetOutput *) (obj->hwaMemBankAddr[3] + hwaMemOffset);
        }
    
        obj->angleHwaComp.startIdx = (uint16_t) paramsetIdx;
        /********************************************************************************/
        /*                    Rx channel phase compensation                             */
        /********************************************************************************/
        memset((void*) &hwaParamCfg, 0, sizeof(HWA_ParamConfig));
        hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
        hwaParamCfg.dmaTriggerSrc = 0;
    
        hwaParamCfg.accelMode = HWA_ACCELMODE_FFT;
        hwaParamCfg.source.srcAddr =  DPU_AOA2DPROC_BANK_2;
        hwaParamCfg.source.srcAcnt = (numAntRow * numAntCol) -1;
    
        hwaParamCfg.source.srcAIdx = sizeof(cmplx32ImRe_t);
        hwaParamCfg.source.srcBcnt = 1 - 1;
        hwaParamCfg.source.srcBIdx = 0;
        hwaParamCfg.source.srcShift = 0;
        hwaParamCfg.source.srcCircShiftWrap = 0;
        hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
        hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.source.srcSign = HWA_SAMPLES_SIGNED;
        hwaParamCfg.source.srcConjugate = 0;
        hwaParamCfg.source.srcScale = 0;
        hwaParamCfg.source.bpmEnable = 0;
        hwaParamCfg.source.bpmPhase = 0;
    
        hwaParamCfg.dest.dstAddr = DPU_AOA2DPROC_BANK_3;
        hwaParamCfg.dest.dstAcnt = (numAntRow * numAntCol) - 1; //this is samples - 1
        hwaParamCfg.dest.dstAIdx = sizeof(cmplx32ImRe_t);
        hwaParamCfg.dest.dstBIdx = 0;
        hwaParamCfg.dest.dstRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
        hwaParamCfg.dest.dstWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.dest.dstSign = HWA_SAMPLES_SIGNED;
        hwaParamCfg.dest.dstConjugate = 0;
        hwaParamCfg.dest.dstScale = 8;
    
        hwaParamCfg.accelModeArgs.fftMode.fftEn = 0;
        hwaParamCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_LOG2_DISABLED;
        hwaParamCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_DEFAULT;
    #if 1
        hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_VECTOR_MULT;
    #else//ToDo REMOVE_THIS just for HWA verification
        hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_FREQ_SHIFTER;
        hwaParamCfg.complexMultiply.cmpMulArgs.twidIncrement = 455;
    #endif
        retVal = HWA_configParamSet(obj->hwaHandle,
                                    paramsetIdx,
                                    &hwaParamCfg, NULL);
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Make sure DMA interrupt/trigger is disabled for this paramset*/
        retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                              paramsetIdx,
                                              HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
        if (retVal != 0)
        {
            goto exit;
        }
        paramsetIdx++;
    
    
        /***************************************************************/
        /******************* Configure Azimuth FFT *********************/
        /***************************************************************/
        memset( (void*) &hwaParamCfg, 0, sizeof(hwaParamCfg));
        hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
        hwaParamCfg.dmaTriggerSrc = 0;
    
        hwaParamCfg.source.srcAddr = DPU_AOA2DPROC_BANK_3;
        hwaParamCfg.source.srcAcnt = numAntCol - 1;
        hwaParamCfg.source.srcAIdx = sizeof(cmplx32ImRe_t);
        hwaParamCfg.source.srcBIdx = numAntCol * sizeof(cmplx32ImRe_t);
        hwaParamCfg.source.srcBcnt = (numAntRow) - 1;
        hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
        hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.source.srcSign = HWA_SAMPLES_SIGNED;
        hwaParamCfg.source.srcConjugate = 0; //no conjugate
        hwaParamCfg.source.srcScale = 0;
    
        hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
        if (numAzimuthBins > 1)
        {
            hwaParamCfg.accelModeArgs.fftMode.fftEn = HWA_FEATURE_BIT_ENABLE;
        }
        else
        {
            hwaParamCfg.accelModeArgs.fftMode.fftEn = HWA_FEATURE_BIT_DISABLE;
        }
        hwaParamCfg.accelModeArgs.fftMode.fftSize = mathUtils_ceilLog2(numAzimuthBins);//assumes power of 2;
        hwaParamCfg.accelModeArgs.fftMode.windowEn = 1; //Azimuth and elavation share FFT window. Window is 1,-1,1,-1... to achieve "fffshift" in spectral domain
        hwaParamCfg.accelModeArgs.fftMode.windowStart = cfg->hwRes.hwaCfg.angleWindow.winRamOffset;
        hwaParamCfg.accelModeArgs.fftMode.winSymm = cfg->hwRes.hwaCfg.angleWindow.winSym;
        hwaParamCfg.accelModeArgs.fftMode.butterflyScaling = 0; //ToDo Tweak this
        hwaParamCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_DEFAULT;
    
        if (cfg->staticCfg.angleDimension == 2)
        {
            /*With Elevation*/
            hwaParamCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_LOG2_DISABLED;
            hwaParamCfg.dest.dstAddr =  HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimFftOutPtr); //DPU_AOA2DPROC_BANK_2 + (numAntRow + numAntCol * sizeof(cmplx32ImRe_t));
            hwaParamCfg.dest.dstAcnt = numAzimuthBins - 1;
            hwaParamCfg.dest.dstAIdx = sizeof(cmplx32ImRe_t);
            hwaParamCfg.dest.dstBIdx = numAzimuthBins * sizeof(cmplx32ImRe_t);
            hwaParamCfg.dest.dstSign = HWA_SAMPLES_SIGNED;
            hwaParamCfg.dest.dstRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
            hwaParamCfg.dest.dstWidth = HWA_SAMPLES_WIDTH_32BIT;
        }
        else
        {
            /*No Elevation*/
            hwaParamCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_ONLY_ENABLED;
            hwaParamCfg.dest.dstAddr =  HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimFftOutPtr); //DPU_AOA2DPROC_BANK_2 + (numAntRow + numAntCol * sizeof(cmplx32ImRe_t));
            hwaParamCfg.dest.dstAcnt = numAzimuthBins - 1;
            hwaParamCfg.dest.dstAIdx = sizeof(uint32_t);
            hwaParamCfg.dest.dstBIdx = numAzimuthBins * sizeof(uint32_t);
            hwaParamCfg.dest.dstSign = HWA_SAMPLES_UNSIGNED;
            hwaParamCfg.dest.dstRealComplex = HWA_SAMPLES_FORMAT_REAL;
            hwaParamCfg.dest.dstWidth = HWA_SAMPLES_WIDTH_32BIT;
        }
    
    
        hwaParamCfg.dest.dstConjugate = 0; //no conjugate
        hwaParamCfg.dest.dstScale = 8;
    
        retVal = HWA_configParamSet(obj->hwaHandle, paramsetIdx, &hwaParamCfg, NULL);
        if (retVal != 0)
        {
          goto exit;
        }
        retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                              paramsetIdx,
                                              HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
        if (retVal != 0)
        {
          goto exit;
        }
    
        paramsetIdx++;
    
    
        if(cfg->staticCfg.angleDimension == 2)
        {
            /*****************************************************************/
            /******************* Configure Elevation FFT *********************/
            /*****************************************************************/
            memset( (void*) &hwaParamCfg, 0, sizeof(hwaParamCfg));
    
            hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
            hwaParamCfg.dmaTriggerSrc = 0;
    
            hwaParamCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimFftOutPtr); //DPU_AOA2DPROC_BANK_2  + (numAntRow + numAntCol * sizeof(cmplx32ImRe_t));
            hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_32BIT;
            hwaParamCfg.source.srcAcnt = numAntRow - 1;
            hwaParamCfg.source.srcBcnt = numAzimuthBins - 1;
            hwaParamCfg.source.srcAIdx = numAzimuthBins * sizeof(cmplx32ImRe_t);
            hwaParamCfg.source.srcBIdx = sizeof(cmplx32ImRe_t);
            hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_COMPLEX;
            hwaParamCfg.source.srcSign = HWA_SAMPLES_SIGNED;
            hwaParamCfg.source.srcConjugate = 0; //no conjugate
            hwaParamCfg.source.srcScale = 0;
    
            hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
            hwaParamCfg.accelModeArgs.fftMode.fftEn = 1;
            hwaParamCfg.accelModeArgs.fftMode.fftSize = mathUtils_ceilLog2(cfg->staticCfg.elevationFftSize);//assumes power of 2;
            hwaParamCfg.accelModeArgs.fftMode.windowEn = 1;   //Azimuth and elavation share FFT window. Window is 1,-1,1,-1... to achieve "fffshift" in spectral domain
            hwaParamCfg.accelModeArgs.fftMode.windowStart = cfg->hwRes.hwaCfg.angleWindow.winRamOffset;
            hwaParamCfg.accelModeArgs.fftMode.winSymm = cfg->hwRes.hwaCfg.angleWindow.winSym;
            hwaParamCfg.accelModeArgs.fftMode.butterflyScaling = 0; //ToDo Tweak this
            hwaParamCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_MAX_STATS;
            hwaParamCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_ONLY_ENABLED;
    
            hwaParamCfg.dest.dstAddr =  HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimSpectElevIndPtr); //(uint16_t) DPU_AOA2DPROC_BANK_3 + 0x100;//ToDo REMOVE_OFFSET;
            hwaParamCfg.dest.dstAcnt = 4095;    //HWA user guide recommendation
            hwaParamCfg.dest.dstAIdx = 8;       //HWA user guide recommendation
            hwaParamCfg.dest.dstBIdx = 8;       //HWA user guide recommendation
            hwaParamCfg.dest.dstRealComplex = 0;//HWA user guide recommendation
            hwaParamCfg.dest.dstWidth = 1;      //HWA user guide recommendation
            hwaParamCfg.dest.dstConjugate = 0;  //no conjugate
            hwaParamCfg.dest.dstScale = 8;
            hwaParamCfg.dest.dstSign = HWA_SAMPLES_UNSIGNED;
    
    
            retVal = HWA_configParamSet(obj->hwaHandle, paramsetIdx, &hwaParamCfg, NULL);
            if (retVal != 0)
            {
              goto exit;
            }
            retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                                  paramsetIdx,
                                                  HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
            if (retVal != 0)
            {
            goto exit;
            }
            paramsetIdx++;
        }
    
    
        /**********************************************************************/
        /* Single Maximum in azimuth dimension (need for side lobe threshold) */
        /**********************************************************************/
        memset( (void*) &hwaParamCfg, 0, sizeof(hwaParamCfg));
    
        hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
        hwaParamCfg.dmaTriggerSrc = 0;
    
        if(cfg->staticCfg.angleDimension == 2)
        {
            hwaParamCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimSpectElevIndPtr) + sizeof(uint32_t); //DPU_AOA2DPROC_BANK_3 + sizeof(uint32_t)  + (numAntRow + numAntCol * sizeof(cmplx32ImRe_t)); //point to second element i.e. peak value. (the first is elevation index)
            hwaParamCfg.source.srcAIdx = sizeof(DPU_Aoa2dProc_HwaMaxOutput);
        }
        else
        {
            hwaParamCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimFftOutPtr); //DPU_AOA2DPROC_BANK_2  + (numAntRow + numAntCol * sizeof(cmplx32ImRe_t)); //point to second element i.e. peak value. (the first is elevation index)
            hwaParamCfg.source.srcAIdx = sizeof(uint32_t);
        }
        hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.source.srcAcnt = numAzimuthBins - 1;
        hwaParamCfg.source.srcBcnt = 1 - 1;
        hwaParamCfg.source.srcBIdx = 0;
        hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_REAL;
        hwaParamCfg.source.srcSign = HWA_SAMPLES_UNSIGNED;
        hwaParamCfg.source.srcConjugate = 0; //no conjugate
        hwaParamCfg.source.srcScale = 0;
    
        hwaParamCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
        hwaParamCfg.accelModeArgs.fftMode.fftEn = 0;
        hwaParamCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_MAX_STATS;
        hwaParamCfg.dest.dstAddr =  HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimMaxPeakAzimIndPtr);//(uint16_t) DPU_AOA2DPROC_BANK_2 + 0x2000;
    
        hwaParamCfg.dest.dstAcnt = 4095;    //HWA user guide recommendation
        hwaParamCfg.dest.dstAIdx = 8;       //HWA user guide recommendation
        hwaParamCfg.dest.dstBIdx = 8;       //HWA user guide recommendation
        hwaParamCfg.dest.dstRealComplex = 0;//HWA user guide recommendation
        hwaParamCfg.dest.dstWidth = 1;      //HWA user guide recommendation
        hwaParamCfg.dest.dstConjugate = 0;  //no conjugate
        hwaParamCfg.dest.dstScale = 8;
        hwaParamCfg.dest.dstSign = HWA_SAMPLES_UNSIGNED;
    
        retVal = HWA_configParamSet(obj->hwaHandle, paramsetIdx, &hwaParamCfg, NULL);
        if (retVal != 0)
        {
          goto exit;
        }
        retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                              paramsetIdx,
                                              HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
        if (retVal != 0)
        {
        goto exit;
        }
        paramsetIdx++;
    
    
        /*****************************************************************/
        /******** Configure CFAR to pickup maxima                *********/
        /*****************************************************************/
        memset( (void*) &hwaParamCfg, 0, sizeof(hwaParamCfg));
        hwaParamCfg.triggerMode = HWA_TRIG_MODE_IMMEDIATE;
        hwaParamCfg.dmaTriggerSrc = 0;
    
        //Cyclic mode
        guardLen = 0;
        winLen = 2;
        noiseDivShift = 2;
        hwaParamCfg.source.srcAcnt = (numAzimuthBins - 1) + (guardLen + winLen) + (guardLen + winLen);
        hwaParamCfg.source.srcShift = numAzimuthBins - (guardLen + winLen);
        hwaParamCfg.source.srcCircShiftWrap = mathUtils_floorLog2(numAzimuthBins);
    
        if (cfg->staticCfg.angleDimension == 2)
        {
            hwaParamCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimSpectElevIndPtr) + sizeof(uint32_t); //DPU_AOA2DPROC_BANK_3 + sizeof(uint32_t) + 0x100;//ToDo REMOVE_OFFSET;
            hwaParamCfg.source.srcAIdx = sizeof(DPU_Aoa2dProc_HwaMaxOutput);
        }
        else
        {
            hwaParamCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimFftOutPtr); //DPU_AOA2DPROC_BANK_2;
            hwaParamCfg.source.srcAIdx = sizeof(uint32_t);
        }
        hwaParamCfg.source.srcBIdx = 0;
        hwaParamCfg.source.srcBcnt = 1  - 1;
        hwaParamCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_REAL;
        hwaParamCfg.source.srcWidth = HWA_SAMPLES_WIDTH_32BIT;
        hwaParamCfg.source.srcSign = HWA_SAMPLES_UNSIGNED;
        hwaParamCfg.source.srcConjugate = 0;
        hwaParamCfg.source.srcScale = 0;
    
        hwaParamCfg.accelMode = HWA_ACCELMODE_CFAR;
        hwaParamCfg.accelModeArgs.cfarMode.operMode = HWA_CFAR_OPER_MODE_MAG_INPUT_REAL;
        hwaParamCfg.accelModeArgs.cfarMode.peakGroupEn = HWA_FEATURE_BIT_ENABLE;
        hwaParamCfg.accelModeArgs.cfarMode.numGuardCells = guardLen;
        hwaParamCfg.accelModeArgs.cfarMode.nAvgDivFactor = noiseDivShift;
        hwaParamCfg.accelModeArgs.cfarMode.cyclicModeEn = HWA_FEATURE_BIT_ENABLE;
        hwaParamCfg.accelModeArgs.cfarMode.nAvgMode = HWA_NOISE_AVG_MODE_CFAR_CA;
        hwaParamCfg.accelModeArgs.cfarMode.numNoiseSamplesRight = winLen >> 1;
        hwaParamCfg.accelModeArgs.cfarMode.numNoiseSamplesLeft =  winLen >> 1;
        hwaParamCfg.accelModeArgs.cfarMode.outputMode = HWA_CFAR_OUTPUT_MODE_I_PEAK_IDX_Q_CUT;
    
        hwaParamCfg.dest.dstAddr =  HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(obj->hwaAngleProcOut.azimPeakList); // (uint16_t) DPU_AOA2DPROC_BANK_2 + 0x2008; //ToDo REEMOVE_OFFSET
    
        hwaParamCfg.dest.dstAcnt = 4095;    //HWA user guide recommendation
        hwaParamCfg.dest.dstAIdx = 8;       //HWA user guide recommendation
        hwaParamCfg.dest.dstBIdx = 8;       //HWA user guide recommendation
        hwaParamCfg.dest.dstRealComplex = 0;//HWA user guide recommendation
        hwaParamCfg.dest.dstWidth = 1;      //HWA user guide recommendation
        hwaParamCfg.dest.dstConjugate = 0;  //no conjugate
        hwaParamCfg.dest.dstScale = 8;
    
        retVal = HWA_configParamSet(obj->hwaHandle, paramsetIdx, &hwaParamCfg, NULL);
        if (retVal != 0)
        {
          goto exit;
        }
        retVal = HWA_disableParamSetInterrupt(obj->hwaHandle,
                                              paramsetIdx,
                                              HWA_PARAMDONE_INTERRUPT_TYPE_DMA | HWA_PARAMDONE_INTERRUPT_TYPE_CPU);
        if (retVal != 0)
        {
          goto exit;
        }
    
        paramsetIdx++;
        obj->angleHwaComp.numParams = (uint16_t) paramsetIdx - obj->angleHwaComp.startIdx;
    
    exit:
        return(retVal);
     }
    
    /**
     *  @b Description
     *  @n
     *  EDMA configuration.
     *
     *  @param[in] obj    - DPU obj
     *  @param[in] cfg    - DPU configuration
     *
     *  \ingroup    DPU_AOA2D_INTERNAL_FUNCTION
     *
     *  @retval EDMA error code, see EDMA API.
     */
    static inline int32_t aoa2dProc_configEdma
    (
        DPU_Aoa2dProc_Obj      *obj,
        DPU_Aoa2dProc_Config   *cfg
    )
    {
        int32_t             retVal = SystemP_SUCCESS;
        cmplx16ImRe_t       *radarCubeBase = (cmplx16ImRe_t *)cfg->hwRes.radarCube.data;
        int16_t             sampleLenInBytes = sizeof(cmplx16ImRe_t);
        DPEDMA_ChainingCfg  chainingCfg;
        DPEDMA_syncABCfg    syncABCfg;
        bool isTransferCompletionEnabled;
        Edma_EventCallback transferCompletionCallbackFxn;
        void* transferCompletionCallbackFxnArg;
    
        if(obj == NULL)
        {
            retVal = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }
    
        /*****************************************************************************************/
        /**************                     PROGRAM DMA INPUT                    *****************/
        /*****************************************************************************************/
        chainingCfg.chainingChan                  = cfg->hwRes.edmaCfg.edmaIn.channel;
        chainingCfg.isIntermediateChainingEnabled = false;
        chainingCfg.isFinalChainingEnabled        = false;
    
        isTransferCompletionEnabled = true;
        transferCompletionCallbackFxn = aoa2dProc_edmaDoneIsrCallback;
        transferCompletionCallbackFxnArg = (void *)&(obj->edmaDoneSemaHandle);
    
        syncABCfg.srcAddress  = (uint32_t)(&radarCubeBase[0]); //This is temporary, it will be reloaded on the fly
        syncABCfg.destAddress = (uint32_t) cfg->hwRes.hwaCfg.hwaMemInpAddr;
        syncABCfg.aCount      = sampleLenInBytes;
        syncABCfg.bCount      = cfg->staticCfg.numRxAntennas * cfg->staticCfg.bpmDopplerFftSize;
        syncABCfg.cCount      = 1;
        syncABCfg.srcBIdx     = cfg->staticCfg.numRangeBins * sampleLenInBytes;
        syncABCfg.srcCIdx     = 0;
        syncABCfg.dstBIdx     = sampleLenInBytes;
        syncABCfg.dstCIdx     = 0;
    
        retVal = DPEDMA_configSyncAB(cfg->hwRes.edmaCfg.edmaHandle,
                                     &cfg->hwRes.edmaCfg.edmaIn,
                                     &chainingCfg,
                                     &syncABCfg,
                                     false,//isEventTriggered
                                     false, //isIntermediateTransferCompletionEnabled
                                     isTransferCompletionEnabled,
                                     transferCompletionCallbackFxn,
                                     transferCompletionCallbackFxnArg,
                                     cfg->hwRes.edmaCfg.intrObj);
    
        if (retVal != SystemP_SUCCESS)
        {
            goto exit;
        }
    
    exit:
        return(retVal);
    } 
    
    /*===========================================================
     *                    Doppler Proc External APIs
     *===========================================================*/
    
    /**
     *  @b Description
     *  @n
     *      dopplerProc DPU init function. It allocates memory to store
     *  its internal data object and returns a handle if it executes successfully.
     *
     *  @param[in]   initCfg Pointer to initial configuration parameters
     *  @param[out]  errCode Pointer to errCode generates by the API
     *
     *  \ingroup    DPU_AOA2DPROC_EXTERNAL_FUNCTION
     *
     *  @retval
     *      Success     - valid handle
     *  @retval
     *      Error       - NULL
     */
    DPU_Aoa2dProc_Handle DPU_Aoa2dProc_init
    (
        DPU_Aoa2dProc_InitParams *initCfg,
        int32_t                    *errCode
    )
    {
        DPU_Aoa2dProc_Obj  *obj = NULL;
        HWA_MemInfo             hwaMemInfo;
        uint32_t                i;
        int32_t                 status = SystemP_SUCCESS;
    
        *errCode       = 0;
        
        if((initCfg == NULL) || (initCfg->hwaHandle == NULL))
        {
            *errCode = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }    
    
        /* Allocate memory */
        obj = (DPU_Aoa2dProc_Obj*)&gAoa2dProcHeapMem;
        if(obj == NULL)
        {
            *errCode = DPU_AOA2DPROC_ENOMEM;
            goto exit;
        }
    
        /* Initialize memory */
        memset((void *)obj, 0U, sizeof(DPU_Aoa2dProc_Obj));
        
        // RPMF printf("AOA2D DPU: (DPU_Aoa2dProc_Obj *) 0x%08x\n", (uint32_t) obj);
    
        /* Save init config params */
        obj->hwaHandle   = initCfg->hwaHandle;
    
        /* Create DPU semaphores */
        status = SemaphoreP_constructBinary(&obj->edmaDoneSemaHandle, 0);
        if(SystemP_SUCCESS != status)
        {
            *errCode = DPU_AOA2DPROC_ESEMA;
            goto exit;
        }
    
        status = SemaphoreP_constructBinary(&obj->hwaDoneSemaHandle, 0);
        if(SystemP_SUCCESS != status)
        {
            *errCode = DPU_AOA2DPROC_ESEMA;
            goto exit;
        }
    
        /* Populate HWA base addresses and offsets. This is done only once, at init time.*/
        *errCode =  HWA_getHWAMemInfo(obj->hwaHandle, &hwaMemInfo);
        if (*errCode < 0)
        {       
            goto exit;
        }
        
        /* check if we have enough memory banks*/
        if(hwaMemInfo.numBanks < DPU_AOA2DPROC_NUM_HWA_MEMBANKS)
        {    
            *errCode = DPU_AOA2DPROC_EHWARES;
            goto exit;
        }
        
        for (i = 0; i < DPU_AOA2DPROC_NUM_HWA_MEMBANKS; i++)
        {
            obj->hwaMemBankAddr[i] = hwaMemInfo.baseAddress + i * hwaMemInfo.bankSize;
        }
        
    exit:    
    
        if(*errCode < 0)
        {
            if(obj != NULL)
            {
                obj = NULL;
            }
        }
       return ((DPU_Aoa2dProc_Handle)obj);
    }
    
    void aoa2dProc_mapRxChanCompensationCoefs(DPU_Aoa2dProc_Config    *cfg, cmplx32ImRe_t *rxChCompVirtArray)
    {
        uint16_t src, dst;
        int32_t i, k;
        int32_t scale;
        cmplx32ImRe_t *rxChPhaseComp = (cmplx32ImRe_t *) &cfg->staticCfg.compRxChanCfg.rxChPhaseComp;
        int32_t numParam = cfg->hwRes.hwaCfg.aoa2dRngGateCfg.numDopFftParams;
        DPU_Aoa2dProc_HWA_Doppler_Fft_Cfg *paramCfg = cfg->hwRes.hwaCfg.aoa2dRngGateCfg.dopFftCfg;
    
        for (i=0; i < numParam; i++)
        {
            for (k=0; k < paramCfg[i].srcBcnt; k++)
            {
                src = paramCfg[i].srcAddrOffset + k * paramCfg[i].srcBidx;
                dst = paramCfg[i].dstAddrOffset + k * paramCfg[i].dstBidx;
                scale = paramCfg[i].scale;
                rxChCompVirtArray[dst].real = scale * rxChPhaseComp[src].real;
                rxChCompVirtArray[dst].imag = scale * rxChPhaseComp[src].imag;
            }
        }
    }
    
    /**
     *  @b Description
     *  @n  Convert angle Fov to number of skipped indices.
     *
     *  \ingroup    DPU_CFARPROC_INTERNAL_FUNCTION
     *
     *
     * @param[in]  angle Angle in radians
     *
     * @param[in]  fftSize Angle FFT size
     *
     * @param[in]  skipFromLeft true: return number of skipped bins from left, false: return number of skipped bins from right
     *
     * @param[out]  skipBins Number of skipped bins from left or right side
     *
     */
    int16_t  aoa2dProc_ConvertFovToIdx(float angle, uint16_t fftSize, bool skipFromLeft)
    {
    #define PI_OVER_180 0.01745329252
    
        float temp;
        int32_t ind;
        int16_t numSkippedBins;
    
        temp = fftSize/2 * sin(angle * PI_OVER_180);
        if(temp < 0)
        {
            ind = (int32_t) (temp - 0.5);
        }
        else
        {
            ind = (int32_t) (temp + 0.5);
        }
    
        if(skipFromLeft)
        {
            numSkippedBins = fftSize/2 + ind;
            if (numSkippedBins < 1)
            {
                numSkippedBins = 1;
            }
        }
        else
        {
            numSkippedBins = fftSize/2 - 1 - ind;
            if (numSkippedBins < 0)
            {
                numSkippedBins = 0;
            }
        }
    
        return numSkippedBins;
    }
    
    /**
     *  @b Description
     *  @n  Convert angle field of view to indices
     *
     *  \ingroup    DPU_AOA2DPROC_INTERNAL_FUNCTION
     *
     *
     * @param[in]  fovAoaCfg Field of view configuration
     *
     * @param[in]  azimuthFftSize Azimuth FFT size
     *
     * @param[in]  elevationFftSize Elevation FFT size
     *
     * @param[out] detectionCfg detection configuration
     *
     */
    void aoa2dProc_ConfigAoaFov(DPU_Aoa2dProc_AoaFovCfg *fovAoaCfg,
                                      uint16_t azimuthFftSize,
                                      uint16_t elevationFftSize,
                                      DPU_Aoa2dProc_detectionCfg *detectionCfg)
    {
    
        detectionCfg->skipLeftAzim = aoa2dProc_ConvertFovToIdx(fovAoaCfg->minAzimuthDeg, azimuthFftSize, true);
        detectionCfg->skipRightAzim = aoa2dProc_ConvertFovToIdx(fovAoaCfg->maxAzimuthDeg, azimuthFftSize, false);
    
        detectionCfg->skipLeftElev = aoa2dProc_ConvertFovToIdx(fovAoaCfg->minElevationDeg, elevationFftSize, true);
        detectionCfg->skipRightElev = aoa2dProc_ConvertFovToIdx(fovAoaCfg->maxElevationDeg, elevationFftSize, false);
    }
    
    
    /**
      *  @b Description
      *  @n
      *   AOA2D DPU configuration
      *
      *  @param[in]   handle     DPU handle.
      *  @param[in]   cfg        Pointer to configuration parameters.
      *
      *  \ingroup    DPU_AOA2DPROC_EXTERNAL_FUNCTION
      *
      *  @retval
      *      Success      = 0
      *  @retval
      *      Error       != 0 @ref DPU_DOPPLERPROC_ERROR_CODE
      */
    int32_t DPU_Aoa2dProc_config
    (
        DPU_Aoa2dProc_Handle    handle,
        DPU_Aoa2dProc_Config    *cfg
    )
    {
        DPU_Aoa2dProc_Obj   *obj;
        int32_t                  retVal = 0;
        cmplx32ImRe_t rxChComp[DPU_AOA2D_PROC_MAX_2D_ANT_ARRAY_ELEMENTS];
    
    
        obj = (DPU_Aoa2dProc_Obj *)handle;
        if(obj == NULL)
        {
            retVal = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }
    
    #if 0
        if (cfg->staticCfg.angleDimension == 2)
        {
            numAzimuthBins = cfg->staticCfg.azimuthFftSize;
            numElevationBins = cfg->staticCfg.elevationFftSize;
        }
        else if (cfg->staticCfg.angleDimension == 1)
        {
            numAzimuthBins = cfg->staticCfg.azimuthFftSize;
            numElevationBins = 1;
        }
        else
        {
            numAzimuthBins = 1;
            numElevationBins = 1;
        }
    #endif
        
    #if DEBUG_CHECK_PARAMS
        /* Validate params */
        if(!cfg ||
           !cfg->hwRes.edmaCfg.edmaHandle ||
           !cfg->hwRes.hwaCfg.angleWindow.window ||
           !cfg->hwRes.hwaCfg.dopplerWindow.window ||
           !cfg->hwRes.radarCube.data
          )
        {
            retVal = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }
    
        /* Check if radar cube format is supported by DPU*/
        if(cfg->hwRes.radarCube.datafmt != DPIF_RADARCUBE_FORMAT_6)
        {
            retVal = DPU_AOA2DPROC_ECUBEFORMAT;
            goto exit;
        }
    
        obj->radarCube = cfg->hwRes.radarCube;
    
        /* Check if radar cube column fits into one HWA memory bank */
        if((cfg->staticCfg.numTxAntennas * cfg->staticCfg.numRxAntennas * 
            cfg->staticCfg.numDopplerChirps * sizeof(cmplx16ImRe_t)) > (SOC_HWA_MEM_SIZE/SOC_HWA_NUM_MEM_BANKS))
        {
            retVal = DPU_AOA2DPROC_EEXCEEDHWAMEM;
            goto exit;
        }
    
    
    #endif
    
        /* Save necessary parameters to DPU object that will be used during Process time */
        /* EDMA parameters needed to trigger first EDMA transfer*/
        obj->edmaHandle  = cfg->hwRes.edmaCfg.edmaHandle;
        memcpy((void*)(&obj->edmaIn), (void *)(&cfg->hwRes.edmaCfg.edmaIn), sizeof(DPEDMA_ChanCfg));
        
        /* Convert FOV to FFT indices */
        aoa2dProc_ConfigAoaFov(cfg->staticCfg.fovAoaCfg,
                                   cfg->staticCfg.azimuthFftSize,
                                   cfg->staticCfg.elevationFftSize,
                                   &obj->detectionCfg);
    
    
    
        /* Copy antenna mapping table */
        obj->aoa2dRngGateCfg = cfg->hwRes.hwaCfg.aoa2dRngGateCfg;
    
        /* Disable the HWA */
        retVal = HWA_enable(obj->hwaHandle, 0); 
        if (retVal != 0)
        {
            goto exit;
        }
        
        /* HWA Doppler FFT window configuration */
        retVal = HWA_configRam(obj->hwaHandle,
                               HWA_RAM_TYPE_WINDOW_RAM,
                               (uint8_t *)cfg->hwRes.hwaCfg.dopplerWindow.window,
                               cfg->hwRes.hwaCfg.dopplerWindow.windowSize, //size in bytes
                               cfg->hwRes.hwaCfg.dopplerWindow.winRamOffset * sizeof(int32_t));
        if (retVal != 0)
        {
            goto exit;
        }
        /* HWA Azimuth/Elevation FFT window configuration */
        retVal = HWA_configRam(obj->hwaHandle,
                               HWA_RAM_TYPE_WINDOW_RAM,
                               (uint8_t *)cfg->hwRes.hwaCfg.angleWindow.window,
                               cfg->hwRes.hwaCfg.angleWindow.windowSize, //size in bytes
                               cfg->hwRes.hwaCfg.angleWindow.winRamOffset * sizeof(int32_t));
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Map rx channel compensation coefficients into row x column 2D virtual array antenna array */
        aoa2dProc_mapRxChanCompensationCoefs(cfg, (cmplx32ImRe_t *) &rxChComp);
    
        /* HWA rx phase compensation */
        retVal = HWA_configRam(obj->hwaHandle,
                               HWA_RAM_TYPE_INTERNAL_RAM,
                               (uint8_t *) &rxChComp,
                               cfg->staticCfg.numAntRow * cfg->staticCfg.numAntCol * sizeof(cmplx32ImRe_t), //size in bytes
                               0);
        if (retVal != 0)
        {
            goto exit;
        }
        
        /*******************************/
        /**  Configure HWA            **/
        /*******************************/
        retVal = aoa2dProc_configHwa(obj, cfg);
        if (retVal != 0)
        {
            goto exit;
        }
                        
        /*******************************/
        /**  Configure EDMA           **/
        /*******************************/    
        retVal = aoa2dProc_configEdma(obj, cfg);
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Copy the whole configuration to the instance */
        obj->config = *cfg;
    exit:
        return retVal;
    }
    
    /**
    *  @b Description
    *  @n Configures Input EDMA
    *
    *  @param[in]   obj             DPU internal object
    *  @param[in]   radarCubeSrc  Structure descriptor of the input radar cube
    *
    *  \ingroup    DPU_AOA2DPROC_INTERNAL_FUNCTION
    *
    *  @retval
    *      Success     =0
    *  @retval
    *      Error      !=0
    */
    int32_t aoa2dProc_ConfigAndTriggerEdmaInput(DPU_Aoa2dProc_Obj *obj,
                                                    uint16_t rangeIdx)
    {
    
        int32_t retVal = 0;
        uint32_t startAddress;
        cmplx16ImRe_t *radarCube = (cmplx16ImRe_t *) obj->radarCube.data;
    
        startAddress = (uint32_t) SOC_virtToPhy(&radarCube[rangeIdx]);
        retVal = DPEDMA_setSourceAddress(obj->edmaHandle,
                                         obj->edmaIn.channel,
                                         startAddress);
    
        retVal = DPEDMA_startTransfer(obj->edmaHandle, obj->edmaIn.channel);
    
        return retVal;
    }
    
    
    /**
    *  @b Description
    *
    *  @param[in]   obj        DPU object
    *
    *  @retval
    *      Success     =0
    *  @retval
    *      Error      !=0
    */
    int32_t aoa2dProc_ConfigAndTriggerHwaDopplerComputation
    (
            DPU_Aoa2dProc_Obj * obj
    )
    {
    
        int32_t             retVal = 0;
        HWA_CommonConfig    hwaCommonConfig;
    
    
        /***********************/
        /* HWA COMMON CONFIG   */
        /***********************/
        memset((void*) &hwaCommonConfig, 0, sizeof(HWA_CommonConfig));
    
        /* Config Common Registers */
        hwaCommonConfig.configMask =
            HWA_COMMONCONFIG_MASK_NUMLOOPS |
            HWA_COMMONCONFIG_MASK_PARAMSTARTIDX |
            HWA_COMMONCONFIG_MASK_PARAMSTOPIDX |
            HWA_COMMONCONFIG_MASK_FFT1DENABLE |
            HWA_COMMONCONFIG_MASK_INTERFERENCETHRESHOLD;
    
        hwaCommonConfig.numLoops      = 1;
        hwaCommonConfig.paramStartIdx = obj->dopplerHwaComp.startIdx;
        hwaCommonConfig.paramStopIdx  = obj->dopplerHwaComp.startIdx + obj->dopplerHwaComp.numParams - 1;
        hwaCommonConfig.fftConfig.fft1DEnable = HWA_FEATURE_BIT_DISABLE;
        hwaCommonConfig.fftConfig.interferenceThreshold = 0xFFFFFF;
    
        retVal = HWA_configCommon(obj->hwaHandle, &hwaCommonConfig);
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Enable the HWA */
        retVal = HWA_enable(obj->hwaHandle,1);
        if (retVal != 0)
        {
            goto exit;
        }
    
    
    
    exit:
        return retVal;
    }
    
    /**
    *  @b Description
    *
    *  @param[in]   obj        DPU object
    *
    *  @retval
    *      Success     =0
    *  @retval
    *      Error      !=0
    */
    int32_t aoa2dProc_ConfigAndTriggerHwaAngleComp
    (
            DPU_Aoa2dProc_Obj * obj
    )
    {
    
        int32_t             retVal = 0;
        HWA_CommonConfig    hwaCommonConfig;
    
    
        /***********************/
        /* HWA COMMON CONFIG   */
        /***********************/
        memset((void*) &hwaCommonConfig, 0, sizeof(HWA_CommonConfig));
    
        /* Config Common Registers */
        hwaCommonConfig.configMask =
            HWA_COMMONCONFIG_MASK_NUMLOOPS |
            HWA_COMMONCONFIG_MASK_PARAMSTARTIDX |
            HWA_COMMONCONFIG_MASK_PARAMSTOPIDX |
            HWA_COMMONCONFIG_MASK_FFT1DENABLE |
            HWA_COMMONCONFIG_MASK_CFARTHRESHOLDSCALE |
            HWA_COMMONCONFIG_MASK_INTERFERENCETHRESHOLD;
    
        hwaCommonConfig.numLoops      = 1;
        hwaCommonConfig.paramStartIdx = obj->angleHwaComp.startIdx;
        hwaCommonConfig.paramStopIdx  = obj->angleHwaComp.startIdx + obj->angleHwaComp.numParams - 1;
        hwaCommonConfig.fftConfig.fft1DEnable = HWA_FEATURE_BIT_DISABLE;
        hwaCommonConfig.fftConfig.interferenceThreshold = 0xFFFFFF;
        /* Threshold is set to one, since we are searching for maximum peaks using CFAR with peak grouping enabled */
        hwaCommonConfig.cfarConfig.cfarThresholdScale = 16;
    
    
        retVal = HWA_configCommon(obj->hwaHandle, &hwaCommonConfig);
        if (retVal != 0)
        {
            goto exit;
        }
    
        /* Enable the HWA */
        retVal = HWA_enable(obj->hwaHandle,1);
        if (retVal != 0)
        {
            goto exit;
        }
    exit:
        return retVal;
    }
    
    uint32_t aoa2dProc_Calculate_XYZ(DPU_Aoa2dProc_Obj *obj,
                           DPU_Aoa2dProc_OutParams *outParams,
                           DPIF_CFARRngDopDetListElement *rngDopDetListElement,
                           uint32_t peakInd,
                           uint32_t numDetectedPoints)
    {
        int32_t selAzimMin = obj->detectionCfg.skipLeftAzim;
        int32_t selAzimMax = obj->config.staticCfg.azimuthFftSize - obj->detectionCfg.skipRightAzim - 1;
        float azimBinOffset;
        uint32_t azimFftMask = obj->config.staticCfg.azimuthFftSize - 1;
        int32_t azimLeftInd, azimRightInd;
    
        uint16_t azimuthFftSize = obj->config.staticCfg.azimuthFftSize;
        uint16_t elevationFftSize = obj->config.staticCfg.elevationFftSize;
    
        uint32_t *azimuthSpectrum1D = (uint32_t *) obj->hwaAngleProcOut.azimFftOutPtr;
        DPIF_HWA_STATS_MaxOutput *azimuthSpectrum2D = obj->hwaAngleProcOut.azimSpectElevIndPtr;
        uint32_t azimuthIdx = obj->hwaAngleProcOut.azimPeakList[peakInd].cellIdx;
        uint32_t azimuthPeak = obj->hwaAngleProcOut.azimPeakList[peakInd].cut;
        uint32_t azimuthMaxPeak = obj->hwaAngleProcOut.azimMaxPeakAzimIndPtr->peak;
        int32_t sideLobeThreshold;
        int32_t elevationIdx;
    
        int32_t selElevMin;
        int32_t selElevMax;
    
        int32_t azimuthSgnIdx;
        int32_t elevationSgnIdx;
    
        float x, y, z;
        float Wx, Wz;
        float range;
        float temp;
        float denom;
    
        float lambdaOverDistX = obj->config.staticCfg.lambdaOverDistX;
        float lambdaOverDistZ = obj->config.staticCfg.lambdaOverDistZ;
    
        if (numDetectedPoints == outParams->detObjOutMaxSize)
        {
            goto exit;
        }
    
        if (obj->config.staticCfg.angleDimension == 2)
        {
            selElevMin = obj->detectionCfg.skipLeftElev;
            selElevMax = obj->config.staticCfg.elevationFftSize - obj->detectionCfg.skipRightElev - 1;
        }
    
    
        /* Check if it is inside azimuth and range FOV */
        if ((azimuthIdx < selAzimMin) || (azimuthIdx > selAzimMax))
        {
            goto exit;
        }
    
        azimBinOffset = 0.;
    
        azimLeftInd = (azimuthIdx-1) & azimFftMask;
        azimRightInd = (azimuthIdx+1) & azimFftMask;
    
        /*If peak is greater than side-lobe threshold*/
        sideLobeThreshold  = (int32_t) ((azimuthMaxPeak * obj->config.staticCfg.sideLobeThresholdScaleQ8) >> DPU_AOA2DPROC_SHIFT_Q8);
        if(!(azimuthPeak >= sideLobeThreshold))
        {
            goto exit;
        }
    
        /* get elevation index */
        if (obj->config.staticCfg.angleDimension == 2)
        {
            elevationIdx = azimuthSpectrum2D[azimuthIdx].maxInd;
            if ((elevationIdx < selElevMin) || (elevationIdx > selElevMax))
            {
                goto exit;
            }
        }
        else
        {
            elevationIdx = (int32_t)(elevationFftSize>>1);
        }
    
        /* Interpolate in azimuth domain */
        if (obj->config.staticCfg.enableInterpAzimuthDom)
        {
            float xLeft;
            float xRight;
            float x;
            if (obj->config.staticCfg.angleDimension == 2)
            {
                xLeft =  azimuthSpectrum2D[azimLeftInd].peak;
                xRight = azimuthSpectrum2D[azimRightInd].peak;
            }
            else
            {
                xLeft = azimuthSpectrum1D[azimLeftInd];
                xRight = azimuthSpectrum1D[azimRightInd];
            }
            x = (float) azimuthPeak;
            denom =  (4.*x - 2.*xLeft - 2.*xRight);
            if (denom != 0)
            {
                azimBinOffset = (xRight-xLeft) / denom;
            }
            else
            {
                azimBinOffset = 0;
            }
        }
    
        azimuthSgnIdx = (int32_t ) azimuthIdx - (int32_t)(azimuthFftSize>>1);
        elevationSgnIdx = (int32_t ) elevationIdx - (int32_t)(elevationFftSize>>1);
    
        range = rngDopDetListElement->range;
        Wx = lambdaOverDistX * ((float) azimuthSgnIdx + azimBinOffset) / azimuthFftSize;
        x = range * Wx;
    
        Wz = - lambdaOverDistZ * (float) elevationSgnIdx / elevationFftSize;
    
        z = range * Wz;
    
        temp = range*range - x*x - z*z;
        if (temp > 0)
        {
            y = sqrt(temp);
        }
        else
        {
            y = 0;
        }
    
        outParams->detObjOut[numDetectedPoints].x = x;
        outParams->detObjOut[numDetectedPoints].y = y;
        outParams->detObjOut[numDetectedPoints].z = z;
        outParams->detObjOut[numDetectedPoints].velocity = rngDopDetListElement->doppler;
        outParams->detObjOut[numDetectedPoints].noise = rngDopDetListElement->noisedB;
        outParams->detObjOut[numDetectedPoints].snr = rngDopDetListElement->snrdB;
    
    
        numDetectedPoints++;
    exit:
        return numDetectedPoints;
    }
    
    void aoa2dProc_CopyMapAntSymbols(DPU_Aoa2dProc_Obj *obj, int16_t detPointDopInd)
    {
        cmplx32ImRe_t *srcHwaMem = (cmplx32ImRe_t *) obj->hwaMemBankAddr[1];
        cmplx32ImRe_t *dstHwaMem = (cmplx32ImRe_t *) obj->hwaMemBankAddr[2];
        uint32_t numParam = obj->aoa2dRngGateCfg.numDopFftParams;
        DPU_Aoa2dProc_HWA_Doppler_Fft_Cfg *paramCfg = obj->aoa2dRngGateCfg.dopFftCfg;
        uint32_t i,k;
        uint32_t src, dst;
        uint32_t numRxAnt = obj->config.staticCfg.numRxAntennas;
        uint32_t ddmOffset = obj->config.staticCfg.numDopplerBins;
        uint32_t numRow = obj->config.staticCfg.numAntRow;
        uint32_t numCol = obj->config.staticCfg.numAntCol;
        cmplx32ImRe_t srcScratchPad[SYS_COMMON_NUM_TX_ANTENNAS * SYS_COMMON_NUM_RX_CHANNEL];
        cmplx32ImRe_t dstScratchPad[DPU_AOA2D_PROC_MAX_2D_ANT_ARRAY_ELEMENTS];
        uint32_t ddmMask = obj->config.staticCfg.bpmDopplerFftSize - 1;
        uint32_t rdInd;
    
        /* Copy from HWA Memory to local memory */
        rdInd = detPointDopInd & ddmMask;
        memcpy(&srcScratchPad[0],        &srcHwaMem[rdInd * numRxAnt], numRxAnt * sizeof(cmplx32ImRe_t));
        rdInd = (rdInd + ddmOffset) & ddmMask;
        memcpy(&srcScratchPad[numRxAnt], &srcHwaMem[rdInd * numRxAnt], numRxAnt * sizeof(cmplx32ImRe_t));
    
        /* Map. (zero positions are ignored since the rx compensation coefficients are zeroing these positions. ToDo make single forward LUT */
        for (i=0; i < numParam; i++)
        {
            for (k=0; k < paramCfg[i].srcBcnt; k++)
            {
                src = paramCfg[i].srcAddrOffset + k * paramCfg[i].srcBidx;
                dst = paramCfg[i].dstAddrOffset + k * paramCfg[i].dstBidx;
                dstScratchPad[dst] = srcScratchPad[src];
            }
        }
    
        /* Copy from local memory to HWA Memory */
        memcpy(dstHwaMem, dstScratchPad, (numRow * numCol) * sizeof(cmplx32ImRe_t));
    }
    
    /**
    *  @b Description
    *  @n AOA2D DPU process function. Computes the range/azimuth detection matrix
    *
    *  @param[in]   handle        DPU handle
    *  @param[in]   radarCubeSrc  Structure descriptor of the input radar cube
    *  @param[in]   detMatrix     Pointer to output detection matrix.
    *  @param[out]  outParams     Output parameters.
    *
    *  \ingroup    DPU_AOA2DPROC_EXTERNAL_FUNCTION
    *
    *  @retval
    *      Success     =0
    *  @retval
    *      Error      !=0
    */
    int32_t DPU_Aoa2dProc_process
    (
        DPU_Aoa2dProc_Handle    handle,
        DPIF_RadarCube *radarCubeSrc,
        DPIF_CFARRngDopDetListElement *detRngDopList,
        uint32_t numDetPoints,
        DPIF_DetectedRangeGates *detectedRangeGates, //ToDo this should be scratch memory
        DPIF_DetMatrix *detMatrix,
        DPU_Aoa2dProc_OutParams *outParams
    )
    {
        //volatile uint32_t   startTime;
    
        DPU_Aoa2dProc_Obj *obj;
        int32_t             retVal = 0;
        uint16_t rngGateInIdx, rngGateOutIdx, dopplerIdx, pointIdx;
        uint16_t numAzimuthPeaks;
        int16_t detPointDopInd;
        uint32_t numDetPointsOut = 0;
        uint32_t peakInd;
        DPIF_CFARRngDopDetListElement *rngDopDetListElement;
    
    
    
        obj = (DPU_Aoa2dProc_Obj *)handle;
        if (obj == NULL)
        {
            retVal = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }
        /* Set inProgress state */
        obj->inProgress = true;
    
    
        outParams->numDetectedPoints = 0;
        if (numDetPoints == 0)
        {
            goto exit;
        }
    
    
        //startTime = Cycleprofiler_getTimeStamp();
        /* Prepare range gates for AoA */
        aoa2dProc_findRangeGates(detRngDopList, numDetPoints,  detectedRangeGates);
    
    
        /**********************************************/
        /* ENABLE NUMLOOPS DONE INTERRUPT FROM HWA */
        /**********************************************/
        retVal = HWA_enableDoneInterrupt(obj->hwaHandle,
                                         aoa2dProc_hwaDoneIsrCallback,
                                         (void*)&obj->hwaDoneSemaHandle);
        if (retVal != 0)
        {
            goto exit;
        }
    
        pointIdx = 0;
        rngGateInIdx = 0;
    
    
        /* Configure first range gate (RG) and copy to M0 HWA memory */
        aoa2dProc_ConfigAndTriggerEdmaInput(obj, detectedRangeGates->array[rngGateInIdx++].rangeIdx);
    
        /* Loop through all detected range gates */
        for (rngGateOutIdx = 0; rngGateOutIdx < detectedRangeGates->numRangeGates; rngGateOutIdx++)
        {
            /* Make sure RG transfer is completed */
            SemaphoreP_pend(&obj->edmaDoneSemaHandle, SystemP_WAIT_FOREVER); //ToDo enable interrupt after EDMAin, remove hot signature, remove tirgger channel  cfg doppler param to run immediate
    
            /* Trigger Doppler FFT */
            aoa2dProc_ConfigAndTriggerHwaDopplerComputation(obj);
    
            /* Wait for HWA Doppler FFT completion, output is in M1 */
            SemaphoreP_pend(&obj->hwaDoneSemaHandle, SystemP_WAIT_FOREVER);
    
            /* Disable the HWA */
            retVal = HWA_enable(obj->hwaHandle, 0);
            if (retVal != 0)
            {
                goto exit;
            }
    
            if (rngGateInIdx < detectedRangeGates->numRangeGates)
            {
                /* Trigger copy of the next range gate from radar cube to M0 HWA memory */
                aoa2dProc_ConfigAndTriggerEdmaInput(obj, detectedRangeGates->array[rngGateInIdx++].rangeIdx);
            }
    
    
            /* Process all Doppler detected points at the current RG */
            for (dopplerIdx = 0; dopplerIdx < detectedRangeGates->array[rngGateOutIdx].numDopplerBins; dopplerIdx++)
            {
                detPointDopInd = detRngDopList[pointIdx].dopplerIdx;
                rngDopDetListElement = &detRngDopList[pointIdx];
    
                /* Copy and Map Antenna symbols from M1 to M2 */
                aoa2dProc_CopyMapAntSymbols(obj, detPointDopInd);
    
    
                /* Config and trigger HWA */
                aoa2dProc_ConfigAndTriggerHwaAngleComp(obj);
    
                /* Wait for HWA Azimuth/Elevation completion */
                SemaphoreP_pend(&obj->hwaDoneSemaHandle, SystemP_WAIT_FOREVER);
    
                /* Disable the HWA */
                retVal = HWA_enable(obj->hwaHandle, 0);
                if (retVal != 0)
                {
                    goto exit;
                }
                /* Read number o CFAR points - number of peaks */
                HWA_readCFARPeakCountReg(obj->hwaHandle,
                                         (uint8_t *) &numAzimuthPeaks,
                                         sizeof(uint16_t));
                for (peakInd = 0; peakInd < numAzimuthPeaks; peakInd++)
                {
                    /* Process all detected peaks in azimuth domain - calculate XYZ coordinates */
                    numDetPointsOut = aoa2dProc_Calculate_XYZ(obj, outParams, rngDopDetListElement, peakInd, numDetPointsOut);
                }
                pointIdx++;
            }
        }
    
        outParams->numDetectedPoints = numDetPointsOut;
    exit:
        outParams->stats.numProcess++;
        //outParams->stats.processingTime = Cycleprofiler_getTimeStamp() - startTime;
    
        if (obj != NULL)
        {
            obj->inProgress = false;
        }    
        
        return retVal;
    }
    
    /**
      *  @b Description
      *  @n
      *  Doppler DPU deinit 
      *
      *  @param[in]   handle   DPU handle.
      *
      *  \ingroup    DPU_AOA2DPROC_EXTERNAL_FUNCTION
      *
      *  @retval
      *      Success      =0
      *  @retval
      *      Error       !=0 @ref DPU_DOPPLERPROC_ERROR_CODE
      */
    int32_t DPU_Aoa2dProc_deinit(DPU_Aoa2dProc_Handle handle)
    {
        int32_t     retVal = 0;
        
        /* Free memory */
        if(handle == NULL)
        {
            retVal = DPU_AOA2DPROC_EINVAL;
        }
        
        return retVal;
    }
    
    
    /**
      *  @b Description
      *  @n
      *   Returns number of allocated HWA Param sets
      *
      *  @param[in]   handle     DPU handle.
      *  @param[out]   cfg       Number of allocated HWA Param sets
      *
      *  @retval
      *      Success      = 0
      *  @retval
      *      Error       != 0
      */
    int32_t DPU_Aoa2dProc_GetNumUsedHwaParamSets
    (
        DPU_Aoa2dProc_Handle    handle,
        uint8_t *numUsedHwaParamSets
    )
    {
        DPU_Aoa2dProc_Obj *obj;
        int32_t retVal = 0;
    
        obj = (DPU_Aoa2dProc_Obj *)handle;
        if (obj == NULL)
        {
            retVal = DPU_AOA2DPROC_EINVAL;
            goto exit;
        }
        *numUsedHwaParamSets = (uint8_t) (obj->dopplerHwaComp.numParams + obj->angleHwaComp.numParams);
    exit:
        return retVal;
    }
    

  • Hi Cesar,

        Thank you!

  • Thank you

    Cesar