DWM3000 APS014 - Calibration


I am trying to implement a version of the antenna calibration of the algorithm in aps014, but there are a few questions that comes in my mind, that I can’t resolve by myself.

The first steps are clear,measure the distance between each device, than put the distances in the EDM matrixes and calc the time of flight from this. Also measure with a laser the exact distance between each.

Then I calcuate a set of possible candidates for the antenna delays. Here is the first queastion:

  1. Do I have one set of candidates or do I have a set of candidates for each antenna in my set up?

After that I have to calcuate the tof_candidate matrix. Here is the biggest question mark. The Application Note says: tof_candidate = (2 * Delay_chip1+2 * Delay_chip2+4 * tof_measured)/4

  1. Is tof_measured the whole matrix which I calcuate in the first steps? Or is it just one distance for example between deivce 1 and 2, 2 and 3 and so on, which I put later on back in a matrix?

  2. If I have only one set of candidates, how I can find the best candidate for each antenna in this setup an which delay candidate do I use in every iteration for the different chips?

  3. If there are more than one set, how can I finde the best in a good time?
    To explain: I am tried to implement the example of the aps node with more than one candidate. Here I mixed up every possible combination and it took ages for just one iteration. What is clear if there is in my example 100^3 combinations. When I think about 1000 candidates the time will be more horrible and I could not imagen thats right.

I am looked in the forum here an not found answers for that questions. But if there is, give me a hint, please.

If someone could help me with this I am very grateful. Thanks for that in advance.


A set of candidates, where each candidate has the delays for each antenna.

Yes, its the whole matrix (3x3, diagonal is 0).

You should have 1000 candidates, according to page 8 in APS014. The set of candidates is sorted by smallest norm difference (error). The best 25% are kept and perturbed at each step in the iteration.

You should have 1 set.

There should be 100 steps in the iteration. At each iteration 1000 candidates in the set are evaluated. It can take a minute or two depending on the computer.

Thanks for your answer Mathias.

Okay that means I have a set like [(delay_chip1_1,delay_chip2_1, delay_chip3_1), ( delay_chip1_2,delay_chip2_2, delay_chip3_2) , … , (delay_chip1_1000,delay_chip2_1000, delay_chip3_1000)]
where delay_chip1_1 != or == delay_chip2_1 != or == delay_chip3_1
Am I right with that?

Okay but how it works than mathematically? I just add the delays of two chips to the whole matrix?

I just unterstand it like:
tof_candidate[1,2] = (2 * Delay_chip1+2 * Delay_chip2+4 * tof_measured_distance[1,2])/4
tof_candidate[1,3] = (2 * Delay_chip1+2 * Delay_chip3+4 * tof_measured_distance[1,3])/4

tof_candidate[3,2] = (2 * Delay_chip3+2 * Delay_chip2+4 * tof_measured_distance[3,2])/4

Thats totaly clear than, when I have just 1000 candidates it should be much more faster than before, where I handle a million candidates each round. And with three differrent delay in each candidate its clear how I have to rank them.

Yes, that looks correct.

Thanks for the help again. Now I have the solution I think.

But there is something I have to point on, because in my opinion thats not descripte very well in ASP014:

That eq:
tof_candidate[i,j] = (2 * Delay_chip_i+2 * Delay_chip_j +4 * tof_measured_distance[i, j])/4

should be:
tof_candidate[i,j] = (4 * tof_measured_distance[i, j] - (2 * Delay_chip_i+2 * Delay_chip_j))/4

or the delay should be negativ (-513ns) when using the first eq.

With that I get the result like the example, if not I got an error around 10ns which goes bigger with more iterations. Thats because the measuremend made with zero delay, so the delay ist already include in the measuremend. I have to subtract the delay from the the measuremend to get the real distance and not add more of that.

If somebody looking for an working example I made a repo on github with my solution:

I hope thats fine and if someone had improvements, feel free to contact.


Hi Schven04,

I want to ask about how to calibrate these. Is there need to combine with ranging program or only use your github program to calibrate it? Afterward, how much devices needed for calibrate and How is delay calibration done?

Sorry for my ignorance as a beginner, I really appreciate your response! Thank you