GNSS Raw Pseudorange Extraction: Android Location API & Carrier Phase Ambiguity Resolution
Standard smartphone positioning APIs return filtered latitude/longitude estimates with 3-to-10 meter errors caused by atmospheric delays and multipath reflection. Modern Android devices expose raw GnssMeasurement carrier phase and code pseudoranges, unlocking sub-decimeter RTK (Real-Time Kinematic) precision on consumer hardware.
The Physics of Raw GNSS Pseudorange Processing
How raw hardware clock telemetry is converted into physical geometric ranges:
The raw pseudorange $\rho$ is computed by subtracting the satellite signal transmission timestamp $t_{tx}$ from the receiver hardware clock reception timestamp $t_{rx}$ multiplied by the speed of light $c$. Applying double-differencing across base station observation streams eliminates satellite clock bias and ionospheric group delay.
Mobile Positioning Techniques Compared
| Positioning Technique | Measurement Source | Horizontal Accuracy | Convergence Time |
|---|---|---|---|
| Standard GNSS Fix (Fused Location) | Baseband chipset PVT filter | 3.00 – 10.0 m | < 1.0 s |
| Doppler-Smoothed Code Pseudorange | Hatch filter over raw pseudoranges | 1.20 – 2.50 m | 10 – 30 s |
| Dual-Frequency RTK Carrier Phase | L1/L5 carrier cycles & base corrections | 0.05 – 0.20 m | 45 – 90 s (Integer fix) |
Raw Pseudorange Extraction in TypeScript
Computing geometric pseudorange from Android raw clock timestamps:
export const SPEED_OF_LIGHT = 299792458; // m/s
export interface GnssClockRecord {
timeNanos: number;
fullBiasNanos: number;
biasNanos?: number;
}
export interface GnssMeasurementRecord {
svid: number;
constellation: string;
timeOffsetNanos: number;
receivedSvTimeNanos: number;
pseudorangeRateMps: number;
}
export function computeRawPseudorange(clock: GnssClockRecord, measurement: GnssMeasurementRecord): number {
const receiverTimeNanos = clock.timeNanos + (clock.biasNanos || 0) - (clock.fullBiasNanos || 0);
const signalTransitTimeNanos = receiverTimeNanos - measurement.receivedSvTimeNanos;
const transitTimeSeconds = signalTransitTimeNanos * 1e-9;
return transitTimeSeconds * SPEED_OF_LIGHT;
}
Explore Advanced Mobile Positioning Systems
Engineer high-precision telematics. Read our guide on Satellite Assisted GNSS Ephemeris Ingestion, explore microvascular endothelial restoration on ValleyVitaClinic Vascular Protocols, review GPU font outline tessellation on A&K Graphics WebGPU Pipelines, or deploy our mobile telemetry SDK.