Source code for simpunch.noise
"""Calculation to generate noise."""
import numpy as np
[docs]
def generate_noise(
data: np.ndarray,
bias_level: float = 100,
dark_level: float = 55.81,
gain: float = 4.3,
read_noise_level: float = 17,
bitrate_signal: int = 16,
) -> np.ndarray:
"""
Generate noise based on an input data array, with specified noise parameters.
Parameters
----------
data
input data array (n x n)
bias_level
ccd bias level
dark_level
ccd dark level
gain
ccd gain
read_noise_level
ccd read noise level
bitrate_signal
desired ccd data bit level
Returns
-------
np.ndarray
computed noise array corresponding to input data and ccd/noise parameters
"""
# Generate a copy of the input signal
data_signal = np.copy(data)
# Convert / scale data
# Think of this as the raw signal input into the camera
data = np.interp(
data_signal,
(np.min(data_signal), np.max(data_signal)),
(0, 2**bitrate_signal - 1),
)
data = data.astype("long")
# Add bias level and clip pixels to avoid overflow
data = np.clip(data + bias_level, 0, 2**bitrate_signal - 1)
# Photon / shot noise generation
data_photon = data_signal * gain # DN to photoelectrons
sigma_photon = np.sqrt(data_photon) # Converting sigma of this
sigma = sigma_photon / gain # Converting back to DN
noise_photon = np.random.normal(scale=sigma)
# Dark noise generation
noise_level = dark_level * gain
noise_dark = np.random.poisson(lam=noise_level, size=data.shape) / gain
# Read noise generation
noise_read = np.random.normal(scale=read_noise_level, size=data.shape)
noise_read = noise_read / gain # Convert back to DN
# And then add noise terms directly
return noise_photon + noise_dark + noise_read