We have a fixed installation and due to the location, there are consistent strong reflections from a nearby object that are giving a false primary bearing. The true direction is a secondary bearing which is still quite distinct. I would like to tell the kraken to ignore any signal coming from certain general direction, for example 0º to 60º. Is there any way to do that?
Thanks for the reference SignalMedic. Reviewing the code, this looks like this basically a filtering proxy.
Have you used this successfully as a proxy between the Pi software and either the Kraken Android app or the Kraken Pro mapping service? Clearly the code is not that complicate and it would be best implemented on either the sending (Kraken Pi) or receiving (Kraken App or Kraken Pro Mapping Service). Hopefully Carl is tracking this conversation…
So I have been looking over the code… It looks like the strongest bearing provided by the returned bearing here (as theta_0) from two locations depending on the algorithm in use.
doas is an array of signal strength sorted with strongest last. We would need a chunk of code in the _ui tree as well to allow us to select an arc (or arcs) to ignore.
Does this seem like a reasonable analysis of this code, and a plausible path for implementing this feature. There is probably some aspect I have missed, so feedback welcome.
-Doug-
diff --git a/_sdr/_signal_processing/kraken_sdr_signal_processor.py b/_sdr/_signal_processing/kraken_sdr_signal_processor.py
index edb550f..8877c88 100755
--- a/_sdr/_signal_processing/kraken_sdr_signal_processor.py
+++ b/_sdr/_signal_processing/kraken_sdr_signal_processor.py
@@ -1025,6 +1025,9 @@ class SignalProcessor(threading.Thread):
# since roots are sorted based on how close they are to the unit circle,
# which in turn is proportional to SNR,
# then the last element should correspond to the strongest signal
+ #
+ # TODO(dpk): add filtering
+ # If filtering out part of circle, do that here by scanning back to the first value not in the filtered range.
theta_0 = doas[-1]
# ULA Array, choose bewteen the full omnidirecitonal 360 data, or forward/backward data only
@@ -1041,6 +1044,8 @@ class SignalProcessor(threading.Thread):
self.DOA[thetas[270:360].astype(int)] = min_val
if self.DOA_algorithm != "ROOT-MUSIC":
+ # TODO(dpk): add filtering
+ # If filtering out part of circle, do that here by scanning back to the first value not in the filtered range.
theta_0 = self.DOA_theta[np.argmax(self.DOA)]
return theta_0