I have a different view about why this happens, and I don't think it is to do with reception, or the ability of the GNSS chipset to produce a PVT solution. I suspect it is simply a race condition (i.e. threading related), and how the NMEA sentences are being consumed.
There are the two manifestations of the issue.
- The first is most common and illustrated in the post above (i.e. repeated PVT solution then a big catchup)
- The second is completely skipping a PVT solution, essentially doubling the distance travelled and then repeating those same values.
The timestamps in the FIT file are based on the Garmin system time. This is different to both GPS time (which can be converted to UTC) and the local time (displayed to the user). We already see random offsets in the FIT files (typically 0, 1, or 2 seconds) and if you manually change the time on your watch you can also shift the data by as many minutes as you wish. I did some testing around this recently. The Fenix 7 has some nice logging which shows how these 3 timestamps relate to each other, and how they differ.
Every second, the watch is bundling all of the current data together (e.g. GPS, HR, barometer, thermometer, etc) and saving a record to the FIT. In an ideal world this would be centred around the GPS timestamps, but I do not believe it is doing that.
It would appear to me that it is simply using the latest consumed NMEA message(s) and that any slight variations in the timings of NMEA consumption and generation of FIT records (almost certainly separate threads) causes it to skip PVT solutions, or repeat solutions.
I could detail the NMEA sentences that I believe Garmin are using and how one of them does not contain timestamps, which would explain why they might be doing something as simple as I have described above.
Also, there is no evidence of poor quality adjacent PVT solutions when either of these 2 scenarios occurs, which one should probably expect when reception is poor. Additionally, one should also expect the Kalman filter to prevent any solutions that are identical to the previous one (scenario 1) and would be unlikely to generate solutions that double the distance travelled in a second (scenario 2).
I can't prove this is the cause, but a simple race condition would explain both scenarios -
en.wikipedia.org/wiki/Race_condition