In this example, we introduce a CMOS sensor simulation workflow that involves broadband optical simulations and an electrical simulation, both in 3D, which provides a more realistic and versatile demonstration compared to the previous simplified example. This example also considers both the azimuthal and polar angles of the incident light, allowing EQE extraction for further simulation in Speos Sensor System Exporter (SSS Exporter), if necessary.
Overview
Understand the simulation workflow and key results
The operation of a CMOS image sensor is based on optical-electrical conversion starting with optical absorption, through charge carrier generation, and finally collecting electrons for signal analysis. In this example, some key performance metrics of a CMOS sensor, i.e., internal quantum efficiency (IQE) and external quantum efficiency (EQE) are calculated as a function of incident angles and wavelengths. The CMOS image sensor model built in this example can be incorporated into the camera simulation workflow for a holistic assessment of the CMOS camera system, including the macroscopic camera lenses and the scene where the camera is exposed to.
Step 1: Optical simulations (Optical efficiency and charge generation rate)
In this step, we calculate the optical efficiency (OE) and the charge carrier generation rates as a function of incident angle (including polar angle θ and azimuthal angle φ), polarization, and wavelength. Both results are calculated with broadband FDTD simulations using a plane wave source with Bloch boundary conditions and sweeping over the angular and polarization configuration of the source (for more information see Important model settings ).
Step 2: Electrical simulation (Weighting function)
A 3D electrical simulation is used to simulate a Bayer cell. The purpose of this step is to evaluate the weighting function, which is the spatial probability that the generated charges could be collected in the n-well of a given pixel. We need to run the electrical simulation only once since its results are independent of the incident light, i.e., the wavelength, incident angle, and polarization. Additionally, we assume that the R, G, B pixels have the same doping profiles as well as the electrode layouts. Hence, we only calculate the weighting function for the n-well of one pixel and map the result to the four pixels of a Bayer cell.
Step 3: Internal and external quantum efficiency (IQE and EQE)
With the results from Step 2, we can obtain the IQE as a function of incident angle, polarization, and wavelength. Finally, we can calculate the EQE by multiplying the IQE with the OE.
The EQE data describes the performance of the sensor pixels to convert incident photons to collected charge carriers. This data can be included in a complete camera system simulation, as explained in this example.
Run and results
Instructions for running the model and discussion of key results
The workflow is split into six Lumerical scripts, which are called in the right sequence by the main (driver) script CMOS_workflow.lsf. In addition, the workflow is controlled by the parameters in the configuration file config_data.json, such as wavelength and incidence angles. Additionally, the “flag” parameters in the configuration file allow users to run specific simulations or analyses. Details about the parameters of the configuration files could be found in the Important model settings section.
The workflow has been previously run. Here are the steps to rerun this workflow:
- Modify settings in the configuration file config_data.json if necessary. (e.g. “flag” parameters for activating simulation or analysis, and parameters for source angles as well as wavelengths)
- Open and run CMOS_workflow.lsf
This workflow would generate several simulations, as such recommended to check the data from the previously run simulations under “Associated files”. Here we focus on elaborations of key results.
Optical simulation
The results of the optical simulation, OE, and normalized generation rate, are saved as OE_data.mat and Gnorm_data.mat separately.
[[NOTE:]] Due to the huge file size of Gnorm_data.mat , we did not include this file here.
We could check OE using the following commands in the script prompt:
matlabload('OE_data.mat');
visualize(OE_all_angles);
As we can see in the following figure, the OE data is saved in terms of the incident angles (θ and φ), wavelength, and polarization (1=x-pol, 2=y-pol, 3=unpolarized= (x-pol+y-pol)/2).
The terms phi_quad here denotes the phi angle for the first quadrant, i.e. φ from 0 to 90, as we assume the four-fold symmetry by sweeping phi. We will map the result here to the rest three quadrants in the EQE calculation.
The normalized generation rate is saved in terms of the spatial coordinates, incident angles, and wavelength. An example of the data obtained after running the optical simulations and analysis is shown below for the top of the silicon substrate and a wavelength of 0.4um.
As expected, the charge generation is mostly confined to the pixel ‘B’ of the Bayer cell for a normal-incident blue light (400 nm). However, for an oblique incidence, the fraction of charges generated in the neighboring pixels would increase due to optical crosstalk as can be seen in the following image:
Electrical simulation
The weighting function results from the electrical simulations are saved as an unstructured dataset, W_optimized_fem_data.mat . For the data to be compatible with the rectilinear datasets from previous optical simulations for further analysis in the next step, we interpolate the unstructured data onto a rectilinear grid and save it as W_optimized_rect_data.mat (visualized below).
You can visualize the weighting function in terms of the spatial coordinates and the ‘subpixel’ (specific pixel of the Bayer cell). The subpixel values of 1,2,3, and 4 corresponds to the ‘G1’, ‘B’, ‘R’, and ‘G2’ pixels, respectively.
Below is the weighting function for G1, which is the probability of a charge carrier at a given position to be collected in the n-well at the pixel “G1”.
The above shows the potential crosstalk effects due to the nonzero values in the neighboring pixels of G1. For example, the B pixels on the left and right-hand side of G1 have some probability of charge collection, especially the one on the left, as shown here at the right edge of the color plot due to the folding of the weighting function in the Bayer cell used in the optical simulations. This can be understood by shifting the B pixel to the left of the G1 pixel using the periodicity of the system, as shown in the diagram below.
The main reason for the larger contribution from the B pixel to the left of the G1 pixel is that the doping distribution is not symmetric around the center of the pixel (e.g., the n-well is off-centered). Clearly, this is an important design consideration.
EQE, IQE extraction
The IQE and EQE results are saved into IQE_data.mat and EQE_data.mat , respectively. Both results are a function of incident angle, wavelength, and pixel. The following image shows the EQE results of the four pixels at the respective wavelengths corresponding to the absorption peaks of the color filter materials.
The higher overall EQE in the blue pixel compared to other pixels is mainly due to the higher absorption coefficient of the silicon at a shorter wavelength. The concentration of charges generated by blue light is higher and confined closer to the silicon surface than those generated by green and red light, resulting in a higher collection probability in the n-well.
Important model settings
Description of important objects and settings used in this model
Child scripts of the workflow
In optical simulations, CMOS_workflow.lsf will call the following sub-scripts:
- run_optical_simulations.lsf : Sweeps the angles and polarizations, saves the resulting OEs and generation rates as individual .mat files as well.
- optical_data_analysis.lsf : Works on the incoherent sum of the polarizations as well as the interpolation for the Bloch boundary conditions.
The corresponding sub-scripts for electrical simulations include:
- run_electrical_simulations.lsf : Runs the CHARGE simulation.
- electrical_data_analysis.lsf : Interpolates data from the finite element grids in CHARGE to the finite different grids in FDTD. This makes the calculation of the IQE easier since we can obtain it by directly multiplying the weighting function from CHARGE with the optical generation rate from FDTD. Note that the weighing function of the single pixel is mapped onto the whole Bayer cell for the IQE calculation.
Finally, iqe_calculation.lsf and eqe_calculation.lsf are applied to evaluate IQE & EQE based on the following equations:
$$ IQE(\lambda,\theta,\phi) = \int_V G_{norm}(r,\lambda,\theta,\phi)*W(r) dV $$
$$ EQE(\lambda,\theta,\phi) = OE(\lambda,\theta,\phi)*IQE(\lambda,\theta,\phi) $$
The sub-script eqe_export.lsf is optionally run to save the EQE data in a JSON file that can be used in the camera simulation workflow in Speos. See the Appendix section for more information.
Parameters in the configuration file
The configuration file config_data.json defines several parameters that would be used in the simulation. Here we only focus on the key parameters that may be modified. The rest of the parameters do not need to be modified in most cases. See Appendix for a complete description.
- flags: These parameters are used to set whether to run the particular simulation or analysis. For example, the main script CMOS_workflow.lsf will run optical_data_analysis.lsf when "analyze_optical” is “true”.
- optical_simulation: This category contains parameters that would be applied in optical simulation and analysis. “reference” in “file_names” should be the same as the name of optical simulation file. “angular_gird” consists of source angles (θ and φ) that would be used in sweep.“spectral_sampling” consists of interested wavelength range as well as the wavelength numbers.
- electrical_simulation: “reference” in “file_names” should be the same as the name of electrical simulation file. "nw_config" define which pixel in the simulation file and is supposed to be the position of center pixel.
“CMOS_sensor_optical_analysis” analysis group
The immediate result that this analysis group returns is the absorbed power, Pabs. We calculate the OE by integrating the Pabs over the volume of the Si region and normalizing it to the input power. The generation rate is obtained by dividing the Pabs with the photon energy, ℏω.
Note that the generation rate data for each subpixel is normalized to the total generation rate of the Bayer cell. For details, please visit this whitepaper .
Interpolation with Bloch boundary condition
There are multiple ways to simulate a broadband planewave source with oblique incidence:
- BFAST
- Single-frequency sweep with Bloch boundaries
- Broadband simulation with Bloch boundaries
In this simulation, we chose to use the last approach due to its reasonable accuracy and simulation time. For the plane wave source with Bloch boundary conditions, the polar angle of injection varies with wavelength. Therefore, it is necessary to interpolate between broadband results of simulations with multiple values of angle theta to obtain the broadband response for a given polar angle. For more information, please visit the relevant link .
Simulation bandwidth in FDTD object
In the interpolation step, we set up the simulation in a sweep that updates the source wavelength in each simulation file. By default, modifying wavelengths triggers change to the mesh size and material fitting ranges of a simulation. To avoid this, we have enabled simulation bandwidth setting in the FDTD object, this can lock the fitting range as well as mesh size in all simulation files.
Simulation region in electrical simulation
The electrical simulation calculates the crosstalk between neighboring pixels, which becomes more of an issue as the size of the device becomes smaller. For a more accurate calculation, the electrical simulation region needs to include regions beyond the pixel of interest. Ideally, we would want to include the whole nine pixels in the simulation and calculated the weighting function of the center pixel, accounting for the crosstalk with the surrounding eight pixels. However, we included only part of the surrounding pixels in this example to reduce the memory and the simulation time. It should be noted that the optimum size of the simulation region depends on individual designs and that convergence tests need to be performed to figure out the desired span.
Strategies for reducing memory requirement and speeding up simulations.
Since the workflow here involves many sweeps, the simulation time can be considerably longer. You can have a look at this page for some tips on speeding up the simulations.
You can also consider using the spatial down-sampling in your monitor to reduce the size of the recorded data, e.g. the generation rate.
Updating the model with your parameters
Instructions for updating the model based on your device parameters
Color filter materials
We are using the Lorentz material model to create a dispersive material compatible with broadband simulations. See the Lorentz_permittivity_model.lsf for details.
Custom structures
CMOS sensors technology keeps progressing with a better performance on resolution, sensitivity, crosstalk, etc. For instance, back-side illumination (BSI) designs are developed for higher sensitivity compared with more traditional front-side illumination (FSI) ones. Deep-trench isolation (DTI) is applied to reduce the crosstalk between neighboring sensor pixels.
This flow is feasible with these structures. However, it is suggested to go through the original files first before making changes. If a new structure is imported, make sure you set the correct file name in the configuration file config_data.json . Please see “Parameters in the configuration file” in “Important model settings” for more information.
Taking the model further
Information and tips for users that want to further customize the model
Point spread function (PSF)
Together with OE, PSF is also a frequently used metric to characterize the optical properties of CMOS image sensors. Broadly speaking, it is a measure of spatial crosstalk — i.e., how much light is detected in neighboring pixels when a specific pixel is fully illuminated. Please visit here for further information and example files.
Response for arbitrary illumination
The approach in the above PSF example uses an array of “thin lens” Gaussian beams to mimic a source uniformly illuminating a specific pixel. This requires the simulation to have PML boundaries in all directions and a large simulation region. Additionally, you need to run separate simulations to obtain the results for different objective lenses. Fortunately, there is a much faster and more efficient approach available, which uses an incoherent sum of results for planewave illumination to reconstruct the response of any arbitrary illumination (including arbitrary objective lens). For further information about this approach based on the planewave, please see [1]
Microlens shift
As we have shown in the example, OE drops as the incident angle is increased. Moreover, oblique lights also heighten the crosstalk between pixels. Shifting the microlens is one way of compensating for the detrimental effect of this crosstalk. See “Step 3” of the Run and results section of this example .
Additional resources
Additional documentation, examples, and training material
Related publications
- J. Vaillant, A. Crocherie, F. Hirigoyen, A. Cadien, and J. Pond, "Uniform illumination and rigorous electromagnetic simulations applied to CMOS image sensors," Opt. Express 15, 5494-5503 (2007)
Webinar
CMOS Sensor Camera: Image Quality Analysis in a 3D Scene
See also
- CMOS Sensor Camera - Image Quality Analysis in a 3D Scene
- CMOS image sensor - Angular response 3D
- CMOS - Green's function IQE method
- CMOS - Broadband simulations
- Broadband simulation with Bloch boundary condition
Related Ansys Innovation Courses
Appendix
In this appendix we describe in detail the input file config_data.json used to setup the Lumerical workflow. We also explain the JSON format used for the output EQE data and how this data is consumed by SSS Exporter in Speos for the system-level simulation of the camera.
Description of config_data JSON file
At the top-level, the configuration JSON file is a single dictionary with five keys:
Top-level Keys | Description |
---|---|
flags
|
Includes parameters for activating each part of the flow. See
flags
table below. |
optical_simulation
|
Defines parameters for optical simulation use, such as incident angle. See
optical_simulation
table below. |
electrical_simulation
|
Defines parameters for electrical simulation use, including weighting function mapping for a Bayer matrix. See
electrical_simulation
table below. |
quantum_efficiency
|
Dictionary for quantum efficiency calculations. The IQE and EQE are stored in mat format. See
quantum_efficiency
table below. |
speos_data
|
Defines the input and the output filename for EQE data. The EQE data is recorded in a JSON format. See the last section for additional information. |
Each key in the dictionary is described below:
Dictionary | Keys | Description |
---|---|---|
flags
|
run_optical
,
analyze_optical
,
run_electrical
,
analyze_electrical
,
calculate_iqe
,
calculate_eqe
,
export_eqe
|
Set "true" to run specific simulation or analysis. For example, set
run_optical
as “true” to run optical simulations |
optical_simulation
|
file_names
|
|
analysis_name
|
Name of analysis group in the FDTD file | |
angular_grid
|
Angular information to be used in the parameter sweep.
|
|
spectral_sampling
|
Wavelength range and resolution | |
electrical_simulation
|
file_names
|
|
nw_config
|
Choose one of the following settings:
|
|
quantum_efficiency
|
file_names
|
|
speos_data
|
file_names
|
|
Electron Map (XMP) calculation in Speos Sensor System (SSS) Exporter
For each pixel in each Bayer unit cell of the sensor, the exposure map \(E(\lambda)\) is combined with the EQE data to calculate the number of charges \(N_c\) collected at the pixel without saturation according to:
$$ N_c = \int_{\lambda_{min}}^{\lambda_{max}}[\frac{\lambda}{hc}{EQE}_{pix}(\lambda)E(\lambda)A_{pix}]d\lambda $$
In this expression, \(h\) is Planck’s constant, \(c\) is the speed of light in vacuum, \(A_{pix}\) is the area of the pixel and \({EQE}_{pix}(\lambda)\) is the EQE data at a particular wavelength \(\lambda\) interpolated from the original EQE data at the Chief Ray Angle (CRA) of light incident on that pixel.
Speos Sensor System (SSS) Exporter calculates the final number of charges collected by the pixel, \(N_{pix}\), truncating \(N_c\) with the absolute threshold sensitivity and dynamic range defined in the EMVA1288 standard (release 3.1). This final number of charges is saved as an XMP file (see camera simulation workflow ) with the pixel arrangement shown below.
Note that the choice of Bayer unit cell is not the same as in the FDTD project file (see Step 2 of Overview section). However, both conventions are equivalent for a perfectly periodic array: the FDTD convention can be obtained from the Speos one by grouping the bottom row of a Speos unit cell with the top row of the unit cell right below.
See EQE JSON data file description below for additional information on how the EQE data, \(t_{int}\) and \(N_s\) are specified.
Description of EQE JSON data file
At the top-level, the EQE JSON data file is a single dictionary with four keys:
Top-level Keys | Description |
---|---|
calculation_inputs
|
Dictionary with multiple keys. See |
calculation_output
|
Dictionary with single key: "data":\([[angles]_{[\theta,\phi]},[EQE]_{\lambda, p, [\theta,\phi]}]\), which is a list of lists:
|
Each key of the
calculation_inputs
dictionary is a dictionary itself, as described below:
Dictionary | Keys | Description |
---|---|---|
output pupil incidences
|
CRA from Zemax blackbox, used by SSS Exporter | |
data
|
List \([[\mathcal{R}_1,...,\mathcal{R}_{N_\vartheta}],[\vartheta_1,...,\vartheta_{N_\vartheta}]]\) with radial position \(\mathcal{R}\) in imager (float,mm) vs. CRA \(\vartheta\) (float, rad) | |
spectral_sampling
|
Wavelength sampling used by SSS Exporter, which must be the same as
optical_simulation
:
spectral_sampling
in config_data.json (see Description of config_data JSON file section) |
|
lambda_max
|
Maximum wavelength (float, nm) \(\lambda_{max}\) | |
lambda_min
|
Minimum wavelength (float, nm) \(\lambda_{min}\) | |
nb_lambda
|
Number (integer) of wavelengths \(N_{\lambda}\) |
The key calculation_inputs
must be included in the input JSON file specified by
speos_data
in the configuration file ( EQE_input.json in the attached example, see Description of config_data JSON file). The script eqe_export.lsf will automatically combine this input with the EQE data from simulation saved as
calculation_output
to generate the final data file ( EQE_output.json in this example).