Source code for denspp.offline.analog.adc.adc_flash
import numpy as np
from .adc_basic import BasicADC
from .adc_settings import SettingsADC, SettingsNon, RecommendedSettingsNon
from denspp.offline.analog.dev_noise import ProcessNoise
[docs]
class NyquistADC(BasicADC):
_settings: SettingsADC
_handler_noise: ProcessNoise
def __init__(self, settings_dev: SettingsADC, settings_non=RecommendedSettingsNon) -> None:
"""Class for applying a Nyquist Analogue-Digital-Converter (ADC) on the raw data
:param settings_dev: Configuration class for defining properties of ADC
:param settings_non: Configuration class for non-idealities / parasitics of ADC (next feature)
"""
super().__init__(settings_dev)
# --- Transfer function
self.__partition_digital = np.arange(0, 2 ** self._settings.Nadc, 1)
self.__partition_digital -= 2 ** (self._settings.Nadc - 1) if self._settings.is_signed else 0
self.__partition_voltage = np.arange(0, 2 ** self._settings.Nadc, 1) * self._settings.lsb
self.__partition_voltage += self._settings.vref[1] + settings_non.offset + self._settings.lsb / 2
def __adc_conv_sample(self, uin: float) -> np.ndarray:
"""Converting the value (nyquist ideal, sample converting)"""
x0 = np.where(uin <= self.__partition_voltage)
xout = self.__partition_digital[x0[0][0]]
return xout
def __adc_conv_stream(self, uin: np.ndarray) -> np.ndarray:
"""Converting the value (nyquist ideal, stream converting)"""
x_out = np.zeros(shape=uin.shape)
for idx, vol in enumerate(uin):
x_out[idx] = self.__adc_conv_sample(vol)
return self.clamp_digital(x_out)
[docs]
def adc_nyquist(self, uin: np.ndarray) -> [np.ndarray, np.ndarray]:
"""Using the Nyquist Topology as an ADC
Args:
uin: Input voltage
Returns:
Tuple with two numpy arrays [x_out = Output digital value, quant_er = Quantization error]
"""
# Do resampling and conversion
uin_adc = self.clamp_voltage(uin)
uin0 = self._do_resample(uin_adc)
x_out = self.__adc_conv_stream(uin0)
# Add noise and calc quantization error
quant_err = uin0 - x_out * self._settings.lsb
x_out += self._gen_noise(uin0.size).astype(np.integer)
return x_out, quant_err