gr-osmosdr/lib
Dimitri Stolnikov 164a09fc11 airspy: Option pack={0,1} to enable USB bit packing
Patch provided by Martin Smith.

Last July there were several changes made to the Airspy firmware and
libairspy that added support for a new bit packing mode where 4 sets of
12 bit samples are packed into 3 sets of 16 bits for the transfer across
the USB bus ( https://i.imgur.com/qXnWoEK.png?1 ). 25% less data is
transferred across the bus and this is good for some computers with
cheap USB chipsets. There is an overhead of extra memory bandwidth
required on the host side to unpack the data into a useful format, so
for optimal performance bit packing is disabled by default.

The data is automatically unpacked within libairspy before being passed
along, so no changes are required anywhere else if packing is enabled
(or not enabled). Airspy firmware older than v1.0.0-rc6 does not have
the function, but that is detected and handled by libairspy.

I wrote the attached patch to enable packing in gr-osmosdr, which I
tested and it works. It is basically a clone of the bias=0|1 lines as
pack=0|1 and calls the needed libairspy function.

ref:
https://github.com/airspy/firmware/commit/7e1806b
https://github.com/airspy/firmware/commit/5b7dcab
https://github.com/airspy/host/commit/a51eccb

---
Do some Baseline test with Airspy command line tools to have something
to compare USB throughput results
--------------------------------------------------------------------------------------------------------
$ sudo mount -t debugfs none /sys/kernel/debug
$ sudo modprobe usbmon
$ wireshark -i usbmod3 &
$ airspy_info ; sleep 120 ; \
airspy_rx -t 4 -r /dev/null -n 2400000000 ; sleep 120 ; \
airspy_rx -t 4 -r /dev/null -p 1 -n 2400000000 ; sleep 120 ; \
airspy_info
Wireshark->Statistics->IO Graph
The Bytes/Tick are double the actual data rate because of way wireshark
collects the USB packets, I could have added a filter to fix this. But
the relationship is valid 25% less with packing enabled. The data rate
in the IO Grahp drops from 80MB/sec (in+out) [really 40MB/sec] to
60MB/second (in+out) [really 30MB/sec] from unpacked to packed.
10MSPS no packing, packing https://i.imgur.com/pA9LPdE.png?1
2.5MSPS no packing, packing https://i.imgur.com/lA8q5aq.png?1

Verification test with my patched gr-osmosdr
--------------------------------------------
$ sudo mount -t debugfs none /sys/kernel/debug
$ sudo modprobe usbmon
$ wireshark -i usbmod3 &
$ osmocom_fft -a "airspy=0" -s 10000000 --fft-rate=1
$ osmocom_fft -a "airspy=0,pack=1" -s 10000000 --fft-rate=1
$ osmocom_fft -a "airspy=0" -s 2500000 --fft-rate=1
$ osmocom_fft -a "airspy=0,pack=1" -s 2500000 --fft-rate=1
$ osmocom_fft -a "airspy=0" -s 2500000 --fft-rate=1
$ osmocom_fft -a "airspy=0,pack=0" -s 2500000 --fft-rate=1

I ran all of the above tests and the wireshark USB throughput graphs
showed exactly what was expected.
40MB/sec(10MSPS+normal),30MB/sec(10MSPS+packing),10MB/sec(2.5MSPS
+normal),7.5MB/sec(2.5MSPS+packing),10MB/sec(2.5MSPS+normal),10MB/
sec(2.5MSPS+normal).

25% less when packing was enabled and if you did not specify the
"pack=1", then no bit packing is performed by libairspy. All the
magnitudes within the FFT windows looked exactly the same as they do
without bit packing.
2016-02-28 17:52:01 +01:00
..
airspy airspy: Option pack={0,1} to enable USB bit packing 2016-02-28 17:52:01 +01:00
bladerf bladerf: implement options for clock configuration 2016-02-28 17:45:54 +01:00
fcd fcd: add support for FUNcube Dongle Pro+ 2013-07-14 12:09:55 +02:00
file added file_sink_c 2016-01-10 22:12:19 +01:00
hackrf do not check for NULL before calling free 2016-01-10 22:48:31 +01:00
miri do not check for NULL before calling free 2016-01-10 22:48:31 +01:00
osmosdr do not check for NULL before calling free 2016-01-10 22:48:31 +01:00
redpitaya redpitaya: fix compilation errors on MS Windows and on Mac OS X 2016-01-10 22:05:53 +01:00
rfspace rfspace: Add basic Cloud-IQ support. 2015-12-10 20:54:26 +01:00
rtl do not check for NULL before calling free 2016-01-10 22:48:31 +01:00
rtl_tcp rtl_tcp: fix ssize_t definition for MSVC 2015-12-06 15:49:44 -08:00
sdrplay do not check for NULL before calling free 2016-01-10 22:48:31 +01:00
soapy soapy: do not throw when IQ bal mode is set to off 2015-12-06 15:19:26 -08:00
uhd introduce time & clock synchronisation APIs 2014-11-25 20:47:59 +01:00
CMakeLists.txt cmake: update component name & update AUTHORS file 2016-01-10 22:28:15 +01:00
arg_helpers.h osmo: minor build tweaks w/ rtl on msvc 2015-04-28 22:27:53 +02:00
config.h.in redpitaya: add support for Red Pitaya SDR transceiver 2015-12-18 22:02:25 +01:00
device.cc add Red Pitaya discovery in device find function 2016-01-10 22:19:13 +01:00
gnuradio-osmosdr.rc.in cmake: add windows dll resource file 2013-04-16 21:53:09 +02:00
ranges.cc introduce osmosdr namespace, remove _c suffix 2013-05-30 16:14:22 +02:00
sink_iface.h introduce time & clock synchronisation APIs 2014-11-25 20:47:59 +01:00
sink_impl.cc added file_sink_c 2016-01-10 22:12:19 +01:00
sink_impl.h introduce time & clock synchronisation APIs 2014-11-25 20:47:59 +01:00
source_iface.h introduce time & clock synchronisation APIs 2014-11-25 20:47:59 +01:00
source_impl.cc redpitaya: add support for Red Pitaya SDR transceiver 2015-12-18 22:02:25 +01:00
source_impl.h introduce time & clock synchronisation APIs 2014-11-25 20:47:59 +01:00
time_spec.cc osmo: minor build tweaks w/ rtl on msvc 2015-04-28 22:27:53 +02:00