Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Jan 2013 19:16:28 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r245174 - user/adrian/ath_radar_stuff/lib/libradarpkt
Message-ID:  <201301081916.r08JGSnl073791@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Tue Jan  8 19:16:28 2013
New Revision: 245174
URL: http://svnweb.freebsd.org/changeset/base/245174

Log:
  Process the HT20 data into dBm values.

Modified:
  user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c

Modified: user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c
==============================================================================
--- user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c	Tue Jan  8 19:16:08 2013	(r245173)
+++ user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c	Tue Jan  8 19:16:28 2013	(r245174)
@@ -33,6 +33,7 @@
 #include <sys/types.h>
 #include <sys/endian.h>
 #include <string.h>	/* for memcpy() */
+#include <math.h>
 
 #include <sys/socket.h>
 #include <net/if.h>
@@ -66,56 +67,64 @@
  * GPLed snippet from Zefir on the linux-wireless list; rewrite this
  * soon!
  */
-#if 0
+#if 1
 /*
  * In my system the post-processed FFT raw data is transferred via a netlink
  * interface to a spectral_proxy, that forwards it to a connected host for real-time
  * inspection and visualization.
-
+ *
  * The interpretation of the data is as follows: the reported values are given as
  * magnitudes, which need to be scaled and converted to absolute power values based
  * on the packets noise floor and RSSI values as follows:
  * bin_sum = 10*log(sum[i=1..56](b(i)^2)
  * power(i) = noise_floor + RSSI + 10*log(b(i)^2) - bin_sum
-
+ *
  * The code fragment to convert magnitude to absolute power values looks like this
  * (assuming you transferred the FFT and magnitude data to user space):
-*/
-bool
-convert_data(struct spectral_ht20_msg *msg)
+ */
+int
+convert_data_ht20(struct radar_entry *re, struct radar_fft_entry *fe)
 {
-       uint8_t *bin_pwr = msg->bin;
-       uint8_t *dc_pwr = msg->bin + SPECTRAL_NUM_BINS / 2;
-       int pwr_count = SPECTRAL_NUM_BINS;
-       int8_t rssi = msg->rssi;
-       int8_t max_scale = 1 << msg->max_exp;
-       int16_t max_mag = msg->max_magnitude;
-       int i;
-       int nf0 = msg->noise_floor;
-
-       float bsum = 0.0;
-
-       // DC value is invalid -> interpolate
-       *dc_pwr = (dc_pwr[-1] + dc_pwr[1]) / 2;
-
-       for (i = 0; i < pwr_count; i++)
-               bsum += (bin_pwr[i] * max_scale) * (bin_pwr[i] * max_scale);
-       bsum = log10f(bsum) * 10;
-
-       for (i = 0; i < pwr_count; i++) {
-               float pwr_val;
-               int16_t val = bin_pwr[i];
-
-               if (val == 0)
-                       val = 1;
-
-               pwr_val = 20 * log10f((float) val * max_scale);
-               pwr_val += nf0 + rssi - bsum;
-
-               val = pwr_val;
-               bin_pwr[i] = val;
-       }
-       return true;
+	int dc_pwr_idx = AR9280_SPECTRAL_SAMPLE_SIZE_HT20 / 2;
+	int pwr_count = AR9280_SPECTRAL_SAMPLE_SIZE_HT20;
+	int i;
+	int nf0 = -96;	/* XXX populate re with this first! */
+	float bsum = 0.0;
+
+	/* DC value is invalid -> interpolate */
+	fe->pri.bins[dc_pwr_idx].raw_mag =
+	    (fe->pri.bins[dc_pwr_idx - 1].raw_mag + fe->pri.bins[dc_pwr_idx + 1].raw_mag) / 2;
+	/* XXX adj mag? */
+	fe->pri.bins[dc_pwr_idx].adj_mag =
+	    fe->pri.bins[dc_pwr_idx].raw_mag << fe->max_exp;
+
+	/* Calculate the total power - use pre-adjusted magnitudes */
+	for (i = 0; i < pwr_count; i++)
+		bsum += (float) (fe->pri.bins[i].adj_mag) * (float) (fe->pri.bins[i].adj_mag);
+	bsum = log10f(bsum) * 10.0;
+
+	/*
+	 * Given the current NF/RSSI value, calculate an absolute dBm, then
+	 * break each part up into its consitutent component.
+	 */
+	for (i = 0; i < pwr_count; i++) {
+		float pwr_val;
+		int16_t val = fe->pri.bins[i].adj_mag;
+
+		if (val == 0)
+			val = 1;
+
+		pwr_val = 20.0 * log10f((float) val);
+		pwr_val += (float) nf0 + (float) re->re_rssi - bsum;
+
+		fe->pri.bins[i].dBm = pwr_val;
+#if 0
+		printf("  [%d] %d -> %d, ", i, fe->pri.bins[i].adj_mag,
+		    fe->pri.bins[i].dBm);
+#endif
+	}
+//	printf("\n");
+	return (1);
 }
 #endif
 
@@ -182,6 +191,9 @@ ar9280_radar_spectral_decode_ht20(struct
 		fe->pri.bins[i].adj_mag = fe->pri.bins[i].raw_mag << fe->max_exp;
 	}
 
+	/* Convert to dBm */
+	(void) convert_data_ht20(re, fe);
+
 	/* Return OK */
 	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301081916.r08JGSnl073791>