{ "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "%This notebook demonstrates the use of the workpackage template, replace with your own.\n", "\n", "\\documentclass[english]{workpackage}[1996/06/02]\n", "\n", "% input the common preamble content (required by the ipnb2latex converter)\n", "\\input{header.tex}\n", "\n", "% then follows the rest of the preamble to be placed before the begin document\n", "% this preamble content is special to the documentclass you defined above.\n", "\\WPproject{Computational Radiometry} % project name\n", "\\WPequipment{} % equipment name\n", "\\WPsubject{09b Staring Staring Array Sensors} % main heading \n", "\\WPconclusions{} \n", "\\WPclassification{} \n", "\\WPdocauthor{CJ Willers}\n", "\\WPcurrentpackdate{\\today}\n", "\\WPcurrentpacknumber{} % work package number\n", "\\WPdocnumber{} % this doc number hosts all the work packages\n", "\\WPprevpackdate{} % work package which this one supersedes\n", "\\WPprevpacknumber{} % work package which this one supersedes\n", "\\WPsuperpackdate{} % work package which comes after this one\n", "\\WPsuperpacknumber{} % work package which comes after this one\n", "\\WPdocontractdetails{false}\n", "\\WPcontractname{} % contract name \n", "\\WPorderno{} % contract order number\n", "\\WPmilestonenumber{} % contract milestone number\n", "\\WPmilestonetitle{} % contract milestone title\n", "\\WPcontractline{} % contract milestone line number \n", "\\WPdocECPnumber{} % ecp\\ecr number\n", "\\WPdistribution{}\n", "\n", "% this is entered just before the end{document}\n", "\\newcommand{\\atendofdoc}{\n", "\\bibliographystyle{IEEEtran}\n", "\\bibliography{bibliography.bib}\n", "}\n", "\n", "%and finally the document begin.\n", "\\begin{document}\n", "\\WPlayout\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "# Staring Array Modelling" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "This notebook forms part of a series on [computational optical radiometry](https://github.com/NelisW/ComputationalRadiometry#computational-optical-radiometry-with-pyradi). The notebooks can be downloaded from [Github](https://github.com/NelisW/ComputationalRadiometry#computational-optical-radiometry-with-pyradi). These notebooks are constantly revised and updated, please revisit from time to time. \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The date of this document and module versions used in this document are given at the end of the file. \n", "Feedback is appreciated: neliswillers at gmail dot com." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Overview" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The pyradi [`rystare`](http://nelisw.github.io/pyradi-docs/_build/html/rystare.html) module models the signal and noise in CCD and CMOS staring array sensors. The code is originally based on the Matlab code described in *'High-level numerical simulations of noise in solid-state photosensors: review and tutorial'* by Mikhail Konnik and James Welsh, arXiv:1412.4031v1 [astro-ph.IM], available [here](http://arxiv.org/pdf/1412.4031.pdf).\n", "\n", "An earlier version (20161020) of a Python version of the model was presented at the Fourth SMEOS conference and was published in SPIE Proc 10036 (2016). The PDF is available here: \n", "https://github.com/NelisW/pyradi/blob/master/pyradi/documentation/SM200-30-staring-array-modeling.pdf\n", "\n", "Good additional references for this work include James R Janesick's books ['Photon Transfer'](http://spie.org/Publications/Book/725073) and ['Scientific Charge-Coupled Devices'](http://spie.org/Publications/Book/374903)\n", "\n", "This notebook provides an introduction to the model, whereas notebooks 09c and 09d provide applications of the model to visual and infrared sensors.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "import numpy as np\n", "import scipy as sp\n", "import pandas as pd\n", "import re\n", "import os.path\n", "from scipy.optimize import curve_fit\n", "import datetime\n", "\n", "from matplotlib import cm as mcm\n", "import matplotlib.mlab as mlab\n", "import scipy.constants as const\n", "import collections\n", "\n", "%matplotlib inline\n", "\n", "# %reload_ext autoreload\n", "# %autoreload 2\n", "\n", "# import xlsxwriter\n", "\n", "import pyradi.ryplot as ryplot\n", "import pyradi.ryfiles as ryfiles\n", "import pyradi.rystare as rystare\n", "import pyradi.ryutils as ryutils\n", "import pyradi.rypflux as rypflux\n", "import pyradi.ryplanck as ryplanck\n", "\n", "from IPython.display import HTML\n", "from IPython.display import Image\n", "from IPython.display import display\n", "from IPython.display import FileLink, FileLinks\n", "\n", "#make pngs at stated dpi\n", "import matplotlib as mpl\n", "plotdpi = 72\n", "mpl.rc(\"savefig\", dpi=plotdpi)\n", "mpl.rc('figure', figsize=(10,8))\n", "# %config InlineBackend.figure_format = 'svg'\n", "\n", "pd.set_option('display.max_columns', 80)\n", "pd.set_option('display.width', 200)\n", "pd.set_option('display.max_colwidth', 150)" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "# Sensor model" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Sensor Geometry" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Consider the simple sensor model depicted below.\n", "\n", "!['images/camerascheme-horiz.png'](images/eosystem01.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "For a detector array with $n_{\\beta} \\times n_{\\alpha}$ detector elements, with dimensions $b$ and $a$ [m], the area of one detector element [m\\textsuperscript{2}] is\n", "\n", "\\begin{equation}\\label{eq:detarea}\n", " A_\\textrm{det} = a b.\n", "\\end{equation}\n", "\n", "The detector element field of view angles, $\\beta$ and $\\alpha$ [rad], in the focal plane of a sensor with a lens focal length $f$ [m], can be approximated for \\textit{small linear angles} by\n", "\n", "\\begin{eqnarray}\n", "\\beta &=& \\frac{b}{f} \\\\\n", " \\alpha &=& \\frac{a}{f},\n", "\\end{eqnarray}\n", "\n", "with sensor pixel field of view solid angle [sr] given by\n", "\n", "\\begin{eqnarray}\n", "\\omega_\\textrm{ifov} &=& \\alpha \\beta \\nonumber \\\\\n", " &=& \\frac{ab}{f^2} \\nonumber \\\\\n", " & = & \\frac{A_\\textrm{det}}{f^2}.\n", "\\end{eqnarray}\n", "\n", "The detector array total field of view solid angle is\n", "\n", "\\begin{equation}\n", "\\Omega = n_{\\alpha} n_{\\beta} \\omega_\\textrm{ifov}.\n", "\\end{equation}\n", "\n", "\n", "!['images/camerascheme-horiz.png'](images/cassegrain.png)\n", "\n", "\n", "The figure above shows the layout of a Cassegrain telescope. In the following derivation the diameter of the entrance pupil is the outer diameter of the aperture, irrespective of the size of the central obscuration. The diameter of the obscuration is the inner diameter of the clear aperture. It is assumed that the sensor is focussed at infinity.\n", "\n", "For focus at infinite conjugates, the entrance pupil diameter $D_\\textrm{pupil}$ [m] and clear aperture area $A_\\textrm{pupil} $ [m\\textsuperscript{2}] are described in terms of the F-number of the optics, $F_{\\#}$ , and detector size as\n", "\\begin{eqnarray}\n", "D_\\textrm{pupil} & = & \\frac{f}{F_{\\#}} \\\\\n", "A_\\textrm{pupil} & = & \\pi \\left( \\frac{D_\\textrm{pupil} }{2} \\right) ^2 \\nonumber \\\\\n", " & = & \\frac{ \\pi f^2 }{4 F_{\\#}^2 } \\nonumber \\\\\n", " & = & \\frac{\\pi a b}{4 \\omega_\\textrm{ifov} F_{\\#}^2}.\n", "\\end{eqnarray}\n", "\n", "The central obscuration area is expressed as a fraction $r_\\textrm{central}$ of the entrance pupil diameter\n", "\\begin{eqnarray}\n", "D_\\textrm{obs}& = & r_\\textrm{central}D_\\textrm{pupil}\\\\\n", "A_\\textrm{obs}& = & \\pi \\left( \\frac{D_\\textrm{obs} }{2} \\right) ^2. \\label{simopte}\n", "\\end{eqnarray}\n", "\n", "The flux collecting area, i.e., the nominal clear aperture area, is calculated as\n", "\\begin{equation}\n", "A_\\textrm{clear} = A_\\textrm{pupil} - A_\\textrm{obs}. \\label{eq:energycollectingarea}\n", "\\end{equation}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "!['images/camerascheme-horiz.png'](images/RadiometrySolidAngles.png)\n", "\n", "The (rotationally symmetrical) solid angles in the sensor are shown in Figure~\\ref{fig:RadiometrySolidAngles}, where\n", "$\\omega_\\textrm{cold shield}=\\Omega_\\textrm{cold shield}$ is the detector cold shield solid angle,\n", "$\\omega_\\textrm{inside}=\\Omega_\\textrm{inside}$ is the is sensor exposed inside solid angle,\n", "$\\omega_\\textrm{clear}=\\Omega_\\textrm{clear}$ is the clear optical aperture solid angle, and\n", "$\\omega_\\textrm{obs}=\\Omega_\\textrm{obscured}$ is the central obscuration solid angle.\n", "The sum of all the solid angles is equal to the projected hemispherical solid angle\n", "\\begin{equation}\n", "\\pi = \\omega_\\textrm{cold shield} + \\omega_\\textrm{inside} + \\omega_\\textrm{clear}+ \\omega_\\textrm{obs}\n", "\\end{equation}\n", "\n", "The obscuration solid angle is given by\n", "\\begin{eqnarray}\n", "\\omega_\\textrm{obs} &=&\n", "\\pi\\sin^2(\\Theta_\\textrm{obs})\\\\\n", "&=&\n", "\\pi\\sin^2\\left(\\tan^{-1}\\left[\\frac{D_\\textrm{obs}}{2f}\\right]\\right),\n", "\\end{eqnarray}\n", "\n", "where\n", "$\\Theta_\\textrm{obs}$ is the half apex angle of the obscuration f-cone.\n", "\n", "The nominal clear aperture solid angle is given by\n", "\\begin{eqnarray}\n", "\\omega_\\textrm{clear} &=&\n", "\\pi\\sin^2(\\Theta_\\textrm{pupil})\n", "-\n", "\\pi\\sin^2(\\Theta_\\textrm{obs})\\\\\n", "&=&\n", "\\pi\\sin^2\\left(\\tan^{-1}\\left[\\frac{D_\\textrm{pupil}}{2f}\\right]\\right)\n", "-\n", "\\omega_\\textrm{obs},\n", "\\end{eqnarray}\n", "where\n", "$\\Theta_\\textrm{pupil}$ is the half apex angle of the aperture f-cone.\n", "\n", "The cold shield solid angle is calculated from the detector cold shield F-number $\\omega_\\textrm{Fcone}=\\pi\\sin^2\\theta^\\prime$\n", "\\begin{equation}\n", "\\omega_\\textrm{cold shield}\n", "= \\pi - \\omega_\\textrm{Fcone}\n", "= \\pi \\left(1-\\sin^2\\theta^\\prime\\right)\n", "= \\pi \\left(1-\\frac{1}{4F^2_{\\#\\textrm{det}}}\\right)\n", "\\end{equation}\n", "It is assumed that the detector F-number is the same for all spectral bands.\n", "\n", "For a detector with a cold shield efficiency different from 100\\%, i.e., the detector cold shield $F_{\\#}$ is smaller than the optics $F_{\\#}$, $\\omega_\\textrm{inside}$ can be calculated as\n", "\\begin{eqnarray}\n", "\\omega_\\textrm{inside}& = & \\pi - \\omega_\\textrm{clear}- \\omega_\\textrm{cold shield}-\\omega_\\textrm{obs}\\\\\n", "&=&\n", "\\pi - \\omega_\\textrm{clear} - \\pi \\left(1-\\frac{1}{4F^2_{\\#\\textrm{det}}}\\right)-\\omega_\\textrm{obs}\\\\\n", "&=&\n", "\\frac{\\pi}{4F^2_{\\#\\textrm{det}}} - (\\omega_\\textrm{clear} + \\omega_\\textrm{obs})\\\\\n", "&=&\n", "\\frac{\\pi}{4F^2_{\\#\\textrm{det}}} - \\frac{\\pi}{4F^2_{\\#\\textrm{optics}}}\n", "\\label{omegaoutcooled}\n", "\\end{eqnarray}\n", "\n", "\n", "A 100\\% effective cold shield, $\\omega_\\textrm{inside}=0$, can also be simulated by setting the sensor inside emissivity to 0 so that no radiation is coming from the sensor inside irrespective of the two solid angle values.\n", "\n", "If the detector cold shield solid angle is smaller than the optics solid angle, the cold shield will vignet and the optics F-number is set equal to the cold shield F-number.\n", "\n", "An uncooled detector cold shield must be modelled by setting the F-number to 0.5.\n", "\n", "\n", "\n", "The high resolution image is normally created in higher resolution than the required sensor image resolution to allow for modelling of optical defects and sensor effects in the sensor model, refer to Figure~\\ref{fig:imageconventions}. The high resolution image field of view is therefore determined by\n", "\n", "\\begin{itemize}\n", " \\item the sensor instantaneous field of view, $\\beta$ and $\\alpha$,\n", " \\item the number of detector elements, $n_{\\beta}$ and $n_{\\alpha}$,\n", " \\item the number of high resolution pixels used to create one sensor pixel, $m_{\\beta}$ and $m_{\\alpha}$.\n", "\\end{itemize}\n", "\n", "The high resolution image size is $m_{\\beta} n_{\\beta} \\times m_{\\alpha} n_{\\alpha}$ pixels with instantaneous field of view calculated as\n", "\n", "\\begin{eqnarray}\n", "\\beta_\\textrm{h} &=& \\beta / m_{\\beta} \\\\\n", "\\alpha_\\textrm{h} &=& \\alpha / m_{\\alpha}.\n", "\\end{eqnarray}\n", "\n", "The high resolution image field of view linear angles in the vertical and horizontal directions are\n", "\n", "\\begin{eqnarray}\n", "\\theta_{\\beta_\\textrm{h}} &=& m_{\\beta} n_{\\beta} \\beta_\\textrm{h} = n_{\\beta} \\beta \\\\\n", "\\theta_{\\alpha_\\textrm{h}} &=& m_{\\alpha} n_{\\alpha} \\alpha_\\textrm{h} = n_{\\alpha} \\alpha.\n", "\\end{eqnarray}\n", "\n", "A field of view expansion factor, $f_\\textrm{exp}$, is used to expand the field of view of the high resolution image to allow for gimbal and missile movement in the high resolution image between image builds. The expansion is also required when convolution with an \\ac{OPSF} is used. The slightly larger high resolution image provides for a valid convolution process on the edges of the image.\n", "The high resolution image field of view field linear angles are then $f_\\textrm{exp}\\theta_{\\beta_\\textrm{h}}$ and $f_\\textrm{exp}\\theta_{\\alpha_\\textrm{h}}$.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Scene Irradiance at the Optical Aperture\n", "\n", "The radiance from the scene in a pixel of the high resolution image includes components reflected from the object, i.e., diffuse ($L_\\textrm{sun\\_d}$) and specular reflected ($L_\\textrm{sun\\_s}$) sun, environmental radiance ($L_\\textrm{env}$) from the terrain and the sky, as well as the radiance emitted ($L_\\textrm{self}$) by the object in the pixel field of view, the background radiance transmitted ($L_\\textrm{back}$) through partially transparent objects and the atmospheric path radiance ($L_\\textrm{path}$). Accurate radiometric radiance [W/m\\textsuperscript{2}sr] for each pixel in the high resolution image is calculated using the rendering equation described in the Modelling Report \\cite[Equation~\\ref{MR0802-eq:rendering}]{ossimModellingReport2016}:\n", "\n", "\n", "\\begin{displaymath}\n", "L_\\textrm{scene} =\n", "L_\\textrm{self} +\n", "L_\\textrm{path} +\n", "L_\\textrm{back} +\n", " (\n", " L_\\textrm{env} +\n", " L_\\textrm{sun\\_d} +\n", " L_\\textrm{sun\\_s}) ,\n", "\\end{displaymath}\n", "\n", "where\n", "\n", "\n", "\\begin{displaymath}\n", "L_\\textrm{env} =\n", " L_\\textrm{sky} +\n", " L_\\textrm{terrain\\_emit} +\n", " L_\\textrm{terrain\\_refl}.\n", "\\end{displaymath}\n", "\n", "\n", "All the components in the above equation are calculated by the high resolution image renderer and are described in detail in \\cite[Chapter~\\ref{MR0800-sec:radiometry}]{ossimModellingReport2016}.\n", "\n", "The high resolution image pixels are filled with the irradiance [W/m\\textsuperscript{2}] at the optical aperture\n", "\n", "\\begin{equation}\n", " E_\\textrm{scene} = \\alpha_\\textrm{h} \\beta_\\textrm{h} L_{\\rm scene}. \\label{eq:Ehiresscene}\n", "\\end{equation}\n", "\n", "This irradiance is valid for the high resolution image pixel solid angle and for a normalised spectral system response. In the sensor model, optical aperture irradiance is collected from the high resolution image by summation of the irradiance of the high resolution pixels in one sensor pixel\n", "\n", "\\begin{equation}\n", "E_\\textrm{e-optics}= {\\cal S}_{\\textrm{system peak}} \\sum^{m_{\\beta}}_{i=0} \\sum^{m_{\\alpha}}_{j=0} E_{\\textrm{scene}_{ij}}. \\label{eq:irrpupil1}\n", "\\end{equation}\n", "\n", "\n", "The \\ac{OPSF} is defined as the response of an optical system to a point source of light. The response of the system can be written directly as the convolution of the spatial distribution and the point spread function. If an \\ac{OPSF} is modelled, convolution with the \\ac{OPSF} kernel is included in Equation~\\ref{eq:irrpupil1}.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "### FPA Sensor model" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "A comprehensive CCD and CMOS staring array sensor model is provided in the pyradi [`rystare`](http://nelisw.github.io/pyradi-docs/_build/html/rystare.html) module. The [`rystare`](http://nelisw.github.io/pyradi-docs/_build/html/rystare.html) model is originally based on the Matlab code described in *'High-level numerical simulations of noise in solid-state photosensors: review and tutorial'* by Mikhail Konnik and James Welsh, arXiv:1412.4031v1 [astro-ph.IM], available [here](http://arxiv.org/pdf/1412.4031.pdf). Good references for this work include James R Janesick's books ['Photon Transfer'](http://spie.org/Publications/Book/725073) and ['Scientific Charge-Coupled Devices'](http://spie.org/Publications/Book/374903). Konnik's model is also implemented in Python as described in notebook 09b of this series, available here: \\url{http://nbviewer.jupyter.org/github/NelisW/ComputationalRadiometry/blob/master/09b-StaringArrayDetectors.ipynb}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "!['images/sensenode02.png'](images/sensenode02.png)\n", "\n", "Modern digital \\ac{FPA} detectors employ (Figure above adapted from \\cite{Murray2011})\n", "\\begin{enumerate}\n", " \\item an array of detectors to capture the photons and convert them to electrons, and\n", " \\item a \\ac{ROIC} to transform the detector signal into a serial data stream.\n", "\\end{enumerate}\n", "Both these topics will be exploed in more detail below.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "As is evident in the rystare model block diagram, the model covers only the sensor signal path, including noise, signal integration and signal conditioning (photon signal generation is not part of this model).\n", "The components of the rystare model are shown below:\n", "\n", "!['images/camerascheme-horiz.png'](images/camerascheme-horiz.png)\n", "\n", "The rystare model is used as a reference for this model, there is not a one-to-one mapping between elements of the two models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "!['images/sensenode01.png'](images/sensenode01.png)\n", "\n", "The figure above shows a simplified diagram illustrating typical \\ac{FPA} processing. Real devices have much more complicated circuitry, containing patented techniques. The photoelectron current is integrated in the charge well capacitor for a specified integration time period $t_\\textrm{int}$ (synchronized with the data clock). The charge well capacitor may or may not be the actual detector junction capacitance. The charge well capacitor ($C$) accumulates charges, but in the process also provides a voltage ($V$) signal proportional to the charge ($Q$), by $Q=CV$, hence $V=Q/C$. The charge well capacitance exists in a semiconductor device and hence the capacitance depends on the voltage across the capacitor: the transfer function from charge to voltage may therefore be nonlinear $V=Q/C(V)$ in some devices.\n", "The charge well has a finite charge capacity, constrained by the well capacitance and the allowable maximum signal voltage range.\n", "Prior to the integration time start the charge well capacitor is reset to a nonzero reference voltage $V_\\textrm{Ref}$ (a value around 2 to 3~V), and during integration the capacitor is discharged from $V_\\textrm{Ref}$ to some lower value closer to zero. The signal is the change in voltage from the initial $V_\\textrm{Ref}$. The \\ac{CDS} circuit employs two \\ac{SHA} circuits to eliminate pixel-to-pixel reference voltage offset differences.\n", "During pixel value reset, prior to the integration period, the first \\ac{SHA} samples the pixel reset voltage. The second \\ac{SHA} samples the pixel voltage after integration. The \\ac{CDS} circuit measures the difference between the two \\ac{SHA}s, thereby removing the effect of $V_\\textrm{Ref}$ differences between pixels.\n", "\n", "\n", "The model accepts an input image in photon rate [q/s)] \\emph{in the detector plane} and then proceeds to calculate the various noise components and signal components along the signal flow chain. The signal chain is depicted in Figure~\\ref{fig:Sensormodelelements}. The captured photoelectron charge in the detector is determined by the flux on the detector and integration time. The photoelectron charge is converted to a voltage in the sense node, is further processed and finally converted to a digital count.\n", "The software exports the various intermediate image planes as shown in Figure~\\ref{fig:Sensormodelelements} in a telemetry file, see Section~\\ref{sec:photonsetup}.\n", "\n", "Many noise sources contribute to the resulting noise image produced by the sensor. Noise sources can be broadly classified as either \\emph{fixed-pattern} (spatially stable, time invariant) or \\emph{temporal} (time-variant) noise. Fixed-pattern noise refers to any spatial pattern that does not change significantly from frame to frame. Temporal noise, on the other hand, changes from one frame to the next. All these noise sources are modelled in various blocks in the signal chain. Different noise sources have different noise statistics. Noise power from multiple uncorrelated noise sources adds in quadrature (noise variance adds linearly). However, at specific moments in time the instantaneous (sampled) noise magnitudes add linearly with the signal to yield the total signal at that instant.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The model includes photon noise and fixed pattern non-uniformity noise. However for low light level work a more comprehensive noise model, such as Konnik's model, is required.\n", "The components of the noise model include \n", "\n", "1. Photon signal noise.\n", "2. Detector response non-uniformity.\n", "3. Dark current shot noise.\n", "4. Fixed pattern dark current noise.\n", "5. Read noise also known as kTC reset noise.\n", "6. Source follower noise.\n", "7. Quantisation noise.\n", "\n", "If the magnitudes of these noise components are not available, we can just assume zero values to ignore these.\n", "\n", "The various noise sources are assumed non-correlated and add in quadrature (with apropriate gain scaling).\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "### Photon noise \n", "\n", "Photon noise for a flux signal is given by the square root of the signal photon count. The signal photon count comprises photons from the scene (target and background temperatures assumed to the more or less the same), photons from inside the sensor such as hot optics (other sources ignored for now), and atmosperic path radiance. On the assumption that the atmospheric path temperature is close to the scene temperature the path radiance plus attenuated scene radiance would be more or less equal to the unattenuated scene radiance, i.e., $L_\\textrm{path} + \\tau_\\textrm{path} L_\\textrm{scene}\\approx L_\\textrm{scene}$.\n", "\n", "Photon noise is casused by the photon signal itself. The photon signal in the detector comprises the following components:\n", "\n", "1. Reflected incident light such as sunlight, sky light or night light.\n", "1. Thermal self-emission.\n", "1. Path radiance\n", "1. Stray light and internal sensor flux sources.\n", "\n", "The total photon flux is\n", "\\begin{equation}\n", "n_{\\textrm{photons}} = n_{\\textrm{scene}} +n_{\\textrm{path}} + n_{\\textrm{optics}}\n", "\\end{equation}\n", "\n", "The photon noise is then \n", "\n", "\\begin{equation}\n", "n_{\\textrm{photnoise}} =\\sqrt{n_{\\textrm{photons}}} = \\sqrt{n_{\\textrm{scene}} +n_{\\textrm{path}}+ n_{\\textrm{optics}}}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Non-uniformity noise" ] }, { "cell_type": "raw", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "References for this material \\cite{Mooney1989,Perry1993,Holst1995,Janesick2007,Black2014}\n", "\n", "%1. JM Mooney, *et.al.*, *Responsivity nonuniformity limited performance of infrared staring cameras*, Optical Engineering, Vol 28, SPIE, 1989.\n", "\n", "%2. D Perry, *et.al.*, *Linear theory of nonuniformity correction in infrared staring sensors*, Optical %Engineering, Vol 32, SPIE, 1993.\n", "\n", "%3. GC Holst, *Electro-Optical Imaging System Performance*, JCD publishing, 1995.\n", "\n", "%4. JR Janesick, *Photon Transfer*, SPIE, 2007.\n", "\n", "%5. WT Black, *In Situ Calibration of Nonuniformity in Infrared Staring and Modulated Systems*, University of Arizona, 2014, \n", "http://arizona.openrepository.com/arizona/handle/10150/316895." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Expanding on the signal equation developed above, the general form for the pixel well fill signal can be extended to add dark noise, the $\\cos^n$ effect, and the narcissism effect\n", "\\begin{equation}\n", "n_{\\textrm{pixel}}\n", "=\n", "\\left(\\frac{\\pi\\,t_{\\textrm{int}}\\, P\\, \\cos^n(\\theta) \\,A_d }{4\\,F_\\#^2}\n", "\\right)\n", "\\int_0^\\infty \n", "(\\eta_{\\lambda}\\, \\tau_{o\\lambda}\\, \\tau_{f\\lambda}\\,\\tau_{a\\lambda})\\,\n", "\\left[\n", "L_{\\lambda\\textrm{signal}}+L_{\\lambda\\textrm{narc}}(\\theta)\\right]\\,\n", "d\\lambda \n", "+n_\\textrm{dark}\n", "\\end{equation}\n", "where \n", "$L_{\\lambda\\textrm{signal}}$ is understood to include all terms of the scene flux, including reflected flux, self-emitted flux, and optics flux (excluding narcissism), and path radiance, \n", "$L_{\\lambda\\textrm{narc}}(\\theta)$ is the optics' narcissism radiance (assumed a function of field angle only, but this is not always the case), \n", "$\\cos^n\\theta$ is the variation of flux as function of field angle $\\theta$,\n", "and\n", "$n_\\textrm{dark}$ is the dark current electrons accumulated during the integration time.\n", "\n", "The field angle variation is commonly known as the `cos-to-the-fourth' rule. Note, that $n$ is not always 4, it depends on the target orientation and size. For a flat focal plane $n$ is at least 2, but possibly larger.\n", "\n", "The optics radiance is generally modelled by a source at the sensor internal temperature and emissivity of $(1-\\tau_\\textrm{optics})$. If there is no narcissism the model is nominally valid on the assumption that the reflected component reflects the internal hardware of the sensor. If there is narcissism, some of this reflection will be from the cold detector and the assumption of a uniform internal sensor temperature is violated." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Signal spatial nonuniformity variations can be introduced by variations between detector elements in mainly the following (1) nonspectral variations such as the $A_d$ area and $\\cos^n\\theta$, (2) $\\eta_\\lambda$ quantum efficiency, (3) the narcissus effect, and (4) dark current $n_\\textrm{dark}$. It is evident that is quite challenge to develop a nonuniformity correction method that can correct for the combined multidimensional variation space.\n", "\n", "The $\\cos^n\\theta$ and narcissus are `large-scale' spatially correlated effects and are not considered here on the premise that it can be removed by signal processing means. The remaining uncorrelated pixel-level spatial nonuniformity effects are then:\n", "\n", "1. Nonspectral: mainly attributable to variations in area of the active detector and area of the charge well capacitor, and to a lesser extent differences in integration time.\n", "\n", "2. Spectral: variations in the detector material quantum efficiency across the surface of the device. The quantum efficiency variations are smaller in stable alloys such as InSb, but could to be larger in variable mix ternary alloys such as HgCdTe.\n", "\n", "3. Dark noise: variations in detector current in the absence of any incident flux. In the shorter wavelength bands this simply means covering the detector, but in the thermal bands it means presenting a (near) zero kelvin background (viewing a 77 K liquid nitrogen surface is generally sufficient for cameras observing scenes at 300 K).\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "A detailed description of the contributors to nonuniformity is given by Black, summarised here as follows:\n", "\n", "1. Detector area variation resulting from imperfect manufacturing.\n", "\n", "2. Material substrate doping variation.\n", "\n", "3. Leaky detector pixel elements with excessive dark current.\n", "\n", "4. 1/f noise from various sources: detector, electronics, and system sources.\n", "\n", "5. Charge transfer efficiency in CCD focal planes.\n", "\n", "6. Nonidentical pixels, resulting from the design process.\n", "\n", "7. Dust\n", "\n", "8. Surface variations.\n", "\n", "9. Multiplexer threshold or ohmic variations between channels.\n", "\n", "10. Interlace imbalance.\n", "\n", "11. Multiple output port imbalances.\n", "\n", "12. Device temperature variations.\n", "\n", "13. $\\cos^n$ shading.\n", "\n", "14. Vignetting.\n", "\n", "15. Calibration source surface irregularities.\n", " " ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Following Mooney's derivation, simplify the above equation modelling the pixel electron count for pixel $ij$ results in\n", "\n", "\\begin{equation}\n", "n_{ij} = R_{ij}\n", "\\int_0^\\infty \n", "L_{\\lambda ij}\\eta_{\\lambda ij} d\\lambda\n", "+D_{ij}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Define the variational elements in terms of an average value $\\langle X_{ij}\\rangle $ plus a variation $x_{ij}$:\n", "\n", "\\begin{equation}\n", "D_{ij} = \\langle D_{ij}\\rangle + d_{ij}\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "R_{ij} = \\langle R_{ij}\\rangle + r_{ij}\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "\\eta_{\\lambda ij} = \\langle \\eta_{\\lambda ij}\\rangle + k_{\\lambda ij}\n", "\\end{equation}\n", "\n", "where $d_{ij}$, $r_{ij}$, and $k_{\\lambda ij}$ has zero mean on spatial average and only the spectral nonuniformities are accounted for in $k_{\\lambda ij}$\n", "\\begin{equation}\n", "\\int_0^\\infty k_{\\lambda ij} d\\lambda = 0\n", "\\end{equation}\n", "\n", "When observing a uniform scene $L_{\\lambda ij}=L_\\lambda$ and then\n", "\n", "\\begin{equation}\n", "\\langle n_{ij}\\rangle = \\langle R_{ij}\\rangle\n", "\\int_0^\\infty\n", "\\langle \\eta_{\\lambda ij}\\rangle L_{\\lambda} d\\lambda\n", "+\\langle D_{ij}\\rangle \n", "\\end{equation}\n", "\n", "Manipulating the above equations results in the equation describing pixel $ij$ value as\n", "\n", "\\begin{equation}\n", "n_{ij} =\n", "\\langle n_{ij}\\rangle +\n", "d_{ij} +\n", " \\frac{r_{ij}[\\langle n_{ij}\\rangle - \\langle D_{ij}\\rangle ]}{\\langle R_{ij}\\rangle } +\n", " \\langle R_{ij}\\rangle \\int_0^\\infty k_{\\lambda ij} L_{\\lambda} d\\lambda\n", "\\end{equation} \n", "With $\\langle R_{ij}\\rangle$ as the average value of the instrument transfer function, $\\langle R_{ij}\\rangle \\int_0^\\infty k_{\\lambda ij} L_{\\lambda} d\\lambda =\\int_0^\\infty k_{\\lambda ij} n_{\\lambda ij} d\\lambda$\n", "where $n_{\\lambda ij}$ is the photoelectrons produced when viewing the scene with radiance $L_{\\lambda}$.\n", "\n", "The variance in $n_{ij}$ is then given by\n", "\\begin{eqnarray}\n", "\\sigma_u^2 &=&\n", "\\sigma_d^2\n", "+\n", " \\frac{\\sigma_r^2[\\langle n_{ij}\\rangle - \\langle D_{ij}\\rangle ]^2}{\\langle R_{ij}\\rangle^2 } +\n", " \\langle R_{ij}\\rangle^2\\left\\langle \\left[ \\int_0^\\infty\n", " k_{\\lambda ij} L_{\\lambda} d\\lambda\\right]^2\\right\\rangle\\\\\n", "&=&\n", "\\sigma_d^2\n", "+\n", " \\frac{\\sigma_r^2[\\langle n_{ij}\\rangle - \\langle D_{ij}\\rangle ]^2}{\\langle R_{ij}\\rangle^2 } +\n", "\\left\\langle \\left[ \\int_0^\\infty\n", " k_{\\lambda ij} n_{\\lambda ij} d\\lambda\\right]^2\\right\\rangle\n", "\\end{eqnarray} \n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "In this equation \n", "\n", "- $\\sigma_u^2$ represents the nonuniformity image variance (square of the rms value).\n", "- $\\sigma_d^2$ is the noise variance in the dark current.\n", "- $\\sigma_r^2$ is the tolerance variance in detector area-related characteristics.\n", "- $\\left\\langle \\left[ \\int_0^\\infty k_{\\lambda ij} L_{\\lambda} d\\lambda\\right]^2\\right\\rangle$ (say $\\sigma_l^2$) is the apparent radiance variance resulting from variations in quantum efficiency.\n", "- $r\\sigma_l=\\sigma_n$.\n", "- $\\langle n_{ij}\\rangle$ (a constant, say $n$) is the mean pixel value over all the pixels in the image (the expected signal).\n", "- $\\langle D_{ij}\\rangle$ (a constant, say $d$) is the dark current average over all pixels, and \n", "- $\\langle R_{ij}\\rangle$ (a constant, say $r$) is the signal transfer function (converting radiance on the detector surface to electrons in the charge well) over all pixels.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The signal (electron count) variance equation can then be written as\n", "\\begin{eqnarray}\n", "\\sigma_u^2 \n", "&=&\n", "\\sigma_d^2 +\n", "\\left(\\frac{\\sigma_r^2}{r^2}\\right)\\left(n - d\\right) +\n", " r^2 \\sigma_l^2\\\\\n", "&=&\n", "\\sigma_d^2 +\n", "\\left(\\frac{\\sigma_r^2}{r^2}\\right)\\left(n - d\\right) +\n", "\\sigma_n^2\n", "\\end{eqnarray} \n", "\n", "\n", "The fraction $\\left(\\frac{\\sigma_r^2}{r^2}\\right)$ can be interpreted as a normalised or percentage ratio in variation of detector area (or area related characteristics). \n", "\n", "The dark current variance $\\sigma_d^2$ can be measured in the laboratory under zero (low) incident flux conditions, then $(n-d)\\rightarrow 0$ and $\\sigma_l\\rightarrow 0$.\n", "\n", "The quantum efficiency variance $\\sigma_l^2$ may be estimated under high flux conditions, $n>d$ and $\\sigma_d^2\\ll$, if $\\sigma_r^2$ can be determined by some other nonradiometric means. Perhaps (hypothesis not tested) it can be determined by \n", "using a number of flux levels.\n", "\n", "This equation may be further simplified under certain assumptions:" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "1. *Low light, visible spectral band* operation: no simplification is possible because the signal $n$ is small compared to the dark signal. \n", "\n", "2. Under *large photon signal conditions*: $\\sigma_d^2\\ll$ and it can be ignored, also $n\\gg d$, then \n", " \\begin{equation}\n", " \\sigma_{u_\\textrm{high flux}}^2 =\n", " \\frac{\\sigma_r^2}{r^2}n +\n", " \\sigma_n^2\n", " \\end{equation} \n", "\n", "3. Under *large photon signal conditions* and if the *quantum efficiency is uniform*, $\\sigma_l^2=\\sigma_n^2=0$, then\n", " \\begin{equation}\n", " \\sigma^2_{u} = \\frac{\\sigma_r^2}{r^2}n \n", " \\end{equation} \n", "\n", "4. If there is no/small area variations $\\sigma_r^2\\rightarrow 0$, but with low light flux $\\sigma_d^2\\leq \\sigma_n^2$\n", " \\begin{equation}\n", " \\sigma_u^2 =\n", " \\sigma_d^2 +\n", " \\sigma_n^2\n", " \\end{equation} \n", "\n", "5. If there is no/small area variations $\\sigma_r^2\\rightarrow 0$, as well as high flux $\\sigma_d^2 < \\sigma_n^2$\n", " \\begin{equation}\n", " \\sigma_u^2 =\n", " \\sigma_n^2\n", " \\end{equation} \n", " \n", " \n", " " ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Large signal photon conditions occur for high flux signals in the visible band (large numbers of photons).\n", "Large signal photon conditions always apply in the thermal bands (large numbers of low energy photons).\n", "\n", "A commonly found metric for visual CCD and CMOS sensors is the $U$ value relating the nonuniformity noise standard deviation\n", "$n_{\\textrm{NU}}$ with the signal flux: $\\sigma_u = n_{\\textrm{NU}}=U n_{\\textrm{photoelectrons}}$. Typical values for $U$ are less than or equal to 1% for CCD and 5% for CMOS sensors. This corresponds with approximation 5 above, assuming high flux signal conditions and with zero variance in detector area. Under low light conditions this approximation is not valid.\n", "\n", "Holst describes infrared sensor nonuniformity noise variance as having the form $\\sigma_u = n_{\\textrm{NU}}=U n_{\\textrm{photoelectrons}}$. This also corresponds with approximation 5 above, assuming high flux signal conditions and with zero variance in detector area. The high flux condition is alway valid for sensors operating in the thermal spectral bands.\n", "\n", "According to Janesick (p169) the dark current nonuniformity standard deviation is around 10% (CCD) and 40% (CMOS) of the the dark current (for silicon detectors). Note that dark nonuniformity $\\sigma_d$ is much greater than light nonuniformity $\\sigma_n$ by approximately 10-40 times.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "Mooney points out that it is impossible to achieve perfect nonuniformity correction however complex algorithm may be used. His analysis shows that the chromatic correction required by nonzero $k_{\\lambda ij}$ depends on the knowledge of the spectral radiance on the detector. In general the exact spectral radiance is not known or even predictable: visual band the target spectral reflection greatly modifies the solar spectral radiance. In the 3--5 $\\mu$m spectral band the signature comprises reflected solar flux and self-emitted thermal flux, the exact ratio of which is not predictable." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The final version of the model is then\n", "\n", "\\begin{equation}\n", "\\sigma_u^2 =\n", "\\sigma_d^2 +\n", "\\left(\\frac{\\sigma_r^2}{r^2}\\right)\\left(n - d\\right) +\n", "\\sigma_n^2\n", "\\end{equation} \n", "\n", "with the following **estimated** values (please substitute your own, better estimates):\n", "\n", "1. $\\sigma_d=U_d\\,n_\\textrm{photon}$ where $U_d$ is 10 to 40% of the dark current $n_{\\textrm{darkcurrent}}$ (see below), for all sensors.\n", "\n", "1. $\\sigma_r$ = 0, on the assumption that the detector area-related variations are well controlled, and also that for low flux levels $\\sigma_r^2\\left(n - d\\right)\\rightarrow 0$.\n", "\n", "1. $\\sigma_n=U\\,n_\\textrm{photon}$, where $U$ is 1% (CCD) to 5% (CMOS) for sensors operating in the visual band. Infrared cameras can have nonuniformity $U$ as high as 25%, and require active correction. It can be assumed that for infrared cameras with nonuniformity correction will have \n", "$\\sigma_n\\leq 0.4\\sigma_\\textrm{tvh}$ where $\\sigma_\\textrm{tvh}$ is the total noise in the sensor." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "### Dark current shot noise\n", "\n", "Dark noise is the current flowing in a detector with no photon incidence, resulting from many different processes in a detector\\cite{Kinch2007,Janesick2007}. Sources of dark current include (depending on the material and operating temperature): thermal diffusion current, thermal generation and tunneling through bandgap states in the depletion region, and surface current\\cite{Kinch2007}. It appears that fill factor does not apply to dark current. Combining information from several sources\\cite{Kinch2007,Janesick2007,raptorninoxwhitepaper2016}\n", "the following model for the mean dark current is used (noting that for silicon $\\sqrt{E_\\textrm{gap}}\\approx 1$):\n", "\n", "\\begin{equation}\n", "n_{8} = n_{\\textrm{darkcurrent}} = \\frac{ 2.55\\times10^{15}t_\\textrm{int} A_d D_{FM} T^{1.5} }{\\sqrt{E_\\textrm{gap}}} \\cdot\n", "\\left[\\exp\\left(-\\frac{E_\\textrm{gap}}{c_m k T}\\right)\\right]\n", "\\end{equation}\n", "where the material band gap $E_\\textrm{gap}$ temperature variation is approximated by the Varshni model\n", "\\begin{equation}\n", "E_\\textrm{gap}(T) = E_\\textrm{gap0} - \\frac{AT^2}{T+B}\n", "\\end{equation}\n", "and\n", "$t_\\textrm{int}$ is the integration time,\n", "$A_d$ is the pixel's area [cm$^2$],\n", "$D_{FM}$ is the detector dark current figure-of-merit at 300~K (varies significantly\n", "with sensor manufacturer),\n", "$T$ is temperature [K],\n", "$k$ is Boltzman's constant [eV/K], and the rest of the equation coefficients are defined for different detector materials in the table below:\n" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "\\begin{tabular}{|l|c|c|c|c|c|c|c|}\n", "\\hline\n", "Material & $e_d$& $c_a$ &$D_{X}$ &$T_X$ &$E_\\textrm{gap0}$ & $A$ & $B$\\\\\n", "\\hline\n", "Silicon (visual) & 2 & \\num{4.31e+05} &\\num{5.00e-06} &300 &1.166 & \\num{5.50e-4} &636\\\\\n", "InGaAs x=0.45 1.7 um & 1 & \\num{2.82e+08} &\\num{8.53e-05} &300 &0.700 &\\num{5.40e-4} & 1076\\\\\n", "HgCdTe x=0.304 MWIR & 2 & \\num{2.78e+04} &\\num{2.00e-06} &80 &0.235 &\\num{3.00e-4} &500\\\\\n", "HgCdTe x=0.225 LWIR & 1 & \\num{9.25e+04} &\\num{1.00e-01} &80 &0.131 &\\num{3.00e-4} &200\\\\\n", "\\hline\n", " & - &K$^{-3/2}$&A/m$^2$ &K &eV & - & -\\\\\n", "\\hline\n", "\\end{tabular}\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "The dark current carriers create a temporal electron count shot noise with variance $\\sigma^2_\\textrm{dark} = n_\\textrm{darkcurrent}$. The dark current noise is random over subsequent image frames.\n", "\n", "\n", "The spatial dark current noise generation process is random around a mean value (Equation~\\ref{eq:darkcurrent}), spatially across different pixels but not across subsequent image frames for the same pixels. The fixed spatial structure is called the dark current fixed pattern noise (DFPN). The spatial pattern for dark noise generation is not the same as the PRNU for photoelectron generation (Section~\\ref{sec:Detectorfixedpatternnoise}), it is caused by different processes, has a different statistical nature, and has much wider variation. Konnik\\cite{Konnik2014} argues a model that uses a lognormal probability distribution combined with one or more probability distributions. His model is verified using experimental work on astronomical cameras, requiring really long integration times. For the present model, only a single lognormal distribution is used (instead of a normal distribution) to obtain the required `outlier' or 'hot' noisy dark pixels:\n", "\\begin{equation}\n", "n_\\textrm{11} = n_\\textrm{9}\\left[1+\\log\\mathcal{N}(0,\\sigma^2_\\textrm{DNU})\\right]\n", "\\end{equation}\n", "where\n", "$\\log\\mathcal{N}(0,\\sigma^2_\\textrm{DNU})$ is a lognormal probability distribution with mean value of zero and variance of $\\sigma^2_\\textrm{DNU}$, and the dark current nonuniformity $\\sigma_\\textrm{DNU}$ is between 0.1 and 0.4 for silicon detectors\\cite{Janesick2007} and assumed similar for other detector types.\n", "\n", "It is evident that, for the values used here, the dark current noise is insignificantly small and will be ignored.\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "### Read noise also known as kTC reset noise\n", "\n", "kTC noise results from random fluctuations of charge on the sense node during the reset stage, resulting in a corresponding photodiode reset voltage fluctuation. In CCD sensors the sense node reset noise is removed by Correlated Double Sampling (CDS).\n", "In CMOS photosensors, it is difficult to remove the reset noise even after application of CDS. Specifically, the difficulties arise in 'rolling shutter' and 'snap' readout modes. Elimination of reset noise in CMOS is quite challenging.\n", "The magnitude of the sense node read noise in electrons is given by \n", "\n", "\\begin{equation}\n", "n_{\\textrm{kTCnoise}}=\\frac{\\sqrt{k_B T C_{SN}}}{q}\n", "\\end{equation}\n", "\n", "where\n", "$q$ is the charge of an electron,\n", "$k_B$ is the Boltzmann constant, \n", "$T$ is the temperature, and \n", "$C_{SN}$ is the sense node capacitance.\n", "For this investigation the noise is assumed gaussian distributed.\n", "\n", "The sense node capacitance can be determined from the sense node gain $A_\\textrm{SN}$, expressed in volt per electron. From $Q=CV$ where $Q$ in this case is expressed in electron count not coulomb the sense node capacitance is $C_{SN} = \\frac{q}{A_\\textrm{SN}}$.\n", "Then \n", "\n", "\\begin{equation}\n", "n_{\\textrm{kTCnoise}}=\\sqrt{\\frac{k_B T }{A_\\textrm{SN} q}}\n", "\\end{equation}\n", "\n", "Typical values for the sense node gain is 5 to 150 $\\mu$V/e$^-$." ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "### Total noise\n", "\n", "The total noise is then given by\n", "\n", "\\begin{equation}\n", "n_{\\textrm{noise}} = \\sqrt{n_{\\textrm{photnoise}}^2+ n_{\\textrm{NU}}^2 + n^2_{\\textrm{darkcurrentnoise}} + n^2_{\\textrm{kTCnoise}}}\n", "\\end{equation}\n", "\n", "For visual band sensors (corresponding to Equation 10 in [G])\n", "\n", "\\begin{equation}\n", "n_{\\textrm{noise}} = \\sqrt{n_{\\textrm{photnoise}}^2+ (U n_{\\textrm{photons}})^2 + n^2_{\\textrm{darkcurrentnoise}} + n^2_{\\textrm{kTCnoise}}}\n", "\\end{equation}\n", "\n", "For infrared sensors\n", "\n", "\\begin{equation}\n", "n_{\\textrm{noise}} \n", "= \\sqrt{n_{\\textrm{photnoise}}^2+ \\left(\\sqrt{n_{\\textrm{photons}}}\\right)^{-2} + n^2_{\\textrm{darkcurrentnoise}} + n^2_{\\textrm{kTCnoise}}}\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "n_{\\textrm{noise}} \n", "= \\sqrt{n_{\\textrm{photons}}+ n_{\\textrm{photons}}^{-1} + n^2_{\\textrm{darkcurrentnoise}} + n^2_{\\textrm{kTCnoise}}}\n", "\\end{equation}\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Charge conversion nonlinearity\n", "\n", "If the sense node capacitor has a nonlinear voltage relationship $C_\\textrm{SN}(V_\\textrm{SN}) = k_1/V_\\textrm{SN}$ the signal voltage has a nonlinear relationship with respect to accumulated charge.\n", "\\begin{equation}\n", "V_\\textrm{signal}= V_\\textrm{Ref}\\left(1-\\exp\\left[ \\frac{- \\alpha n_\\textrm{13}\\cdot q }{k_1} \\right]\\right)\n", "\\end{equation}\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# to demonstrate the effect of alpha, following Janesick's Example 7.2\n", "\n", "k1 = 10e-15\n", "vref = 3.0\n", "vsnmin = 0.5\n", "nphelec = np.linspace(0,1e5,100)\n", "vsnp = np.linspace(0.5,3,100)\n", "p = ryplot.Plotter(1,1,3,figsize=(16,4));\n", "p.plot(1,vsnp,1e15*k1/vsnp,'Capacitance vs voltage, k1={}'.format(k1),\n", " '$V_{SN}$ V','Capacitance fF');\n", "vsignal = vref * (1.0 - np.exp(- nphelec * const.e / (k1)))\n", "vsn = vref * (np.exp(- nphelec * const.e / (k1)))\n", "p.plot(2,nphelec, vsignal,'Voltage on charge well capacitor','Number photoelectrons','Volts signal V',\n", " label=['Signal voltage'],maxNX=5);\n", "p.plot(2,nphelec, vsn,label=['Sense node voltage'],maxNX=5);\n", "\n", "nelec = -(k1/const.e)*np.log(vsn/vref)\n", "p.plot(3, vsn, nelec,'Charge in well','$V_{SN}$ V','Electroncs',label=['$V_{SN}$'],maxNX=5);\n" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Source follower nonlinearity\n", " \n", "The nonlinear source follower gain is given by \n", " \n", "\\begin{equation}\n", "A_\\textrm{SFnl} = A_\\textrm{SF}\\left[1 - (\\gamma - 1) \n", "\\left(\\frac{V_\\textrm{Ref}-V_\\textrm{SN}}{V_\\textrm{Ref}-V_\\textrm{Full-well}}\\right)\n", "\\right]\n", "\\end{equation}\n", "where\n", "$A_\\textrm{SFnl}$ is the nonlinearised source follower gain,\n", "$A_\\textrm{SF}$ is the linear (ideal) source follower gain (close to unity),\n", "$\\gamma$ is the nonlinear error (typically 0.95 to 1.05), \n", "$V_\\textrm{Ref}$ is the reference voltage, and \n", "$V_\\textrm{SN}$ is the sense node voltage.\n", "\n", " " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sfGain = 1.0\n", "nlinratios = [0.95, 1, 1.05]\n", "voltfullwell = 0.5\n", "vref = 3.0\n", "vsn = np.linspace(0.5 , 3., 100)\n", "\n", "p = ryplot.Plotter(1,1,1, figsize=(10,4))\n", "for nlinratio in nlinratios:\n", " sfgainnonlin = sfGain * (1 - (nlinratio -1.) * ((vref - vsn) /( vref- voltfullwell) ))\n", " p.plot(1, vsn,sfgainnonlin, 'Source follower nonlinearity','$V_{sensenode}$','Gain',\n", " label=['$\\gamma={}$'.format(nlinratio)])" ] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## ADC nonlinearity\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vadc = vref\n", "N = 3\n", "vres = vadc / 2 ** N\n", "gammas = [0.9, 1., 1.1]\n", "vinp = np.linspace(vsnmin,vadc,1000)\n", "\n", "p = ryplot.Plotter(1,1,2,figsize=(12,5))\n", "for gamma in gammas:\n", " aadc = (1/vres)**(1 - ((vinp-vsnmin)/(vadc-vsnmin))*(np.log(gamma/vres)/np.log(1./vres)-1))\n", " p.plot(1,vinp, vres *aadc, 'ADC nonlinearity','$V_{ADC}$','Normalised gain',label=['$\\gamma={}$'.format(gamma)])\n", " vdigit = np.round((vinp-vsnmin)*aadc)\n", " \n", " p.plot(2,vinp, vdigit, 'ADC nonlinearity','$V_{ADC}$','Output',label=['$\\gamma={}$'.format(gamma)])\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read Out Technologies\n", "\n", "\n", "\n", "\n", "The \\ac{ROIC} can use either a \\ac{CCD} or \\ac{CMOS} technology to read out the detector signal.\n", "Visual band sensors use silicon technology for detection and use either \\ac{CCD} or \\ac{CMOS} \\ac{ROIC} (all functionality in a monolithic chip).\n", "Infrared sensors use silicon \\ac{CMOS} \\ac{ROIC}, but one of many different detector materials. The detector chip and \\ac{ROIC} chip are interconnected most often with indium bumps on chip level (hybrid technology).\n", "\n", "Modeling the two different \\ac{ROIC} technologies require different approaches because of the inherent differences in charge and voltage processing. However, with some poetic licence and appropriate parameter selection it is possible to use a single model for high-level image simulation. The model presented here has a hybrid \\ac{CMOS}/\\ac{CCD} structure, with switchable options. \\ac{CMOS} \\ac{ROIC} designs have a large number of different topologies\\cite{CCHCYWFWJTPS1997}, ranging from simple voltage follower at each detector (as is used in \\ac{CCD} \\ac{ROIC}s), \\ac{DI}, \\ac{BDI}, \\ac{CTIA}), and \\ac{GMI} circuits. Circuit complexity can range from a few transistors to many transistors per pixel (designated as e.g., 3T, 5T, etc.).\n", "This model uses a source follower topology in order to model both \\ac{CCD} and \\ac{CMOS} devices.\n", "\n", "One of the figures above presents a comparison of the commonality and differences between the \\ac{CCD} and \\ac{CMOS} technologies. Photon capture in the material, its conversion to electrons and the accumulation of electrons are performed by a two-dimensional array of detector devices. Each pixel accumulates charge on a capacitor within the footprint of the detector pixel itself. \\ac{CCD} and \\ac{CMOS} differ in the methods used to store, move and read out the signals. \\ac{CCD} devices transfer charges along its two-dimensional structures, whereas \\ac{CMOS} devices keep charges local and make voltage levels available in its two-dimensional structures.\n", "\n", "In the case of \\ac{CCD}s, the two-dimensional array of charges are transferred along one axis (say $x$) to the edge of the array, where another charge transferring mechanism moves the charges along the other axis (say $y$) via a readout node to the outside world. The \\ac{CCD}'s readout node performs the charge to current conversion. There are only a small number of readout nodes (one to eight) where this conversion takes place. Charge accumulation under each pixel, charge transfer and eventual charge conversion are all (approximately) linear processes. There may be differences in gain and offset between the different charge transfer and conversion channels, exhibiting as spatial \\ac{NU}.\n", "\n", "In the case of \\ac{CMOS}, the charges are collected in a two-dimensional array of charge well capacitors, converted to voltages at each detector pixel, and the voltage at each pixel is read out by multiplexed switches of each detector signal to the outside world. The charge accumulation in the \\ac{CMOS} device may be nonlinear and the gain and offset variations all appear at pixel level, but there may be some spatially structured variations attributable to differences between different readout channels.\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Imager radiometry\n", "\n", "All the following models are implemented in [pyradi.rystare.py](https://github.com/NelisW/pyradi/blob/master/pyradi/rystare.py).\n", "\n", "## Irradiance in the focal plane and electron count in the detector\n", "\n", "![images/sensor-diagram.png](images/sensor-diagram.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider a source at range $R_{01}$ illuminated with illumination/irradiance $E_0$ at a single wavelength. The pixel flux is given by\n", "\n", "\\begin{equation}\n", "\\Phi_s = \\frac{ L_0 A_0 A_1 \\tau_a}{R_{01}^2}\n", "\\end{equation}\n", "\n", "where the radiance $L_0$ is given by \n", "\n", "\\begin{equation}\n", "L_0 = \\frac{E_0 \\rho}{\\pi}\n", "\\end{equation}\n", "\n", "where $E_0$ is the illumination on the object, where the reflectance is assumed to be \n", " lambertian, and where $\\rho$ is the diffuse source reflectance. Then \n", " \n", "\\begin{equation}\n", "\\Phi_s = \\frac{ E_0 \\rho A_0 A_1\\tau_a}{\\pi R_{01}^2}\n", "\\end{equation}\n", "\n", "The pixel field of view is given by $A_0/R^2_{01} = A_s/f_s^2 = \\Omega_p$. The sensor clear aperture area can be written in terms of f-number as $A_1 = f_s^2 \\pi/(4 F_\\#^2)$. Replacing in the above equation yields\n", "\n", "\\begin{equation}\n", "\\Phi_s \n", "= \\frac{ E_0 \\rho}{\\pi} \\frac{f_s^2 \\pi }{4 F_\\#^2} \\Omega_p \\tau_a\n", "= \\frac{ E_0 \\rho A_s \\tau_a}{4 F_\\#^2} \n", "= \\frac{\\pi L_0 \\rho A_s \\tau_a}{4 F_\\#^2} \n", "\\end{equation}\n", "\n", "The irradiance in the focal plane is then \n", "\n", "\\begin{equation}\n", "E_s = \\frac{\\Phi_s }{ A_s} \n", "= \\frac{ E_0 \\rho \\tau_a}{4 F_\\#^2} \n", "= \\frac{\\pi L_0 \\rho \\tau_a}{4 F_\\#^2} \n", "\\end{equation}\n", "\n", "The flux passing through the detector area is $E_s\\, A_d$. If the flux is defined in terms of photons per second, the number of photons accumulated in the detector during integration time $t_{\\textrm{int}}$ is $E_s\\, A_d\\, t_{\\textrm{int}}$. The electron count accumulated during the integration time is then\n", "\n", "\\begin{equation}\n", "n = \\eta E_s A_d\\, t_{\\textrm{int}}\n", "= \\left(\\frac{\\eta\\pi\\, t_{\\textrm{int}}\\,P\\, A_d}{4\\, F_\\#^2} \\right) \\left( \\rho\\, \\tau_a\\, L_0\\right)\n", "\\end{equation}\n", "where \n", "$\\eta$ is the quantum efficiency, and \n", "$P$ is the fractional clear aperture (in case some obscuration is present).\n", "\n", "The solid angle of the optics' f-number cone is $\\Omega_{F_\\#}=\\pi/(4F_\\#^2)$, hence the above equation can be written\n", "\n", "\\begin{equation}\n", "n = \\eta E_s A_d\\, t_{\\textrm{int}}\n", "= \\left(\\eta t_{\\textrm{int}}\\,P\\, A_d \\Omega_{F_\\#}\\right) \\left( \\rho\\, \\tau_a\\, L_0\\right)\n", "\\end{equation}\n", "\n", "The last two equations forms the basis for the various electron-count contributions defined below.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Constant spectral properties\n", "\n", "Most sensors have relatively wide spectral response and the monochromatic derivation above must be extended to calculate the sum of fluxes at all wavelengths.\n", "The spectral integrals in the equations below have the general form\n", "\n", "\\begin{equation}\n", "(\\cdots)\\,\\int_0^\\infty\n", "\\eta_{\\lambda}\\, \\tau_{o\\lambda}\\, \\tau_{f\\lambda}\\,\\tau_{a\\lambda}\\, \\rho_{\\textrm{d}\\lambda} \\,\n", " L_{q\\lambda} \\,d \\lambda \n", "\\end{equation}\n", "\n", "If a spectral variable, e.g., any or all of $(\\eta_{\\lambda} \\, \\tau_{f\\lambda}\\, \\tau_{o\\lambda}\\,\\tau_{a\\lambda}\\, \\rho_{\\textrm{d}\\lambda})$, can be assumed constant over spectral band, they can be taken out of th integral. If all are constant only $L_{q\\lambda}$ remains in the spectral band integral\n", " \n", "\\begin{equation}\n", "\\eta \\tau_{o} \\tau_{a} \\rho_\\textrm{d} \n", "\\int_0^\\infty L_{q\\lambda} \\;d\\lambda\n", "\\end{equation}\n", "\n", "### Photon radiance\n", "\n", "By setting $ t_{\\textrm{int}}=P=A_d=\\cos\\theta=\\eta=\\tau_{o}=\\tau_{f}=\\tau_{a}=\\rho_\\textrm{d}=\\Omega_{F_\\#}=1$ and $F_\\#=\\sqrt{\\pi/4}$, the equation simplifies to the wideband photon rate radiance at the target \n", "\n", "\\begin{equation}\n", "L_{\\textrm{q}}\n", "=\n", "\\int_0^\\infty L_{q\\lambda} \\;d\\lambda\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Photon rate model\n", "\n", "This section considers the electron count for a variety of sources. These equations form the basis for the library implementation that is used in the rest of the document." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Self emitted flux\n", "\n", "The thermal scene-radiance photon count is given by\n", "\n", "\\begin{equation}\n", "n_{\\textrm{sceneT}}\n", "=\n", "\\left(\\frac{\\pi\\,t_{\\textrm{int}}\\, P\\, A_d }{4\\,F_\\#^2}\\right)\n", "\\int_0^\\infty \n", "(\\eta_{\\lambda}\\, \\tau_{o\\lambda}\\, \\tau_{f\\lambda}\\,\\tau_{a\\lambda})\\,\n", "(\\epsilon_{\\lambda}\\, L_\\lambda(T_\\textrm{source}))\\,\n", "d\\lambda\n", "\\end{equation}\n", "\n", "where\n", "$t_{\\textrm{int}}$ is the integration time,\n", "$P$ is the fraction of clear aperture, \n", "$A_d$ is the detector area, \n", "$F_\\#$ is the f-number, \n", "$\\eta_{\\lambda}$ is the detector quantum efficiency,\n", "$\\tau_{o\\lambda}$ is the optics transmittance, \n", "$\\tau_{f\\lambda}$ is the sensor filter transmittance, \n", "$\\tau_{a\\lambda}$ is the atmospheric transmittance, \n", "$\\epsilon_{\\lambda}$ is the source/background emissivity,and\n", "$L_\\lambda(T_\\textrm{source})$ the Planck photon rate radiance at source/background temperature $T_\\textrm{source}$.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reflected flux\n", "\n", "The electron count in the detector can be calculated from the scene or source radiance using\n", " \n", "\\begin{equation}\n", "n_{\\textrm{sceneR}}\n", "=\n", "\\left(\\frac{\\pi\\, t_{\\textrm{int}}\\, P\\, A_d}{4\\,F_\\#^2}\\right)\n", "\\cdot \\cos\\theta \\cdot\n", "\\int_0^\\infty\n", "(\\eta_{\\lambda}\\, \\tau_{o\\lambda}\\, \\tau_{a\\lambda})\\, \\tau_{f\\lambda}\\,( \\psi\\rho_{\\textrm{d}\\lambda} \\,\n", " L_{q\\lambda}(T_\\textrm{illum}) )\\,\n", "d \\lambda \n", "\\end{equation}\n", "\n", "where\n", "$n_{\\textrm{scene}}$ is the number of electrons,\n", "$t_{\\textrm{int}}$ is the sensor integration time, \n", "$P$ is the fraction of unobscured optical aperture, \n", "$A_d$ is the area of the detector, \n", "$\\theta$ is the angle between the surface normal vector and the primary source (if not the sun or the moon, $\\theta=0$),\n", "$F_\\#$ is the f-number (assuming infinite conjugates), \n", "$\\eta_{\\lambda}$ is the detector spectral quantum efficiency, \n", "$\\tau_{o\\lambda}$ is the spectral optics and filter transmittance, \n", "$\\tau_{\\lambda}$ is the spectral atmospheric transmittance,\n", "$\\psi$ is the ratio of radiance on the illuminating source surface to radiance on the target source surface,\n", "$\\rho_{\\textrm{d}\\lambda}$ is the surface's diffuse spectral reflection, \n", "$L_{q\\lambda}$ is the spectral photon rate radiance at the surface, and\n", "$T_\\textrm{illum}$ is the temperature of the illuminating source.\n", "\n", "If the surface is illuminated by the sun, the spectral radiance at the surface becomes\n", "$L_{q\\lambda} = \\psi \\epsilon_\\textrm{sun}\\tau_\\textrm{sun}L_{q\\textrm{b}}(6000 K)$,\n", "where \n", "$\\psi=2.17\\times 10^{-5}$ relates the sun's area and distance to radiance on the ground,\n", "$\\epsilon_\\textrm{sun}=1$ is the sun emissivity, \n", "$\\tau_\\textrm{sun}$ is the atmospheric transmittance from the target to the sun, and\n", "$L_{q\\textrm{b}}(6000 K)$ is the Planck-law thermal radiance for a 6000 K source (approximation of the sun's surface temperature)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Low light radiance\n", "\n", "The approximate low light level scene radiance levels were calculated above and stored in the `dfPhotRates` DataFrame. These values are already integrated over the spectral bandwidth, so the scene-induced electron count in the detector becomes\n", " \n", "\\begin{equation}\n", "n_{\\textrm{sceneR}}\n", "=\n", "\\left(\\frac{\\pi\\, t_{\\textrm{int}}\\, P\\, A_d}{4\\,F_\\#^2}\\right)\n", "\\cdot \\cos\\theta\\cdot\n", "( \\eta\\, \\tau_{o}\\, \\tau_{f\\lambda}\\, \\tau_{a})\\, (\\rho_\\textrm{d} \\,\n", " L_{qLL})\\,\n", "\\end{equation}\n", "\n", "where\n", "$n_{\\textrm{scene}}$ is the number of electrons,\n", "$t_{\\textrm{int}}$ is the sensor integration time, \n", "$P$ is the fraction of unobscured optical aperture, \n", "$A_d$ is the area of the detector, \n", "$\\theta$ is the angle between the surface normal vector and the primary source (if not the sun or the moon, $\\theta=0$),\n", "$F_\\#$ is the f-number, \n", "$\\eta$ is the detector quantum efficiency, \n", "$\\tau_{o}$ is the optics transmittance, \n", "$\\tau_{a}$ is the atmospheric transmittance,\n", "$\\rho_\\textrm{d}$ is the surface reflection, and \n", "$L_{qLL}$ is the photon rate radiance of the surface, as calculated above in `dfPhotRates`.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hot optics radiance\n", "\n", "For infrared sensors the thermal hot-optics photon count is given by \n", "\n", "\\begin{equation}\n", "n_{\\textrm{optics}}\n", "=\n", "\\left(\\frac{\\pi t_{\\textrm{int}} P A_d }{4F_\\#^2}\\right)\\cdot\n", "\\int_0^\\infty \\eta_{\\lambda} \n", "\\, \\tau_{f\\lambda}(1-\\tau_{o\\lambda}) L_\\lambda(T_\\textrm{optics})\n", "d\\lambda\n", "\\end{equation}\n", "\n", "where\n", "the optics emissivity is given by\n", "$\\epsilon_{\\textrm{optics}\\lambda}=(1-\\tau_{o\\lambda})$.\n", " \n", "\n", "Assuming no stray light in the visual system, the visual optics photon count is given by \n", "\n", "\\begin{equation}\n", "n_{\\textrm{optics}}=0\n", "\\end{equation}\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Path radiance\n", "\n", "The path radiance photon count is given by\n", "\n", "\\begin{equation}\n", "n_{\\textrm{path}}\n", "=\n", "\\left(\\frac{\\pi t_{\\textrm{int}} P A_d }{4F_\\#^2}\\right)\\cdot\n", "\\int_0^\\infty \\eta_{\\lambda} \n", "\\tau_{o\\lambda}\\, \\tau_{f\\lambda} L_{\\lambda\\textrm{path}}\n", "d\\lambda\n", "\\end{equation}\n", "\n", "where $L_{\\lambda\\textrm{path}}$ is the path radiance.\n", " \n", "Path radiance at one range can be scaled to path radiance at another range. It can be shown that path radiance can be approximated by\n", "\n", "\\begin{equation}\n", "L_{\\lambda\\textrm{path}} = L_{\\lambda\\textrm{path}\\infty}\\left(1-\\tau_{\\textrm{path}}\\right)\n", "\\end{equation}\n", "\n", "where\n", "$L_{\\lambda\\textrm{path}\\infty}$ is the path radiance for an infinitely long path where $\\tau_{\\textrm{path}}=0$.\n", "\n", "If path radiance for a given path $R_1$ is known, the path radiance for a new path $R_2$can be determined by\n", "\n", "\\begin{equation}\n", "L_{\\lambda\\textrm{path}}(R_2) = L_{\\lambda\\textrm{path}}(R_1)\\left[\\frac{\\left(1-\\tau_{\\textrm{path}}(R_2)\\right)}{\\left(1-\\tau_{\\textrm{path}}(R_1)\\right)}\\right]\n", "\\end{equation}\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Complete model\n", "\n", "The total electron count in the detector is given by the sum of all the terms defined above. The various contributions are structured in this diagram\n", "\n", "![images/rypflux02.png](images/rydecount02.png)\n", "\n", "where the underlined $\\underline{T}$, $\\underline{A}$, and $\\underline{S}$ signifies the origin of the contribution (Target, Atmosphere, and Sensor)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Focal plane irradiance at low light levels\n", "\n", "The photon rate radiance at low light levels is analysed in some detail in the [Optical Sources notebook](https://github.com/NelisW/ComputationalRadiometry/blob/master/07-Optical-Sources.ipynb).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Target characteristics \n", "\n", "In order to benchmark the signal levels in the rest of the document, we calculate the irradiance/illumination on the detector for a target reflectance of 0.3, an atmospheric transmittance of 0.5, optics transmittance of 0.9, and a few sensor f-numbers." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Irradiance-lm/m2 ColourTemp 1.4 2 2.74 3.8\n", "Overcast night 0.0001 5000.0 0.000002 8.437500e-07 4.495445e-07 2.337258e-07\n", "Star light 0.0011 5000.0 0.000019 9.281250e-06 4.944989e-06 2.570983e-06\n", "Quarter moon 0.0108 4150.0 0.000186 9.112500e-05 4.855080e-05 2.524238e-05\n", "Full moon 0.1080 4150.0 0.001860 9.112500e-04 4.855080e-04 2.524238e-04\n", "Deep twilight 1.0800 10000.0 0.018597 9.112500e-03 4.855080e-03 2.524238e-03\n", "Twilight 10.8000 10000.0 0.185969 9.112500e-02 4.855080e-02 2.524238e-02\n", "Very dark day 107.0000 7000.0 1.842474 9.028125e-01 4.810126e-01 2.500866e-01\n", "Overcast day 1075.0000 6000.0 18.510842 9.070312e+00 4.832603e+00 2.512552e+00\n", "Full sky light 10752.0000 12000.0 185.142857 9.072000e+01 4.833502e+01 2.513019e+01\n", "Sun light 107527.0000 5700.0 1851.549107 9.072591e+02 4.833817e+02 2.513183e+02\n" ] } ], "source": [ "\n", "pf = rypflux.PFlux()\n", "lx = pf.lllux\n", "\n", "def calcIrrad(lx, rho, taua, tauo, fno):\n", " return lx * rho * taua * tauo / (4 * fno ** 2)\n", "\n", "df = pd.DataFrame(lx).transpose()\n", "df.columns = pf.llluxCols\n", "\n", "rho = 0.3\n", "taua = 0.5\n", "tauo = 0.9\n", "fnos = [1.4, 2, 2.74, 3.8]\n", "for fno in fnos:\n", "# # http://stackoverflow.com/questions/21188504/python-pandas-apply-a-function-with-arguments-to-a-series-update\n", " df['{}'.format(fno)] = df['Irradiance-lm/m2'].apply(calcIrrad, args=(rho, taua, tauo, fno) )\n", " \n", "df.sort_values(by='Irradiance-lm/m2',inplace=True)\n", "print(df.drop(['FracPhotop'],axis=1))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Irradiance-lm/m2ColourTempFracPhotop1.422.743.85.47.51014.820
Overcast night0.00015000.00.00.0000028.437500e-074.495445e-072.337258e-071.157407e-076.000000e-083.375000e-081.540814e-088.437500e-09
Star light0.00115000.00.20.0000199.281250e-064.944989e-062.570983e-061.273148e-066.600000e-073.712500e-071.694896e-079.281250e-08
Quarter moon0.01084150.00.40.0001869.112500e-054.855080e-052.524238e-051.250000e-056.480000e-063.645000e-061.664080e-069.112500e-07
Full moon0.10804150.00.60.0018609.112500e-044.855080e-042.524238e-041.250000e-046.480000e-053.645000e-051.664080e-059.112500e-06
Deep twilight1.080010000.00.80.0185979.112500e-034.855080e-032.524238e-031.250000e-036.480000e-043.645000e-041.664080e-049.112500e-05
Twilight10.800010000.01.00.1859699.112500e-024.855080e-022.524238e-021.250000e-026.480000e-033.645000e-031.664080e-039.112500e-04
Very dark day107.00007000.01.01.8424749.028125e-014.810126e-012.500866e-011.238426e-016.420000e-023.611250e-021.648671e-029.028125e-03
Overcast day1075.00006000.01.018.5108429.070312e+004.832603e+002.512552e+001.244213e+006.450000e-013.628125e-011.656376e-019.070312e-02
Full sky light10752.000012000.01.0185.1428579.072000e+014.833502e+012.513019e+011.244444e+016.451200e+003.628800e+001.656684e+009.072000e-01
Sun light107527.00005700.01.01851.5491079.072591e+024.833817e+022.513183e+021.244525e+026.451620e+013.629036e+011.656792e+019.072591e+00
\n", "
" ], "text/plain": [ " Irradiance-lm/m2 ColourTemp FracPhotop 1.4 2 2.74 3.8 5.4 7.5 10 14.8 20\n", "Overcast night 0.0001 5000.0 0.0 0.000002 8.437500e-07 4.495445e-07 2.337258e-07 1.157407e-07 6.000000e-08 3.375000e-08 1.540814e-08 8.437500e-09\n", "Star light 0.0011 5000.0 0.2 0.000019 9.281250e-06 4.944989e-06 2.570983e-06 1.273148e-06 6.600000e-07 3.712500e-07 1.694896e-07 9.281250e-08\n", "Quarter moon 0.0108 4150.0 0.4 0.000186 9.112500e-05 4.855080e-05 2.524238e-05 1.250000e-05 6.480000e-06 3.645000e-06 1.664080e-06 9.112500e-07\n", "Full moon 0.1080 4150.0 0.6 0.001860 9.112500e-04 4.855080e-04 2.524238e-04 1.250000e-04 6.480000e-05 3.645000e-05 1.664080e-05 9.112500e-06\n", "Deep twilight 1.0800 10000.0 0.8 0.018597 9.112500e-03 4.855080e-03 2.524238e-03 1.250000e-03 6.480000e-04 3.645000e-04 1.664080e-04 9.112500e-05\n", "Twilight 10.8000 10000.0 1.0 0.185969 9.112500e-02 4.855080e-02 2.524238e-02 1.250000e-02 6.480000e-03 3.645000e-03 1.664080e-03 9.112500e-04\n", "Very dark day 107.0000 7000.0 1.0 1.842474 9.028125e-01 4.810126e-01 2.500866e-01 1.238426e-01 6.420000e-02 3.611250e-02 1.648671e-02 9.028125e-03\n", "Overcast day 1075.0000 6000.0 1.0 18.510842 9.070312e+00 4.832603e+00 2.512552e+00 1.244213e+00 6.450000e-01 3.628125e-01 1.656376e-01 9.070312e-02\n", "Full sky light 10752.0000 12000.0 1.0 185.142857 9.072000e+01 4.833502e+01 2.513019e+01 1.244444e+01 6.451200e+00 3.628800e+00 1.656684e+00 9.072000e-01\n", "Sun light 107527.0000 5700.0 1.0 1851.549107 9.072591e+02 4.833817e+02 2.513183e+02 1.244525e+02 6.451620e+01 3.629036e+01 1.656792e+01 9.072591e+00" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lx = pf.lllux\n", "\n", "def calcIrrad(lx, rho, taua, tauo, fno):\n", " return lx * rho * taua * tauo / (4 * fno ** 2)\n", "\n", "df = pd.DataFrame(lx).transpose()\n", "df.columns = pf.llluxCols\n", "\n", "rho = 0.3\n", "taua = 0.5\n", "tauo = 0.9\n", "fnos = [1.4, 2, 2.74, 3.8, 5.4, 7.5, 10, 14.8, 20]\n", "for fno in fnos:\n", "# http://stackoverflow.com/questions/21188504/python-pandas-apply-a-function-with-arguments-to-a-series-update\n", " df['{}'.format(fno)] = df['Irradiance-lm/m2'].apply(calcIrrad, args=(rho, taua, tauo, fno) )\n", " \n", "df.sort_values(by='Irradiance-lm/m2')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "## Python and [module versions, and dates](https://github.com/rasbt/watermark)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false }, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Last updated: 2022-02-07T16:02:09.101738+02:00\n", "\n", "Python implementation: CPython\n", "Python version : 3.8.3\n", "IPython version : 8.0.0\n", "\n", "numpy : 1.18.5\n", "scipy : 1.7.3\n", "pyradi: 1.1.2\n", "pandas: 1.3.5\n", "\n", "Compiler : MSC v.1916 64 bit (AMD64)\n", "OS : Windows\n", "Release : 10\n", "Machine : AMD64\n", "Processor : Intel64 Family 6 Model 165 Stepping 2, GenuineIntel\n", "CPU cores : 16\n", "Architecture: 64bit\n", "\n", "Git hash: 82763e1487a598ff03d73f895669d8db5b57336d\n", "\n", "Git repo: https://github.com/NelisW/ComputationalRadiometry.git\n", "\n", "Git branch: master\n", "\n" ] } ], "source": [ "# to get software versions\n", "# https://github.com/rasbt/watermark\n", "# https://github.com/rasbt/watermark/blob/master/docs/watermark.ipynb\n", "# you only need to do this once\n", "# pip install watermark\n", "\n", "%load_ext watermark\n", "# %watermark -v -m -p numpy,scipy,pyradi -g -d\n", "%watermark -v -m -p numpy,scipy,pyradi,pandas -g -r -u -d -b -i" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }