diff --git a/@rfSensor/RSS.m b/@rfSensor/RSS.m
new file mode 100644
index 0000000..db0fcaf
--- /dev/null
+++ b/@rfSensor/RSS.m
@@ -0,0 +1,16 @@
+function value = RSS(obj, d, t)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")};
+ d (:, 1) double; % distance from agent to target
+ t (:, 1) double; % LOS tilt angle
+ end
+ arguments (Output)
+ value (:, 1) double
+ end
+
+ rho_dBm = 10*log10(obj.P_TX/1e-3);
+
+ % RSS = TX Power + Antenna Gain - Path Loss
+ value = rho_dBm + obj.antennaGain(t) - obj.pathLoss(d);
+
+end
\ No newline at end of file
diff --git a/@rfSensor/antennaGain.m b/@rfSensor/antennaGain.m
new file mode 100644
index 0000000..7fb9f3a
--- /dev/null
+++ b/@rfSensor/antennaGain.m
@@ -0,0 +1,12 @@
+function value = antennaGain(obj, t)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")};
+ t (:, 1) double; % LOS tilt angle
+ end
+ arguments (Output)
+ value (:, 1) double
+ end
+
+ % TODO
+ value = 10*log10(1);
+end
diff --git a/@rfSensor/initialize.m b/@rfSensor/initialize.m
new file mode 100644
index 0000000..dececa7
--- /dev/null
+++ b/@rfSensor/initialize.m
@@ -0,0 +1,9 @@
+function obj = initialize(obj)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")}
+ end
+ arguments (Output)
+ obj (1, 1) {mustBeA(obj, "rfSensor")}
+ end
+
+end
\ No newline at end of file
diff --git a/@rfSensor/pathLoss.m b/@rfSensor/pathLoss.m
new file mode 100644
index 0000000..69f51d9
--- /dev/null
+++ b/@rfSensor/pathLoss.m
@@ -0,0 +1,12 @@
+function L_FSPL_dB = pathLoss(obj, d)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")};
+ d (:, 1) double; % distance from TX to RX
+ end
+ arguments (Output)
+ L_FSPL_dB (:, 1) double
+ end
+
+ L_FSPL_dB = 20*log10(d) + 20*log10(obj.f_c) + 20*log10((4*pi)/obj.c);
+
+end
diff --git a/@rfSensor/plotParameters.m b/@rfSensor/plotParameters.m
new file mode 100644
index 0000000..4fa481b
--- /dev/null
+++ b/@rfSensor/plotParameters.m
@@ -0,0 +1,47 @@
+function f = plotParameters(obj)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")};
+ end
+ arguments (Output)
+ f (1, 1) {mustBeA(f, "matlab.ui.Figure")};
+ end
+
+ % Distance and tilt sample points
+ d = [0.01, 0.1, 0.25, 0.5, 0.75, 1:1:100];
+ t = zeros(size(d));
+
+ % Sample RSS function by distances, tilts
+ r_x = obj.RSS(d', t');
+
+ % Sample SINR (SNR) function by distances, tilts
+ % using SINR method with no other transmitters defined is equivalent to SNR
+ s_x = NaN(size(r_x));
+ for ii = 1:size(s_x, 1)
+ s_x(ii) = obj.sensorPerformance([0, 0, d(ii)], zeros(1, 3)); % don't define other sensors
+ end
+
+ % Plot resultant sigmoid curves
+ f = figure;
+ tiledlayout(f, 2, 1, "TileSpacing", "tight", "Padding", "compact");
+
+ % RSS/Distance with 0 tilt
+ nexttile(1, [1, 1]);
+ grid("on");
+ title("RSS vs Distance");
+ xlabel("Distance (m)");
+ ylabel("RSS (dBm)");
+ hold("on");
+ plot(d, r_x, "LineWidth", 2);
+ hold("off");
+ % ylim([0, 1]);
+
+ % SNR/Distance with 0 tilt
+ nexttile(2, [1, 1]);
+ grid("on");
+ title("SNR vs Distance");
+ xlabel("Distance (m)");
+ ylabel("SNR (dB)");
+ hold("on");
+ plot(d, s_x, "LineWidth", 2);
+ hold("off");
+end
\ No newline at end of file
diff --git a/@rfSensor/rfSensor.m b/@rfSensor/rfSensor.m
new file mode 100644
index 0000000..4f9c454
--- /dev/null
+++ b/@rfSensor/rfSensor.m
@@ -0,0 +1,23 @@
+classdef rfSensor
+ properties (SetAccess = private, GetAccess = public)
+ % Physical parameters
+ c = 3e8; % Speed of light (m/s)
+ k_B = 1.38e-23 % Boltzmann constant (W/Hz/K) for thermal noise model
+ T_0 = 300; % Ambient temperature (Kelvin) for thermal noise model
+ % Sensor parameters
+ P_TX = 10e-3; % Transmit power (Watts)
+ BW = 1e6; % Bandwidth (Hz)
+ f_c = 2e9; % Center frequency (Hz)
+ end
+
+ methods (Access = public)
+ [obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt); % TODO initialize sensor, define parameters
+ [SINR] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos); % determine sensor performance for a given single sensor and target geometry
+ [f] = plotParameters(obj); % debug, plot sensor response as a function of distance and tilt angle
+ end
+ methods (Access = private)
+ x = RSS(obj, d, t); % Received signal strength (function of distance and tilt angle)
+ G_TX_dB = antennaGain(obj, agentPos, targetPos); % TODO Antenna gain for a given TX/RX pair
+ L_FSPL_dB = pathLoss(obj, agentPos, targetPos); % Free space path loss for a given TX/RX pair
+ end
+end
\ No newline at end of file
diff --git a/@rfSensor/sensorPerformance.m b/@rfSensor/sensorPerformance.m
new file mode 100644
index 0000000..c88d7d5
--- /dev/null
+++ b/@rfSensor/sensorPerformance.m
@@ -0,0 +1,36 @@
+function SINR = sensorPerformance(obj, agentPos, targetPos, otherSensors, otherSensorsPos)
+ arguments (Input)
+ obj (1, 1) {mustBeA(obj, "rfSensor")};
+ agentPos (1, 3) double;
+ targetPos (1, 3) double;
+ otherSensors (:, 1) cell = {};
+ otherSensorsPos (:, 3) double = NaN(0, 3);
+ end
+ arguments (Output)
+ SINR (:, 1) double;
+ end
+ assert(size(otherSensors, 1) == size(otherSensorsPos, 1), "Mismatch in length of other sensors (%d) and their positions (%d)", size(otherSensors, 1), size(otherSensorsPos, 1));
+
+ d = vecnorm(agentPos - targetPos, 2, 2); % distance from sensor to target
+ d_other = NaN(size(otherSensors));
+
+ x = vecnorm(agentPos(1:2) - targetPos(1, 1:2), 2, 2); % distance from sensor nadir to target nadir (i.e. distance ignoring height difference)
+ x_other = NaN(size(otherSensors));
+
+ t = (180 - atan2d(x, targetPos(1, 3) - agentPos(3))); % degrees
+ t_other = NaN(size(otherSensors));
+
+ % Performance is measured as SINR for this sensor
+ S = 10^(0.1 * obj.RSS(d, t)); % Signal
+ N = obj.k_B * obj.T_0 * obj.BW; % Thermal noise
+ I = 0; % Interference from other agents
+ for ii = 1:size(otherSensors, 1)
+ d_other(ii, 1) = vecnorm(otherSensorsPos(ii, 1:3) - targetPos, 2, 2);
+
+ x_other(ii, 1) = vecnorm(otherSensorsPos(ii, 3) - targetPos(1, 1:2), 2, 2);
+ t_other(ii, 1) = (180 - atan2d(x_other(ii, 1), targetPos(1, 3) - otherSensorsPos(ii, 3)));
+
+ I = I + 10 ^ (0.1 * otherSensors.RSS(otherSensors{ii}, d_other(ii), t_other(ii)));
+ end
+ SINR = 10*log10(S/(I + N));
+end
\ No newline at end of file
diff --git a/@sigmoidSensor/sigmoidSensor.m b/@sigmoidSensor/sigmoidSensor.m
index c1a8e28..e25bd79 100644
--- a/@sigmoidSensor/sigmoidSensor.m
+++ b/@sigmoidSensor/sigmoidSensor.m
@@ -8,12 +8,12 @@ classdef sigmoidSensor
end
methods (Access = public)
- [obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt);
- [value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos);
- [f] = plotParameters(obj);
+ [obj] = initialize(obj, alphaDist, betaDist, alphaTilt, betaTilt); % initialize sensor, define parameters
+ [value] = sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos); % determine sensor performance for a given single sensor and target geometry
+ [f] = plotParameters(obj); % debug, plot sensor response as a function of distance and tilt angle
end
methods (Access = private)
- x = distanceMembership(obj, d);
- x = tiltMembership(obj, t);
+ x = distanceMembership(obj, d); % used in computing distance factor of sensor performance
+ x = tiltMembership(obj, t); % used in computing tilt factor of sensor performance
end
end
\ No newline at end of file
diff --git a/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qd.xml b/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qd.xml
new file mode 100644
index 0000000..378b613
--- /dev/null
+++ b/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qp.xml b/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qp.xml
new file mode 100644
index 0000000..180f4cc
--- /dev/null
+++ b/resources/project/FI0gxbH-PhwjE_riDQGHPyYMHks/BsVG5tuGBaruV5jvy4e3yG1jm4Qp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQd.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQd.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQp.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQp.xml
new file mode 100644
index 0000000..4401f9c
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/0TUOPB3gylGuEK1Q5NsFsa57FBQp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgd.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgd.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgp.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgp.xml
new file mode 100644
index 0000000..a8cb24d
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/9BCm86xMEE43ruM6njCMPywT3mgp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQd.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQd.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQp.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQp.xml
new file mode 100644
index 0000000..a6d7c3c
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/DKU4t7TpyzULRGxIyA4AFql5gKQp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8d.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8d.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8d.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8p.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8p.xml
new file mode 100644
index 0000000..919c37e
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/Waxi82DIfDNaoB9qVMSu-XeU4h8p.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUd.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUd.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUp.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUp.xml
new file mode 100644
index 0000000..844d632
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/bflJ_m_JEPly6uLay0BQMV_1uAUp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmod.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmod.xml
new file mode 100644
index 0000000..4356a6a
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmod.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmop.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmop.xml
new file mode 100644
index 0000000..01cb34e
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/jvRgOU4zI43Zz6soLWzgDAjnvmop.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEod.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEod.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEod.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEop.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEop.xml
new file mode 100644
index 0000000..ede8992
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/ugpKFhW2eBP_pSSkV0NyOiJaMEop.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOId.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOId.xml
new file mode 100644
index 0000000..99772b4
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOId.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOIp.xml b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOIp.xml
new file mode 100644
index 0000000..cde7183
--- /dev/null
+++ b/resources/project/MoO8eFA7MNcwhsnIRzm_IDZfmpg/vKw7EZP5Lkw7wHPSRNjXYJUWEOIp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgd.xml b/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgd.xml
new file mode 100644
index 0000000..4356a6a
--- /dev/null
+++ b/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgd.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgp.xml b/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgp.xml
new file mode 100644
index 0000000..eea8c49
--- /dev/null
+++ b/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/MoO8eFA7MNcwhsnIRzm_IDZfmpgp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/test/test_rfSensor.m b/test/test_rfSensor.m
new file mode 100644
index 0000000..61bcd79
--- /dev/null
+++ b/test/test_rfSensor.m
@@ -0,0 +1,25 @@
+classdef test_rfSensor < matlab.unittest.TestCase
+ properties (Access = private)
+ % System under test
+ testClass = sigmoidSensor;
+ end
+
+ methods (TestMethodSetup)
+ function tc = setup(tc)
+ % Reinitialize sensor with random parameters
+ tc.testClass = rfSensor;
+ % TODO
+ tc.testClass = tc.testClass.initialize();
+ end
+ end
+
+ methods (Test)
+ % Test methods
+
+ function test_SINR(tc)
+ tc.testClass.plotParameters();
+ % [SINR] = tc.testClass.sensorPerformance(obj, agentPos, agentPan, agentTilt, targetPos);
+ end
+ end
+
+end
\ No newline at end of file