mirror of
https://github.com/NawfalMotii79/PLFM_RADAR.git
synced 2026-06-08 22:47:16 +00:00
36234fe0e3
T-6 drift cosim (PR-M.1, c30be89) surfaced a 740-LSB / 2.3 % spec-vs-
implementation gap in the Doppler window: doppler_processor.v lines
99..114 and fpga_model.HAMMING_WINDOW were documented as sym Hamming
N=16 (0.54 - 0.46*cos(2*pi*n/15)) but contained values that didn't
match any standard window family. Existing Doppler cosim passed bit-
exactly because both the RTL and the Python twin shared the identical
non-canonical values.
Quantifying the trade with scipy.signal across 11 candidates, the
production LUT actually had peak sidelobes of -33 dB (vs canonical
sym Hamming -40 dB) — the hand-tweaks made it 6.6 dB worse than the
formula it claimed to be. Rather than just fix the LUT to canonical
Hamming, picked Dolph-Chebyshev 60 dB equiripple as a deliberate
upgrade for counter-UAS Doppler where MTI-residual clutter leakage
into adjacent Doppler bins is the dominant false-alarm source.
Window comparison (N=16, Q15):
Window PSL(dB) MLW(bins) ENBW CG(dB) In-bin SNR loss
Old "Hamming" -33.2 1.38 1.45 -5.84 1.61 dB
Canonical Hamm -39.8 1.35 1.43 -5.83 1.54 dB
Dolph-Cheby 60 -60.0 1.48 1.55 -6.48 1.91 dB <-
Kaiser β=8 -57.9 1.69 1.78 -7.77 2.50 dB
Blackman -93.7 1.75 1.84 -8.10 2.66 dB
Cheby-60 buys 27 dB of sidelobe rejection over the old LUT for 0.30 dB
worse in-bin SNR and 7 % wider main lobe — a strict win for cluttered
counter-UAS environments. Hardware impact: zero. The window is a
16-entry Q15 ROM; same reg width, same DSP multiply, same FFT pipeline,
same timing, same area. Only the initial-block hex literals change.
Changes:
* doppler_processor.v lines 114..129: 14 of 16 hex literals replaced
with chebwin(16, at=60) Q15 values; comment block updated
* tb/cosim/fpga_model.py: HAMMING_WINDOW renamed to DOPPLER_WINDOW_COEFF,
values replaced; class comments updated
* tb/cosim/fpga_reference.py: hamming_16_ideal() renamed to
doppler_window_ideal(), uses scipy.signal.windows.chebwin
* tb/cosim/compare_independent.py: import + label updates
* tb/cosim/gen_doppler_golden.py: docstring header
* tb/cosim/doppler_golden_py_*.{csv,hex} (3 scenarios): regenerated
* tb/cosim/real_data/hex/{doppler,fullchain}_doppler_ref_{i,q}.hex:
regenerated via gen_realdata_hex.py
Drift cosim now 13/13 PASS — DOPPLER_WINDOW_COEFF matches its
analytical Cheby-60 ideal bytewise (0 LSB drift). Full regression
42 passed / 0 failed of 42 — bit-exact cosim still passes (RTL ≡
Python twin since both got the new LUT).