The current implementation of phase noise generation for FMCW and CW modes in finalizer.cpp applies phase noise to the final accumulated IQ buffer. This approach models phase noise as an absolute additive term on the baseband signal, which is valid for heterodyne systems (like standard pulsed radar) where the receiver LO is independent of the transmitter.
However, FMCW and CW radars typically operate as homodyne systems where the received signal is mixed with the currently transmitting local oscillator. In this configuration, the phase noise present in the IF (beat) signal is the difference between the current phase noise and the delayed phase noise:
$\Delta\phi_{noise} = \phi_{noise}(t) - \phi_{noise}(t - \tau)$
Because the current implementation applies phase noise in the finalizer after all target returns have been summed, it is impossible to account for the time delay ($\tau$) of individual targets. Consequently, the simulation injects the full absolute phase noise of the oscillator into the signal, resulting in an artificially high noise floor and degraded target peaks at short ranges.
Affected Components:
src/processing/finalizer.cpp: Currently applies global phase noise to FMCW/CW buffers.
src/simulation/channel_model.cpp: Calculates ideal phase but excludes phase noise.
src/timing/timing.cpp: Generates sequential samples but lacks a history mechanism for looking up past values.
Proposed Solution:
-
Update Timing Subsystem:
Modify the Timing class and ClockModelGenerator to maintain a circular buffer or history of generated phase noise samples. Add a method to retrieve the phase noise value for a specific simulation time (e.g., getPhaseNoiseAt(time)).
-
Refactor Channel Model:
Move the application of phase noise for FMCW and CW modes from finalizer.cpp to channel_model.cpp.
Inside calculateFmcwReflectedPathContribution (and the CW equivalent), calculate the differential phase noise based on the target delay and add it to the signal phase before the signal is accumulated into the receiver buffer.
-
Update Finalizer:
Remove the phase noise application logic from finalizeCwReceiver and finalizeFmcwReceiver in finalizer.cpp.
Note: Pulsed mode finalization should remain unchanged as it correctly models the independent LO noise during the receive window.
The current implementation of phase noise generation for FMCW and CW modes in
finalizer.cppapplies phase noise to the final accumulated IQ buffer. This approach models phase noise as an absolute additive term on the baseband signal, which is valid for heterodyne systems (like standard pulsed radar) where the receiver LO is independent of the transmitter.However, FMCW and CW radars typically operate as homodyne systems where the received signal is mixed with the currently transmitting local oscillator. In this configuration, the phase noise present in the IF (beat) signal is the difference between the current phase noise and the delayed phase noise:
Because the current implementation applies phase noise in the finalizer after all target returns have been summed, it is impossible to account for the time delay ($\tau$ ) of individual targets. Consequently, the simulation injects the full absolute phase noise of the oscillator into the signal, resulting in an artificially high noise floor and degraded target peaks at short ranges.
Affected Components:
src/processing/finalizer.cpp: Currently applies global phase noise to FMCW/CW buffers.src/simulation/channel_model.cpp: Calculates ideal phase but excludes phase noise.src/timing/timing.cpp: Generates sequential samples but lacks a history mechanism for looking up past values.Proposed Solution:
Update Timing Subsystem:
Modify the
Timingclass andClockModelGeneratorto maintain a circular buffer or history of generated phase noise samples. Add a method to retrieve the phase noise value for a specific simulation time (e.g.,getPhaseNoiseAt(time)).Refactor Channel Model:
Move the application of phase noise for FMCW and CW modes from
finalizer.cpptochannel_model.cpp.Inside
calculateFmcwReflectedPathContribution(and the CW equivalent), calculate the differential phase noise based on the target delay and add it to the signal phase before the signal is accumulated into the receiver buffer.Update Finalizer:
Remove the phase noise application logic from
finalizeCwReceiverandfinalizeFmcwReceiverinfinalizer.cpp.Note: Pulsed mode finalization should remain unchanged as it correctly models the independent LO noise during the receive window.