TDoA Algorithms

Hey guys,

I just started thinking about applying Deca modules in one more project, but this time synchronizing anchors clocks seems inevitable. Has anyone of you applied TDoA algorithms with a success? I have to implement location engine with limited hardware resources (Cortex-M0 core). Do you think it is possible to process those data with decent frequency (100Hz)?


Hi Bartosz,

we played around with wired synchronization via Ethernet. The results are promising. We distributed the clock along with the sync signals. The tough part is to drive the Ethernet cable over large distances, since you need to take care of wire length. However, there is an application note from Decawave available.
I would recommend that you do the location engine on dedicated hardware to increase your update rate.
On the other side an analytical method to solve the position based on TDoA is not that hard to implement and is also computationally not expensive (but need you matrix inversion).


Can you recommend some materials to study ? :slight_smile: I just wonder whether there are some methods to solve hyperbolas intersection more efficiently than normal analytical approach.


Hi Bartosz,

for starters, there is the thing from Decawave.

For hyperbolic trilateration I recommend the work from Shen (Performance Comparison of TOA and TDOA Based Location Estimation Algorithms in LOS Environment).

As said, approximation with Taylor Series (or all recursive approaches) requires way more computational power despite better results. However, the performance of an analytical solution is not that bad and it is really a tradeoff with computational power. We investigated this in the past for ToA methods and simulated this using Matlab.


Hi Mathias,

We are trying the external clock and the sync.

The external clock seems working ok.
But we cannot make the sync work as expected.

We use Arduino Pro Mini + DWM1000 chip and a DW1000 library for Arduino porting (
To make it simple we connected an Arduino pin to the DWM1000 sync pin (pin 4)
and triggered the high voltage to the DWM1000 sync pin.

But when DWM1000 system timestamps are printed, triggering the sync pin doesn’t make any difference.
(expected result : The DWM1000 system timestamps are initialized to zero and started again)

We followed guide in aps007_wired_sync_rtls_with_the_dw1000.pdf.

  • Use an osciliator for the external clock and connect it to the DWM1000 directly.
  • Set ‘OSTRM’ to 1 and ‘WAIT’ to 33 in the EC_CTRL Register
  • Trigger the high voltage to the DWM1000 sync pin using Arguino

When you succeeded in the wired synchronization,

  • Did you use DWM1000 or DW1000?

  • How did you trigger the high voltage to the DWM1000 sync pin?
    Did you trigger the high voltage to the DWM1000 sync pin using S/W?
    Or did you use additional sync generation H/W?

Thank you

Best regards,
Brian Miles

Hi Brian, I use the external SYNC signal and works. I use this configuration:

//configure the SYNC input
uint8 OSTRM_enable = 0x90C;
dwt_writetodevice(EXT_SYNC_ID, EC_CTRL_OFFSET, 2, &OSTRM_enable); //

Set ‘OSTRM’ to 1 and ‘WAIT’ to 33 in the EC_CTRL Register and set the SYNC like input.

Regards, Alejandro

Hi Mathias

I am interested in the file from Decawave in your post, but when I go to download it I get an error. Are you able to attach it for me please?

There is less support from Decawave for TDoA vs TWR, but our use case ideally requires TDoA because we have a lot of tags.

Any assistance or pointers anyone can provide for this would be very much appreciated.


Hello Alejandro,

I used the External Sync configuration in the dwt_initialize part (as given in the Demo application code by Decawave) before calling the dwt_configure function. But still, if I print the System time using dwt_readsystime it just prints FFFFFFFFFF.

I have verified that my External clock and Sync signals are correct. Can you tell me what am I missing? or am I doing the External Sync configuration in the wrong part of the code?