From 2c50144e0cbdc7071b46dbc04c8fee135307ae8d Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Wed, 22 Feb 2023 08:40:23 +0100
Subject: [PATCH] Add func_sdp_subband_equalizer().

---
 .../libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd      | 39 +++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
index 762d2e704f..b9e41374bc 100644
--- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
+++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd
@@ -77,6 +77,19 @@ PACKAGE tb_sdp_pkg is
 
   FUNCTION func_sdp_verify_cep_header(in_hdr, exp_hdr : t_sdp_cep_header) RETURN BOOLEAN;
 
+  -----------------------------------------------------------------------------
+  -- Subband equalizer (ESub)
+  -----------------------------------------------------------------------------
+  -- - ESub is like a two input beamformer
+  -- - Esub function calculates the expected subband level for signal input sp:
+  --   sp phasor * sp_weight + cross_phasor * cross weigth, where
+  --   . sp phasor = (sp_subband_ampl, sp_subband_phase)
+  --   . sp_weight = (sp_esub_gain, sp_esub_phase)
+  --   . cross_phasor = (cross_subband_ampl, cross_subband_phase)
+  --   . cross_weight = (cross_esub_gain, cross_esub_phase)
+  FUNCTION func_sdp_subband_equalizer(sp_subband_ampl, sp_subband_phase, sp_esub_gain, sp_esub_phase,
+                                      cross_subband_ampl, cross_subband_phase, cross_esub_gain, cross_esub_phase : REAL)
+                                      RETURN t_real_arr;  -- 0:3 = ampl, phase, re, im
 
 END PACKAGE tb_sdp_pkg;
 
@@ -393,4 +406,30 @@ PACKAGE BODY tb_sdp_pkg IS
     RETURN TRUE;
   END func_sdp_verify_cep_header;
 
+
+  FUNCTION func_sdp_subband_equalizer(sp_subband_ampl, sp_subband_phase, sp_esub_gain, sp_esub_phase,
+                                      cross_subband_ampl, cross_subband_phase, cross_esub_gain, cross_esub_phase : REAL)
+                                      RETURN t_real_arr IS  -- 0:3 = ampl, phase, re, im
+    VARIABLE v_sp_ampl, v_sp_phase, v_sp_re, v_sp_im : REAL;
+    VARIABLE v_cross_ampl, v_cross_phase, v_cross_re, v_cross_im : REAL;
+    VARIABLE v_sum_ampl, v_sum_phase, v_sum_re, v_sum_im : REAL;
+    VARIABLE v_tuple : t_real_arr(0 TO 3);
+  BEGIN
+    v_sp_ampl   := sp_subband_ampl * sp_esub_gain;
+    v_sp_phase  := sp_subband_phase + sp_esub_phase;
+    v_sp_re     := COMPLEX_RE(v_sp_ampl, v_sp_phase);
+    v_sp_im     := COMPLEX_IM(v_sp_ampl, v_sp_phase);
+    v_cross_ampl  := cross_subband_ampl * cross_esub_gain;
+    v_cross_phase := cross_subband_phase + cross_esub_phase;
+    v_cross_re    := COMPLEX_RE(v_cross_ampl, v_cross_phase);
+    v_cross_im    := COMPLEX_IM(v_cross_ampl, v_cross_phase);
+    v_sum_re    := v_sp_re + v_cross_re;  -- ESub sum re
+    v_sum_im    := v_sp_im + v_cross_im;  -- ESub sum im
+    v_sum_ampl  := COMPLEX_RADIUS(v_sum_re, v_sum_im);
+    v_sum_phase := COMPLEX_PHASE(v_sum_re, v_sum_im);
+    v_tuple     := (0 => v_sum_ampl, 1 => v_sum_phase, 2 => v_sum_re, 3 => v_sum_im);
+    RETURN v_tuple;
+  END;
+
+
 END tb_sdp_pkg;
-- 
GitLab