This repository is the official Mitsuba0.6 implementation of "A Monte Carlo Rendering Framework for Simulating Optical Heterodyne Detection" by Juhyeon Kim, Craig Benko, Magnus Wrenninge, Ryusuke Villemin, Zeb Barber, Wojciech Jarosz, Adithya Pediredla (SIGGRAPH 2025, journal paper, 🏆 Honorable mention).
You can compile it just same as standard Mitsuba0.6. If you are not familiar with Mitsuba0.6 renderer, please follow the original Mitsuba compliation guide at here or Chapter4 of Mitsuba0.5 document.
Or, you can follow below code for compile and run tutorials. (tested for Ubuntu 22.04)
git clone --recursive https://github.com/juhyeonkim95/MitsubaOHD
###############################
# For Mitsuba Compile
###############################
# Create python2 env for Mitsuba0.5 compile
conda env create -n mitsuba0.5python2 -f environment_mitsuba_compile.yml
conda activate mitsuba0.5python2
# install required packages (check original document for details)
sudo apt-get install -y --no-install-recommends \
build-essential \
scons \
mercurial \
libilmbase-dev \
libpng-dev \
libjpeg-dev \
libxerces-c-dev \
libboost-all-dev \
libopenexr-dev \
libglewmx-dev \
libxxf86vm-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
freeglut3-dev \
libeigen3-dev \
libfftw3-dev
# compile Mitsuba 0.5
scons -j 16
# set Mitsuba0.5 path
source ./setpath.sh
###############################
# For tutorial running
###############################
conda env create -n mitsubaohd -f environment_tutorial.yml
conda activate mitsubaohd
cd ohd_tutorial
# then run tutorial codes in several folders.
Or, you can install with Dockerfile:
# build and run docker
docker build -t mitsubaohd .
sudo docker run --rm -it -v "$PWD":/work mitsubaohd
# compile
conda activate mitsuba0.5python2
scons -j 16
source ./setpath.sh
# run tutorial
conda activate mitsubaohd
cd ohd_tutorial
New integrators are added in src/integrators/fmcw folder, for OHD rendering.
Two types of laser are typically used for OHD rendering, standard laser with constant frequency and swept-frequency laser with a chirp.
FMCW (frequency-modulated continuous-wave) use swept-frequency laser with up and down chirp.
Since FMCW is the most general case of OHD, we named integrator as fmcw.
fmcw_psd: frequency-domain PSD (Power Spectral Density) rendering, corresponding to Algorithm1 in the paper. It outputs [H x W x 2M] where M is histogram bin number. 2M is for (up, down) chirp each.fmcw_field: time-domain rendering with field sampling and random phase addition, corresponding to Algorithm2 in the paper. It outputs [H x W x 4M] where M is FFT sample number. 4M is for (up, down) chirp x (real, complex) term each.
-
wavelength: Laser wavelength in nanometer (default : 1550) -
f_0: Laser frequency in GHz. Ifwavelengthis also defined, we usewavelengthfirst (default : 193,414) -
T: Sweep time for one chirp in microsecond (default : 10) -
B: Signal bandwidth in GHz (default : 1) -
M: Number of time stamps used for FFT or histogram bin (default : 4096) -
use_collimated: Ignore light setting and use collimated laser (default : false) -
fov_error: Additional parameter to change laser FOV. If set to$a$ , instead of uniform sample from whole pixel, we sample centered square-area with$2a$ (default : 0.5). -
use_random_phase: Whether to use random phase addition forfmcw_field. (default : true)
Also, now object velocity property (translational only) could be added as:
<shape type="rectangle">
<transform name="toWorld">
<matrix value="-4.37114e-008 1 4.37114e-008 0 0 -8.74228e-008 2 0 1 4.37114e-008 1.91069e-015 0 0 0 0 1" />
<scale value="10" />
</transform>
<ref id="Floor" />
<vector name="velocity" x="0.0" y="2.0" z="0.0" />
</shape>
We included exhaustive examples in ohd_tutorial folder at here.
You can simulate various experiments in the main paper including below interactive PSD visualization.

If you find this useful for your research, please consider to cite:
@article{kim2025ohd,
author = {Kim, Juhyeon and Benko, Craig and Wrenninge, Magnus and Villemin, Ryusuke and Barber, Zeb and Jarosz, Wojciech and Pediredla, Adithya},
title = {A Monte Carlo Rendering Framework for Simulating Optical Heterodyne Detection},
year = {2025},
issue_date = {August 2025},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
volume = {44},
number = {4},
issn = {0730-0301},
url = {https://doi.org/10.1145/3731150},
doi = {10.1145/3731150},
journal = {ACM Trans. Graph.},
month = jul,
articleno = {56},
numpages = {19}
}
