Parameter local oscillator wavelength added

This commit is contained in:
Lukas Klass 2020-10-05 20:47:10 +02:00
parent f27bad2574
commit e210cf0fa2
2 changed files with 35 additions and 6 deletions

View File

@ -227,7 +227,7 @@ Attributes:
Heterodyne
----------
The heterodyne sensor type allows to model a generic heterodyne radio receiver which uses an local oscillator and an mixer to create spectral images. The heterodyne-component contains several parameters which are explained in the following. All parameters are defined according to the `Guide to GREAT <https://www.sofia.usra.edu/science/proposing-and-observing/observers-handbook-cycle-9/6-great/61-specifications#PerformanceGREAT>`_.
The heterodyne sensor type allows to model a generic DSB heterodyne radio receiver which uses an local oscillator and an mixer to create spectral images. The heterodyne-component contains several parameters which are explained in the following. All parameters are defined according to the `Guide to GREAT <https://www.sofia.usra.edu/science/proposing-and-observing/observers-handbook-cycle-9/6-great/61-specifications#PerformanceGREAT>`_.
.. code-block:: xml
:linenos:
@ -238,6 +238,7 @@ The heterodyne sensor type allows to model a generic heterodyne radio receiver w
<receiver_temp val="1050" val_unit="K"/>
<eta_fss val="0.97" val_unit=""/>
<lambda_line val="157.774" val_unit="um"/>
<lambda_local_oscillator val="158" val_unit="um"/>
<kappa val="1" val_unit=""/>
<n_on val="10" val_unit=""/>
</sensor>
@ -300,7 +301,7 @@ Attributes:
lambda_line
^^^^^^^^^^^
The wavelength of the observed line.
The wavelength or frequency of the observed line.
.. code-block:: xml
@ -312,6 +313,21 @@ Attributes:
* | **val_unit:** str, *optional* = "m"
| The unit of the observed line wavelength. This has to be on of [``nm``, ``um``, ``mm``, ``cm``, ``m``, ``Hz``, ``kHZ``, ``MHz``, ``GHz``, ``THz``].
lambda_local_oscillator
^^^^^^^^^^^
The wavelength or frequency of the local oscillator. This parameter is optional. If no value is given, the noise temperature of the signal band is doubled.
.. code-block:: xml
<lambda_local_oscillator val="158" val_unit="um"/>
Attributes:
* | **val:** float
| The wavelength of the local oscillator.
* | **val_unit:** str, *optional* = "m"
| The unit of the local oscillator wavelength. This has to be on of [``nm``, ``um``, ``mm``, ``cm``, ``m``, ``Hz``, ``kHZ``, ``MHz``, ``GHz``, ``THz``].
kappa
^^^^^
The instrument's backend degradation factor.

View File

@ -18,7 +18,7 @@ class Heterodyne(ASensor):
def __init__(self, parent: IRadiant, aperture_efficiency: float, main_beam_efficiency: float,
receiver_temp: u.Quantity, eta_fss: float, lambda_line: u.Quantity, kappa: float, common_conf: Entry,
n_on: float = None):
n_on: float = None, lambda_local_oscillator: u.Quantity = None):
"""
Initialize a new heterodyne detector
@ -48,6 +48,7 @@ class Heterodyne(ASensor):
self.__receiver_temp = receiver_temp
self.__eta_fss = eta_fss
self.__lambda_line = lambda_line
self.__lambda_local_oscillator = lambda_local_oscillator
self.__kappa = kappa
self.__common_conf = common_conf
self.__n_on = n_on
@ -78,7 +79,7 @@ class Heterodyne(ASensor):
# Calculate the signal and background temperatures
t_signal, t_background = self.calcTemperatures(background, signal, obstruction)
line_ind = np.where(t_signal.wl == self.__lambda_line)[0][0]
t_sys = 2 * (t_background + self.__receiver_temp + t_signal)
t_sys = t_background + 2 * self.__receiver_temp + t_signal
# Calculate the noise bandwidth
delta_nu = t_signal.wl.to(u.Hz, equivalencies=u.spectral()) / (t_signal.wl / self.__common_conf.wl_delta() + 1)
snr = []
@ -121,7 +122,7 @@ class Heterodyne(ASensor):
# Calculate the signal and background temperatures
t_signal, t_background = self.calcTemperatures(background, signal, obstruction)
line_ind = np.where(t_signal.wl == self.__lambda_line)[0][0]
t_sys = 2 * (t_background + self.__receiver_temp + t_signal)
t_sys = t_background + 2 * self.__receiver_temp + t_signal
# Calculate the noise bandwidth
delta_nu = t_signal.wl.to(u.Hz, equivalencies=u.spectral()) / (t_signal.wl / self.__common_conf.wl_delta() + 1)
exp_time = []
@ -172,7 +173,7 @@ class Heterodyne(ASensor):
# Calculate the signal and background temperatures
t_signal, t_background = self.calcTemperatures(background, signal, obstruction)
line_ind = np.where(t_signal.wl == self.__lambda_line)[0][0]
t_sys = 2 * (t_background + self.__receiver_temp + t_signal)
t_sys = t_background + 2 * self.__receiver_temp + t_signal
# Calculate the noise bandwidth
delta_nu = t_signal.wl.to(u.Hz, equivalencies=u.spectral()) / (t_signal.wl / self.__common_conf.wl_delta() + 1)
sensitivity = []
@ -318,6 +319,14 @@ class Heterodyne(ASensor):
t_signal = signal * (self.__main_beam_efficiency * signal.wl ** 2 / (
2 * k_B) * self.__eta_fss * u.sr)
t_signal = SpectralQty(t_signal.wl, t_signal.qty.decompose())
if self.__lambda_local_oscillator is None:
t_signal = t_signal * 2
t_background = t_background * 2
else:
t_signal = t_signal + t_signal.rebin(2 * self.__lambda_local_oscillator - t_signal.wl)
t_background = t_background + t_background.rebin(2 * self.__lambda_local_oscillator - t_background.wl)
logger.debug("Spectral signal temperature")
logger.debug(t_signal)
logger.debug("Target size: " + size)
@ -368,6 +377,10 @@ class Heterodyne(ASensor):
mes = sensor.lambda_line.check_quantity("val", u.nm)
if mes is not None:
return "lambda_line: " + mes
if hasattr(sensor, "lambda_local_oscillator"):
mes = sensor.lambda_local_oscillator.check_quantity("val", u.nm)
if mes is not None:
return "lambda_local_oscillator: " + mes
if not hasattr(sensor, "kappa"):
return "Missing container 'kappa'."
mes = sensor.kappa.check_float("val")