From 0eb1364cf7f2763b043e9430e20beb228d1fd01d Mon Sep 17 00:00:00 2001 From: Tatu Peltola Date: Tue, 7 Jun 2016 21:00:10 +0300 Subject: [PATCH 01/24] Use FFT averaging --- plugins/dsp/csdr/plugin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index be31bfa0..40cf8f98 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -26,7 +26,7 @@ import os import code import signal import fcntl - +fft_averages = 50 class dsp_plugin: def __init__(self): @@ -58,7 +58,8 @@ class dsp_plugin: if self.csdr_through: any_chain_base+="csdr through | " any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " if which == "fft": - fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" + #fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" + fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} 50 | csdr fft_exchange_sides_ff {fft_size}" if self.fft_compression=="adpcm": return fft_chain_base+" | csdr compress_fft_adpcm_f_u8 {fft_size}" else: @@ -118,7 +119,7 @@ class dsp_plugin: self.fft_fps=fft_fps def fft_block_size(self): - return self.samp_rate/self.fft_fps + return self.samp_rate/self.fft_fps/fft_averages def set_format_conversion(self,format_conversion): self.format_conversion=format_conversion From e9578c620b9369364fd39e2871cc329f7f689b79 Mon Sep 17 00:00:00 2001 From: Tatu Peltola Date: Tue, 7 Jun 2016 21:51:04 +0300 Subject: [PATCH 02/24] Put number of averages in configuration --- config_webrx.py | 3 ++- openwebrx.py | 1 + plugins/dsp/csdr/plugin.py | 13 +++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index f888c79b..cd079c05 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -69,7 +69,8 @@ sdrhu_public_listing = False # ==== DSP/RX settings ==== dsp_plugin="csdr" fft_fps=9 -fft_size=4096 +fft_size=16384 # averaging only works on fft_size=16384 for some reason +fft_averages=50 samp_rate = 250000 center_freq = 145525000 diff --git a/openwebrx.py b/openwebrx.py index 16253814..9a568c77 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -270,6 +270,7 @@ def spectrum_thread_function(): dsp.set_samp_rate(cfg.samp_rate) dsp.set_fft_size(cfg.fft_size) dsp.set_fft_fps(cfg.fft_fps) + dsp.set_fft_averages(cfg.fft_averages) dsp.set_fft_compression(cfg.fft_compression) dsp.set_format_conversion(cfg.format_conversion) apply_csdr_cfg_to_dsp(dsp) diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index 40cf8f98..d82140e5 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -26,7 +26,7 @@ import os import code import signal import fcntl -fft_averages = 50 + class dsp_plugin: def __init__(self): @@ -51,6 +51,7 @@ class dsp_plugin: self.csdr_print_bufsizes = False self.csdr_through = False self.squelch_level = 0 + self.fft_averages = 50 def chain(self,which): any_chain_base="ncat -v 127.0.0.1 {nc_port} | " @@ -59,7 +60,7 @@ class dsp_plugin: any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " if which == "fft": #fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" - fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} 50 | csdr fft_exchange_sides_ff {fft_size}" + fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} {fft_averages} | csdr fft_exchange_sides_ff {fft_size}" if self.fft_compression=="adpcm": return fft_chain_base+" | csdr compress_fft_adpcm_f_u8 {fft_size}" else: @@ -118,8 +119,12 @@ class dsp_plugin: #to change this, restart is required self.fft_fps=fft_fps + def set_fft_averages(self,fft_averages): + #to change this, restart is required + self.fft_averages=fft_averages + def fft_block_size(self): - return self.samp_rate/self.fft_fps/fft_averages + return self.samp_rate/self.fft_fps/self.fft_averages def set_format_conversion(self,format_conversion): self.format_conversion=format_conversion @@ -182,7 +187,7 @@ class dsp_plugin: #run the command command=command_base.format( bpf_pipe=self.bpf_pipe, shift_pipe=self.shift_pipe, decimation=self.decimation, \ - last_decimation=self.last_decimation, fft_size=self.fft_size, fft_block_size=self.fft_block_size(), \ + last_decimation=self.last_decimation, fft_size=self.fft_size, fft_block_size=self.fft_block_size(), fft_averages=self.fft_averages, \ bpf_transition_bw=float(self.bpf_transition_bw)/self.if_samp_rate(), ddc_transition_bw=self.ddc_transition_bw(), \ flowcontrol=int(self.samp_rate*2), start_bufsize=self.base_bufsize*self.decimation, nc_port=self.nc_port, \ squelch_pipe=self.squelch_pipe, smeter_pipe=self.smeter_pipe ) From 6df72f3a98feb68e8498c65695f808bc75b1c5f1 Mon Sep 17 00:00:00 2001 From: Tatu Peltola Date: Tue, 7 Jun 2016 22:04:27 +0300 Subject: [PATCH 03/24] Made waterfall palette with better contrast --- config_webrx.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index cd079c05..e79c2495 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -140,9 +140,9 @@ iq_server_port = 4951 #TCP port for ncat to listen on. It will send I/Q data ove #access_log = "~/openwebrx_access.log" -waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]" -waterfall_min_level = -115 #in dB -waterfall_max_level = 0 +waterfall_colors = "[0x000000ff,0x0000ffff,0x00ffffff,0x00ff00ff,0xffff00ff,0xff0000ff,0xff00ffff,0xffffffff]" +waterfall_min_level = -85 #in dB +waterfall_max_level = -20 #A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels #Warning! The settings below are very experimental. From e3a51a45f3071e9b63e36adae1d85f6bb229757c Mon Sep 17 00:00:00 2001 From: Tatu Peltola Date: Tue, 7 Jun 2016 22:55:58 +0300 Subject: [PATCH 04/24] Changed zoom levels --- htdocs/openwebrx.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 0055b131..770503c2 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1019,7 +1019,7 @@ function canvas_mousewheel(evt) zoom_max_level_hps=33; //Hz/pixel -zoom_levels_count=5; +zoom_levels_count=14; function get_zoom_coeff_from_hps(hps) { @@ -1041,8 +1041,10 @@ function mkzoomlevels() zoom_levels=[1]; maxc=get_zoom_coeff_from_hps(zoom_max_level_hps); if(maxc<1) return; + // logarithmic interpolation + zoom_ratio = Math.pow(maxc, 1/zoom_levels_count); for(i=1;i Date: Sun, 24 Jul 2016 12:13:28 +0200 Subject: [PATCH 05/24] Fixed TOTAL_MEMORY and replaced sdr.js with a new one --- htdocs/sdr.js | 144 ++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 74 deletions(-) diff --git a/htdocs/sdr.js b/htdocs/sdr.js index dcc9229d..0ac33ca7 100644 --- a/htdocs/sdr.js +++ b/htdocs/sdr.js @@ -1167,7 +1167,7 @@ function enlargeMemory() { } var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; -var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216; +var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 67108864; var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152; var totalMemory = 4096; @@ -7565,7 +7565,7 @@ var asm = (function(global, env, buffer) { h = a + 12 | 0; k = +g[h >> 2]; k = +g[a + 24 >> 2] / (o < k ? k : o); - k = k > 65.0e3 ? 65.0e3 : k; + k = k > 50.0 ? 50.0 : k; if (j) { j = a + 28 | 0; l = a | 0; @@ -7741,17 +7741,23 @@ var asm = (function(global, env, buffer) { break } do { - n = d + (k << 2) | 0; - g[n >> 2] = +g[n >> 2] * .340447550238101 / +g[f + (k << 2) >> 2]; + o = +g[f + (k << 2) >> 2]; + l = d + (k << 2) | 0; + if (o != 0.0) { + o = +g[l >> 2] * .340447550238101 / o + } else { + o = 0.0 + } + g[l >> 2] = o; k = k + 1 | 0; } while ((k | 0) < (e | 0)) } } while (0); - m = b + (e - 1 << 3) | 0; + h = b + (e - 1 << 3) | 0; n = a; - h = c[m + 4 >> 2] | 0; - c[n >> 2] = c[m >> 2]; - c[n + 4 >> 2] = h; + m = c[h + 4 >> 2] | 0; + c[n >> 2] = c[h >> 2]; + c[n + 4 >> 2] = m; i = j; return } @@ -8047,24 +8053,7 @@ var asm = (function(global, env, buffer) { return } - function Rb(a, c, d) { - a = a | 0; - c = c | 0; - d = d | 0; - var e = 0; - if ((d | 0) > 0) { - e = 0 - } else { - return - } - do { - g[c + (e << 2) >> 2] = +(b[a + (e << 1) >> 1] | 0) / 32767.0; - e = e + 1 | 0; - } while ((e | 0) < (d | 0)); - return - } - - function Sb(b, c, d) { + function Rb(b, c, d) { b = b | 0; c = c | 0; d = d | 0; @@ -8081,6 +8070,23 @@ var asm = (function(global, env, buffer) { return } + function Sb(a, c, d) { + a = a | 0; + c = c | 0; + d = d | 0; + var e = 0; + if ((d | 0) > 0) { + e = 0 + } else { + return + } + do { + g[c + (e << 2) >> 2] = +(b[a + (e << 1) >> 1] | 0) / 32767.0; + e = e + 1 | 0; + } while ((e | 0) < (d | 0)); + return + } + function Tb(a, c, d) { a = a | 0; c = c | 0; @@ -8381,8 +8387,8 @@ var asm = (function(global, env, buffer) { var m = 0.0, n = 0, o = 0, - p = 0.0, - q = 0, + p = 0, + q = 0.0, r = 0.0, s = 0, t = 0.0; @@ -8393,59 +8399,49 @@ var asm = (function(global, env, buffer) { } o = 0; m = l; - p = d / l; - q = 0; + q = d / l; + p = 0; n = 1; - while (1) { + do { l = +g[a + (n << 2) >> 2]; t = +M(+l); r = d / t - m; - do { - if (l != 0.0) { - do { - if (r < 0.0) { - s = p < t; - o = s ? j : o; - p = s ? t : p; - if (o << 16 >> 16 > 0) { - r = 0.0; - o = o - 1 & 65535; - break - } else { - r = r * e; - q = i; - break - } + if (l != 0.0) { + do { + if (r < 0.0) { + s = q < t; + o = s ? j : o; + q = s ? t : q; + if (o << 16 >> 16 > 0) { + r = 0.0; + o = o - 1 & 65535; + break } else { - if (q << 16 >> 16 > 0) { - r = 0.0; - q = q - 1 & 65535; - break - } else { - r = r * f; - break - } + r = r * e; + p = i; + break + } + } else { + if (p << 16 >> 16 > 0) { + r = 0.0; + p = p - 1 & 65535; + break + } else { + r = r * f; + break } - } while (0); - r = m + r; - r = r > h ? h : r; - if (r >= 0.0) { - break } - r = 0.0 - } else { - r = m - } - } while (0); - g[b + (n << 2) >> 2] = (m + r - m * k) * l; - n = n + 1 | 0; - if ((n | 0) < (c | 0)) { - m = r + } while (0); + r = m + r } else { - break + r = m } - } - return +r + r = r > h ? h : r; + m = m + (r < 0.0 ? 0.0 : r) - m * k; + g[b + (n << 2) >> 2] = l * m; + n = n + 1 | 0; + } while ((n | 0) < (c | 0)); + return +m } function _b(d, e, f, g, h) { @@ -10994,7 +10990,7 @@ var asm = (function(global, env, buffer) { _firdes_wkernel_hamming: lb, _fir_decimate_cc: ub, _encode_ima_adpcm_i16_u8: _b, - _convert_i16_f: Rb, + _convert_i16_f: Sb, _shift_addition_init: Vb, _decimating_shift_addition_cc: Yb, _decimating_shift_addition_init: Xb, @@ -11005,7 +11001,7 @@ var asm = (function(global, env, buffer) { _fmdemod_quadri_cf: Gb, _amdemod_cf: zb, _log2n: Lb, - _convert_f_u8: Sb, + _convert_f_u8: Rb, _rational_resampler_get_lowpass_f: wb, _apply_fir_fft_cc: yb, _fractional_decimator_ff: xb, From 716fe9dc7cbefaeb8e4e518d444846beac8400d6 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 24 Jul 2016 13:34:15 +0200 Subject: [PATCH 06/24] Corrected sample rate for audio overrun calculation. --- htdocs/openwebrx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index a24925eb..fb485bf5 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1419,7 +1419,7 @@ var audio_underrun_cnt = 0; function audio_buffer_progressbar_update() { if(audio_buffer_progressbar_update_disabled) return; - var audio_buffer_value=(audio_prepared_buffers.length*audio_buffer_size)/44100; + var audio_buffer_value=(audio_prepared_buffers.length*audio_buffer_size)/audio_context.sampleRate; audio_buffer_total_average_level_length++; audio_buffer_total_average_level=(audio_buffer_total_average_level*((audio_buffer_total_average_level_length-1)/audio_buffer_total_average_level_length))+(audio_buffer_value/audio_buffer_total_average_level_length); var overrun=audio_buffer_value>audio_buffer_maximal_length_sec; var underrun=audio_prepared_buffers.length==0; From 62f49cbf4c066cd792b77307b63ca0c542e0a92c Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 24 Jul 2016 13:51:09 +0200 Subject: [PATCH 07/24] Automatically increase audio_buffer_size if audio_context.sampleRate is higher --- htdocs/openwebrx.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index fb485bf5..ce5be95b 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1297,14 +1297,14 @@ var audio_node; var audio_input_buffer_size; // Optimalise these if audio lags or is choppy: -var audio_buffer_size = 4096;//2048 was choppy +var audio_buffer_size; var audio_buffer_maximal_length_sec=3; //actual number of samples are calculated from sample rate var audio_buffer_decrease_to_on_overrun_sec=2.2; var audio_flush_interval_ms=500; //the interval in which audio_flush() is called var audio_prepared_buffers = Array(); -var audio_rebuffer = new sdrjs.Rebuffer(audio_buffer_size,sdrjs.REBUFFER_FIXED); -var audio_last_output_buffer = new Float32Array(audio_buffer_size); +var audio_rebuffer; +var audio_last_output_buffer; var audio_last_output_offset = 0; var audio_buffering = false; //var audio_buffering_fill_to=4; //on audio underrun we wait until this n*audio_buffer_size samples are present @@ -1542,12 +1542,21 @@ function audio_preinit() catch(e) { divlog('Your browser does not support Web Audio API, which is required for WebRX to run. Please upgrade to a HTML5 compatible browser.', 1); + return; } - //we send our setup packet + if(audio_context.sampleRate<44100*2) + audio_buffer_size = 4096; + else if(audio_context.sampleRate>=44100*2 && audio_context.sampleRate<44100*4) + audio_buffer_size = 4096 * 2; + else if(audio_context.sampleRate>44100*4) + audio_buffer_size = 4096 * 4; + audio_rebuffer = new sdrjs.Rebuffer(audio_buffer_size,sdrjs.REBUFFER_FIXED); + audio_last_output_buffer = new Float32Array(audio_buffer_size); + + //we send our setup packet parsehash(); - //needs audio_context.sampleRate to exist audio_calculate_resampling(audio_context.sampleRate); audio_resampler = new sdrjs.RationalResamplerFF(audio_client_resampling_factor,1); From 875b1a5384f9dd84e1c321b01653517890d803e9 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 14 Aug 2016 15:33:38 +0200 Subject: [PATCH 08/24] Squelch level can be set from URL --- htdocs/openwebrx.js | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index ce5be95b..7c9ab968 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -1522,6 +1522,7 @@ function parsehash() harr=x.split("="); console.log(harr); if(harr[0]=="mod") starting_mod = harr[1]; + if(harr[0]=="sql") { e("openwebrx-panel-squelch").value=harr[1]; updateSquelch(); } if(harr[0]=="freq") { console.log(parseInt(harr[1])); console.log(center_freq); From f38243d8b890c3ec58c4df974e1617f8da5ced54 Mon Sep 17 00:00:00 2001 From: Tatu Peltola Date: Sat, 22 Oct 2016 22:43:51 +0300 Subject: [PATCH 09/24] FFT averaging now works on any FFT size + some cleanup --- config_webrx.py | 8 +++++--- plugins/dsp/csdr/plugin.py | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index ab9e7fd9..b819ad27 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -69,10 +69,12 @@ sdrhu_public_listing = False # ==== DSP/RX settings ==== dsp_plugin="csdr" fft_fps=9 -fft_size=16384 # averaging only works on fft_size=16384 for some reason -fft_averages=50 +fft_size=4096 +fft_overlap=0.3 samp_rate = 250000 +fft_averages=int(round(1.0 * samp_rate / fft_size / fft_fps / (1.0 - fft_overlap))) + center_freq = 145525000 rf_gain = 5 #in dB. For an RTL-SDR, rf_gain=0 will set the tuner to auto gain mode, else it will be in manual gain mode. ppm = 0 @@ -148,7 +150,7 @@ iq_server_port = 4951 #TCP port for ncat to listen on. It will send I/Q data ove #access_log = "~/openwebrx_access.log" waterfall_colors = "[0x000000ff,0x0000ffff,0x00ffffff,0x00ff00ff,0xffff00ff,0xff0000ff,0xff00ffff,0xffffffff]" -waterfall_min_level = -85 #in dB +waterfall_min_level = -88 #in dB waterfall_max_level = -20 #A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index d82140e5..65973307 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -59,8 +59,11 @@ class dsp_plugin: if self.csdr_through: any_chain_base+="csdr through | " any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " if which == "fft": - #fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" - fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} {fft_averages} | csdr fft_exchange_sides_ff {fft_size}" + if self.fft_averages > 1: + fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} {fft_averages} | csdr fft_exchange_sides_ff {fft_size}" + else: + fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" + if self.fft_compression=="adpcm": return fft_chain_base+" | csdr compress_fft_adpcm_f_u8 {fft_size}" else: From 816f860de38fb3a482dfaee6d2ccd86082060bea Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sat, 29 Oct 2016 20:43:16 +0200 Subject: [PATCH 10/24] Readded old waterfall colors to config_webrx.py as an option, fixed formatting in config --- config_webrx.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index b819ad27..f3c1d587 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -133,7 +133,7 @@ To use a HackRF, compile the HackRF host tools from its "stdout" branch: #start_rtl_command="cat /tmp/osmocom_fifo" #format_conversion="" -# ==== Misc options ==== +# ==== Misc settings ==== shown_center_freq = center_freq #you can change this if you use an upconverter @@ -149,12 +149,21 @@ iq_server_port = 4951 #TCP port for ncat to listen on. It will send I/Q data ove #access_log = "~/openwebrx_access.log" +# ==== Color themes ==== + +#A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels +### default theme by teejez: waterfall_colors = "[0x000000ff,0x0000ffff,0x00ffffff,0x00ff00ff,0xffff00ff,0xff0000ff,0xff00ffff,0xffffffff]" waterfall_min_level = -88 #in dB waterfall_max_level = -20 -#A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels +### old theme by HA7ILM: +#waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]" +#waterfall_min_level = -115 #in dB +#waterfall_max_level = 0 -#Warning! The settings below are very experimental. +# ==== Experimental settings === + +#Warning! These are very experimental. csdr_dynamic_bufsize = False # This allows you to change the buffering mode of csdr. csdr_print_bufsizes = False # This prints the buffer sizes used for csdr processes. csdr_through = False # Setting this True will print out how much data is going into the DSP chains. From a31d4b9fe25fb14d9bf53afbaf3d0782539a81e7 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sat, 29 Oct 2016 21:22:31 +0200 Subject: [PATCH 11/24] Moved fft_averages calculation to openwebrx.py. Renamed fft_overlap to fft_voverlap_factor because it is not related to overlapped FFT. It is rather related to the vertical overlap of the amplitudes (calculated from FFT bins) on the display. --- config_webrx.py | 5 +---- openwebrx.py | 4 ++-- plugins/dsp/csdr/plugin.py | 11 +++++------ 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index f3c1d587..e3a6fdaa 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -70,11 +70,8 @@ sdrhu_public_listing = False dsp_plugin="csdr" fft_fps=9 fft_size=4096 -fft_overlap=0.3 +fft_voverlap_factor=0.3 samp_rate = 250000 - -fft_averages=int(round(1.0 * samp_rate / fft_size / fft_fps / (1.0 - fft_overlap))) - center_freq = 145525000 rf_gain = 5 #in dB. For an RTL-SDR, rf_gain=0 will set the tuner to auto gain mode, else it will be in manual gain mode. ppm = 0 diff --git a/openwebrx.py b/openwebrx.py index b770269c..5612d46b 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -287,7 +287,7 @@ def spectrum_thread_function(): dsp.set_samp_rate(cfg.samp_rate) dsp.set_fft_size(cfg.fft_size) dsp.set_fft_fps(cfg.fft_fps) - dsp.set_fft_averages(cfg.fft_averages) + dsp.set_fft_averages(int(round(1.0 * cfg.samp_rate / cfg.fft_size / cfg.fft_fps / (1.0 - cfg.fft_voverlap_factor))) if cfg.fft_voverlap_factor>0 else 0) dsp.set_fft_compression(cfg.fft_compression) dsp.set_format_conversion(cfg.format_conversion) apply_csdr_cfg_to_dsp(dsp) @@ -493,7 +493,7 @@ class WebRXHandler(BaseHTTPRequestHandler): if smeter_level == None: break except: break - if smeter_level!=None: + if smeter_level!=None: myclient.loopstat=31 rxws.send(self, "MSG s={0}".format(smeter_level)) diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index 65973307..60d6b4e5 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -59,11 +59,9 @@ class dsp_plugin: if self.csdr_through: any_chain_base+="csdr through | " any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " if which == "fft": - if self.fft_averages > 1: - fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logaveragepower_cf -70 {fft_size} {fft_averages} | csdr fft_exchange_sides_ff {fft_size}" - else: - fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | csdr logpower_cf -70 | csdr fft_exchange_sides_ff {fft_size}" - + fft_chain_base = any_chain_base+"csdr fft_cc {fft_size} {fft_block_size} | " + \ + ("csdr logpower_cf -70 | " if self.fft_averages == 0 else "csdr logaveragepower_cf -70 {fft_size} {fft_averages} | ") + \ + "csdr fft_exchange_sides_ff {fft_size}" if self.fft_compression=="adpcm": return fft_chain_base+" | csdr compress_fft_adpcm_f_u8 {fft_size}" else: @@ -127,7 +125,8 @@ class dsp_plugin: self.fft_averages=fft_averages def fft_block_size(self): - return self.samp_rate/self.fft_fps/self.fft_averages + if self.fft_averages == 0: return self.samp_rate/self.fft_fps + else: return self.samp_rate/self.fft_fps/self.fft_averages def set_format_conversion(self,format_conversion): self.format_conversion=format_conversion From 943fa47a1c73d8bf911d6d908c8665ba40a4d816 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 30 Oct 2016 10:14:27 +0100 Subject: [PATCH 12/24] Fixed auto waterfall levels for this color scheme; added waterfall_auto_level_margin option to config_webrx --- config_webrx.py | 10 ++++++++++ htdocs/index.wrx | 1 + htdocs/openwebrx.js | 4 ++-- openwebrx.py | 3 ++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index e3a6fdaa..1e3e3cf0 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -149,15 +149,25 @@ iq_server_port = 4951 #TCP port for ncat to listen on. It will send I/Q data ove # ==== Color themes ==== #A guide is available to help you set these values: https://github.com/simonyiszk/openwebrx/wiki/Calibrating-waterfall-display-levels + ### default theme by teejez: waterfall_colors = "[0x000000ff,0x0000ffff,0x00ffffff,0x00ff00ff,0xffff00ff,0xff0000ff,0xff00ffff,0xffffffff]" waterfall_min_level = -88 #in dB waterfall_max_level = -20 +waterfall_auto_level_margin = (5, 40) ### old theme by HA7ILM: #waterfall_colors = "[0x000000ff,0x2e6893ff, 0x69a5d0ff, 0x214b69ff, 0x9dc4e0ff, 0xfff775ff, 0xff8a8aff, 0xb20000ff]" #waterfall_min_level = -115 #in dB #waterfall_max_level = 0 +#waterfall_auto_level_margin = (20, 30) +#Note: When the auto waterfall level button is clicked, the following happens: +# [waterfall_min_level] = [current_min_power_level] - [waterfall_auto_level_margin[0]] +# [waterfall_max_level] = [current_max_power_level] + [waterfall_auto_level_margin[1]] +# +# ___|____________________________________|____________________________________|____________________________________|___> signal power +# \_waterfall_auto_level_margin[0]_/ |__ current_min_power_level | \_waterfall_auto_level_margin[1]_/ +# current_max_power_level __| # ==== Experimental settings === #Warning! These are very experimental. diff --git a/htdocs/index.wrx b/htdocs/index.wrx index 2debd546..06472103 100644 --- a/htdocs/index.wrx +++ b/htdocs/index.wrx @@ -33,6 +33,7 @@ var waterfall_colors=%[WATERFALL_COLORS]; var waterfall_min_level_default=%[WATERFALL_MIN_LEVEL]; var waterfall_max_level_default=%[WATERFALL_MAX_LEVEL]; + var waterfall_auto_level_margin=%[WATERFALL_AUTO_LEVEL_MARGIN]; diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index fd4833a4..9febe02f 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -183,8 +183,8 @@ function waterfallColorsDefault() function waterfallColorsAuto() { - e("openwebrx-waterfall-color-min").value=(waterfall_measure_minmax_min-20).toString(); - e("openwebrx-waterfall-color-max").value=(waterfall_measure_minmax_max+30).toString(); + e("openwebrx-waterfall-color-min").value=(waterfall_measure_minmax_min-waterfall_auto_level_margin[0]).toString(); + e("openwebrx-waterfall-color-max").value=(waterfall_measure_minmax_max+waterfall_auto_level_margin[1]).toString(); updateWaterfallColors(0); } diff --git a/openwebrx.py b/openwebrx.py index 5612d46b..5640a8a2 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -632,7 +632,8 @@ class WebRXHandler(BaseHTTPRequestHandler): ("%[START_MOD]",cfg.start_mod), ("%[WATERFALL_COLORS]",cfg.waterfall_colors), ("%[WATERFALL_MIN_LEVEL]",str(cfg.waterfall_min_level)), - ("%[WATERFALL_MAX_LEVEL]",str(cfg.waterfall_max_level)) + ("%[WATERFALL_MAX_LEVEL]",str(cfg.waterfall_max_level)), + ("%[WATERFALL_AUTO_LEVEL_MARGIN]","[%d,%d]"%cfg.waterfall_auto_level_margin) ) for rule in replace_dictionary: while data.find(rule[0])!=-1: From 1d19b07833e63761a507bcb73e9c56f081c751a4 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 30 Oct 2016 10:23:12 +0100 Subject: [PATCH 13/24] Added some comments to config_webrx --- config_webrx.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config_webrx.py b/config_webrx.py index 1e3e3cf0..e402bc1c 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -70,7 +70,7 @@ sdrhu_public_listing = False dsp_plugin="csdr" fft_fps=9 fft_size=4096 -fft_voverlap_factor=0.3 +fft_voverlap_factor=0.3 #If it is above 0, multiple FFTs will be used for creating a line on the diagram. samp_rate = 250000 center_freq = 145525000 rf_gain = 5 #in dB. For an RTL-SDR, rf_gain=0 will set the tuner to auto gain mode, else it will be in manual gain mode. @@ -160,6 +160,7 @@ waterfall_auto_level_margin = (5, 40) #waterfall_min_level = -115 #in dB #waterfall_max_level = 0 #waterfall_auto_level_margin = (20, 30) +##For the old colors, you might also want to set [fft_voverlap_factor] to 0. #Note: When the auto waterfall level button is clicked, the following happens: # [waterfall_min_level] = [current_min_power_level] - [waterfall_auto_level_margin[0]] From cabb3adb3b20190b391a2a5838815bfb375bc747 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Thu, 19 Jan 2017 17:22:07 +0100 Subject: [PATCH 14/24] Added support for nmux --- openwebrx.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openwebrx.py b/openwebrx.py index 5640a8a2..92f18762 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -144,11 +144,14 @@ def main(): pass #Start rtl thread - if os.system("ncat --version > /dev/null") == 32512: #check for ncat - print "[openwebrx-main] Error: ncat not detected, please install it! The ncat tool is a netcat alternative, used for distributing the I/Q data stream. It is usually available in the nmap package (sudo apt-get install nmap). For more explanation, look into the README.md" + if os.system("csdr 2> /dev/null") == 32512: #check for csdr + print "[openwebrx-main] You need to install \"csdr\" to run OpenWebRX!\n" + return + if os.system("nmux --help 2> /dev/null") == 32512: #check for nmux + print "[openwebrx-main] You need to install an up-to-date version of \"csdr\" that contains the \"nmux\" tool to run OpenWebRX! Please upgrade \"csdr\"!\n" return if cfg.start_rtl_thread: - cfg.start_rtl_command += "| ncat -4l %d -k --send-only --allow 127.0.0.1" % cfg.iq_server_port + cfg.start_rtl_command += "| nmux -p %d -a 127.0.0.1" % cfg.iq_server_port rtl_thread=threading.Thread(target = lambda:subprocess.Popen(cfg.start_rtl_command, shell=True), args=()) rtl_thread.start() print "[openwebrx-main] Started rtl_thread: "+cfg.start_rtl_command From 2c5089d18d633a160e77e5755ebc3fb8be3ab61e Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Thu, 19 Jan 2017 17:54:45 +0100 Subject: [PATCH 15/24] Added nmux_memory option to config_webrx and added auto calculation of nmux parameters to openwebrx.py. Also bumped version number to 0.15 --- config_webrx.py | 2 ++ openwebrx.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index e402bc1c..b6c2d219 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -176,6 +176,8 @@ csdr_dynamic_bufsize = False # This allows you to change the buffering mode of c csdr_print_bufsizes = False # This prints the buffer sizes used for csdr processes. csdr_through = False # Setting this True will print out how much data is going into the DSP chains. +nmux_memory = 70 #in megabytes. This sets the approximate size of the circular buffer used by nmux. + #Look up external IP address automatically from icanhazip.com, and use it as [server_hostname] """ print "[openwebrx-config] Detecting external IP address..." diff --git a/openwebrx.py b/openwebrx.py index 92f18762..84f4d664 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -20,7 +20,8 @@ print "" # python2.7 is required to run OpenWebRX instead of python3. Please run along with this program. If not, see . """ -sw_version="v0.14+" +sw_version="v0.15" +#0.15 (added nmux) import os import code @@ -151,7 +152,14 @@ def main(): print "[openwebrx-main] You need to install an up-to-date version of \"csdr\" that contains the \"nmux\" tool to run OpenWebRX! Please upgrade \"csdr\"!\n" return if cfg.start_rtl_thread: - cfg.start_rtl_command += "| nmux -p %d -a 127.0.0.1" % cfg.iq_server_port + nmux_bufcnt = nmux_bufsize = 0 + while nmux_bufsize < cfg.samp_rate/4: nmux_bufsize += 4096 + while nmux_bufsize * nmux_bufcnt < cfg.nmux_memory * 1e6: nmux_bufcnt += 1 + if nmux_bufcnt == 0 or nmux_bufsize == 0: + print "[openwebrx-main] Error: nmux_bufsize or nmux_bufcnt is zero. These depend on nmux_memory and samp_rate options in config_webrx.py" + return + print "[openwebrx-main] nmux_bufsize = %d, nmux_bufcnt = %d" % (nmux_bufsize, nmux_bufcnt) + cfg.start_rtl_command += "| nmux --bufsize %d --bufcnt %d --port %d --address 127.0.0.1" % (nmux_bufsize, nmux_bufcnt, cfg.iq_server_port) rtl_thread=threading.Thread(target = lambda:subprocess.Popen(cfg.start_rtl_command, shell=True), args=()) rtl_thread.start() print "[openwebrx-main] Started rtl_thread: "+cfg.start_rtl_command From c1d8fceea593d70d524b0ce3d255aa68d3bbe3ed Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Thu, 19 Jan 2017 19:49:09 +0100 Subject: [PATCH 16/24] nmux: Small fixes --- config_webrx.py | 2 +- openwebrx.py | 2 +- plugins/dsp/csdr/plugin.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index b6c2d219..d46d0022 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -176,7 +176,7 @@ csdr_dynamic_bufsize = False # This allows you to change the buffering mode of c csdr_print_bufsizes = False # This prints the buffer sizes used for csdr processes. csdr_through = False # Setting this True will print out how much data is going into the DSP chains. -nmux_memory = 70 #in megabytes. This sets the approximate size of the circular buffer used by nmux. +nmux_memory = 50 #in megabytes. This sets the approximate size of the circular buffer used by nmux. #Look up external IP address automatically from icanhazip.com, and use it as [server_hostname] """ diff --git a/openwebrx.py b/openwebrx.py index 84f4d664..0e22076d 100755 --- a/openwebrx.py +++ b/openwebrx.py @@ -132,7 +132,7 @@ def main(): import_all_plugins("plugins/dsp/") #Pypy - if pypy: print "pypy detected (and now something completely different: a c code is expected to run at a speed of 3*10^8 m/s?)" + if pypy: print "pypy detected (and now something completely different: c code is expected to run at a speed of 3*10^8 m/s?)" #Change process name to "openwebrx" (to be seen in ps) try: diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index 60d6b4e5..2498e994 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -54,7 +54,7 @@ class dsp_plugin: self.fft_averages = 50 def chain(self,which): - any_chain_base="ncat -v 127.0.0.1 {nc_port} | " + any_chain_base="nc -v 127.0.0.1 {nc_port} | " if self.csdr_dynamic_bufsize: any_chain_base+="csdr setbuf {start_bufsize} | " if self.csdr_through: any_chain_base+="csdr through | " any_chain_base+=self.format_conversion+(" | " if self.format_conversion!="" else "") ##"csdr flowcontrol {flowcontrol} auto 1.5 10 | " From 6afdbe812e7cba4b6a4b2e6862276da73c2b86a2 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sat, 28 Jan 2017 15:19:16 +0100 Subject: [PATCH 17/24] Added notes about CPU usage --- config_webrx.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index d46d0022..780b6e2f 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -69,8 +69,9 @@ sdrhu_public_listing = False # ==== DSP/RX settings ==== dsp_plugin="csdr" fft_fps=9 -fft_size=4096 -fft_voverlap_factor=0.3 #If it is above 0, multiple FFTs will be used for creating a line on the diagram. +fft_size=4096 #Should be power of 2 +fft_voverlap_factor=0.3 #If fft_voverlap_factor is above 0, multiple FFTs will be used for creating a line on the diagram. + samp_rate = 250000 center_freq = 145525000 rf_gain = 5 #in dB. For an RTL-SDR, rf_gain=0 will set the tuner to auto gain mode, else it will be in manual gain mode. @@ -81,6 +82,14 @@ fft_compression="adpcm" #valid values: "adpcm", "none" start_rtl_thread=True +""" +Note: if you experience audio underruns while CPU usage is 100%, you can: +- decrease `samp_rate`, +- set `fft_voverlap_factor` to 0, +- decrease `fft_fps` and `fft_size`, +- limit the number of users by decreasing `max_clients`. +""" + # ==== I/Q sources ==== # (Uncomment the appropriate by removing # characters at the beginning of the corresponding lines.) From bc4e0f7ad8834c06095cdaf18834552edc1a6257 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Mon, 6 Mar 2017 00:03:13 +0100 Subject: [PATCH 18/24] rx_tools support added --- config_webrx.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config_webrx.py b/config_webrx.py index 780b6e2f..68a1a457 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -135,6 +135,15 @@ To use a HackRF, compile the HackRF host tools from its "stdout" branch: #start_rtl_command="(while true; do cat my_iq_file.raw; done) | csdr flowcontrol {sr} 20 ".format(sr=samp_rate*2*1.05) #format_conversion="csdr convert_u8_f" +#>> The rx_sdr command works with a variety of SDR harware: RTL-SDR, HackRF, SDRplay, UHD, Airspy, Red Pitaya, audio devices, etc. +# It will auto-detect your SDR hardware if the following tools are installed: +# * the vendor provided driver and library, +# * the vendor-specific SoapySDR wrapper library, +# * and SoapySDR itself. +# Check out this article on the OpenWebRX Wiki: https://github.com/simonyiszk/openwebrx/wiki/Using-rx_tools-with-OpenWebRX/ +#start_rtl_command="rx_sdr -F CF32 -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -".format(rf_gain=rf_gain, center_freq=center_freq, samp_rate=samp_rate, ppm=ppm) +#format_conversion="" + # >> gr-osmosdr signal source using GNU Radio (follow this guide: https://github.com/simonyiszk/openwebrx/wiki/Using-GrOsmoSDR-as-signal-source) #start_rtl_command="cat /tmp/osmocom_fifo" #format_conversion="" From 28d6772b62b5efddd53bb4f81624dc552e450ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Sat, 18 Mar 2017 13:12:45 +0100 Subject: [PATCH 19/24] Editing the master branch from GitHub text editor might be considered too brave --- plugins/dsp/csdr/plugin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/dsp/csdr/plugin.py b/plugins/dsp/csdr/plugin.py index 2498e994..b3214718 100644 --- a/plugins/dsp/csdr/plugin.py +++ b/plugins/dsp/csdr/plugin.py @@ -70,9 +70,9 @@ class dsp_plugin: chain_end = "" if self.audio_compression=="adpcm": chain_end = " | csdr encode_ima_adpcm_i16_u8" - if which == "nfm": return chain_begin + "csdr fmdemod_quadri_cf | csdr limit_ff | csdr fractional_decimator_ff {last_decimation} | csdr deemphasis_nfm_ff 11025 | csdr fastagc_ff 1024 | csdr convert_f_s16"+chain_end - elif which == "am": return chain_begin + "csdr amdemod_cf | csdr fastdcblock_ff | csdr fractional_decimator_ff {last_decimation} | csdr agc_ff | csdr limit_ff | csdr convert_f_s16"+chain_end - elif which == "ssb": return chain_begin + "csdr realpart_cf | csdr fractional_decimator_ff {last_decimation} | csdr agc_ff | csdr limit_ff | csdr convert_f_s16"+chain_end + if which == "nfm": return chain_begin + "csdr fmdemod_quadri_cf | csdr limit_ff | csdr old_fractional_decimator_ff {last_decimation} | csdr deemphasis_nfm_ff 11025 | csdr fastagc_ff 1024 | csdr convert_f_s16"+chain_end + elif which == "am": return chain_begin + "csdr amdemod_cf | csdr fastdcblock_ff | csdr old_fractional_decimator_ff {last_decimation} | csdr agc_ff | csdr limit_ff | csdr convert_f_s16"+chain_end + elif which == "ssb": return chain_begin + "csdr realpart_cf | csdr old_fractional_decimator_ff {last_decimation} | csdr agc_ff | csdr limit_ff | csdr convert_f_s16"+chain_end def set_audio_compression(self,what): self.audio_compression = what From 6f0bb5bc00e3a6618124ba572d921eb1608d2353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Tue, 4 Apr 2017 18:15:08 +0200 Subject: [PATCH 20/24] Update README.md --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9717f9db..15206cd6 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ It has the following features: - OpenWebRX now supports URLs like: `http://localhost:8073/#freq=145555000,mod=usb` - UI improvements were made, thanks to John Seamons and Gnoxter. +**News (2017-04-04)** +- *ncat* has been replaced with a custom implementation called *nmux* due to a bug that caused regular crashes on some machines. The *nmux* tool is distributed with *csdr*. +- Most consumer SDR devices are supported via rx_tools, see the OpenWebRX Wiki on that. + > When upgrading OpenWebRX, please make sure that you also upgrade *csdr*, and install the new dependency, *ncat*! ## OpenWebRX servers on SDR.hu @@ -44,11 +48,6 @@ First you will need to install the dependencies: - libcsdr - rtl-sdr -- ncat (On Debian/Ubuntu, it is in the *nmap* package). - -> By the way, *nmap* is a tool commonly used for auditing network security, and it is not used by OpenWebRX in any way. We need to install it, because the *ncat* command is packaged with it. -> -> *ncat* is a better *netcat* alternative, which is used by OpenWebRX for internally distributing the I/Q data stream. It also solves the problem of having different versions of *netcat* on different Linux distributions, which are not compatible by their command-line arguments. After cloning this repository and connecting an RTL-SDR dongle to your computer, you can run the server: @@ -62,7 +61,7 @@ Please note that the server is also listening on the following ports (on localho Now the next step is to customize the parameters of your server in `config_webrx.py`. -Actually, if you do something cool with OpenWebRX (or just have a problem), please drop me a mail: +Actually, if you do something cool with OpenWebRX, please drop me a mail: *Andras Retzler, HA7ILM <randras@sdr.hu>* ## Usage tips @@ -85,4 +84,4 @@ If you want to run OpenWebRX on a remote server instead of *localhost*, do not f OpenWebRX is available under Affero GPL v3 license (summary). -OpenWebRX is also available under a commercial license on request. Please contact me at the address *<randras@sdr.hu>* for other licensing options. +OpenWebRX is also available under a commercial license on request. Please contact me at the address *<randras@sdr.hu>* for licensing options. From a196072462b489c39964e267db5dcb9fd82702a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Tue, 4 Apr 2017 18:16:20 +0200 Subject: [PATCH 21/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15206cd6..942e0bf4 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ It has the following features: - UI improvements were made, thanks to John Seamons and Gnoxter. **News (2017-04-04)** -- *ncat* has been replaced with a custom implementation called *nmux* due to a bug that caused regular crashes on some machines. The *nmux* tool is distributed with *csdr*. +- *ncat* has been replaced with a custom implementation called *nmux* due to a bug that caused regular crashes on some machines. The *nmux* tool is part of the *csdr* package. - Most consumer SDR devices are supported via rx_tools, see the OpenWebRX Wiki on that. > When upgrading OpenWebRX, please make sure that you also upgrade *csdr*, and install the new dependency, *ncat*! From dd42f573d2cef849619040e3f26d1a1a8967bf5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Tue, 4 Apr 2017 18:17:24 +0200 Subject: [PATCH 22/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 942e0bf4..9ed9cfee 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It has the following features: - waterfall display can be shifted back in time, - it extensively uses HTML5 features like WebSocket, Web Audio API, and <canvas>. - it works in Google Chrome, Chromium (above version 37) and Mozilla Firefox (above version 28), -- currently supports RTL-SDR and HackRF; other SDR hardware may be easily added. +- currently supports RTL-SDR, HackRF and many other devices, see the OpenWebRX Wiki. **News (2015-08-18)** - My BSc. thesis written on OpenWebRX is available here. From a09d83e7b104356bafea0cf8a99680e6ab1d3beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Tue, 4 Apr 2017 18:18:28 +0200 Subject: [PATCH 23/24] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ed9cfee..12d0ab8a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It has the following features: - waterfall display can be shifted back in time, - it extensively uses HTML5 features like WebSocket, Web Audio API, and <canvas>. - it works in Google Chrome, Chromium (above version 37) and Mozilla Firefox (above version 28), -- currently supports RTL-SDR, HackRF and many other devices, see the OpenWebRX Wiki. +- currently supports RTL-SDR, HackRF, SDRplay, AirSpy and many other devices, see the OpenWebRX Wiki. **News (2015-08-18)** - My BSc. thesis written on OpenWebRX is available here. From 2fcfa15f2a96ff17ded9bf615472066f00a6fa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Retzler?= Date: Wed, 5 Apr 2017 08:34:00 +0200 Subject: [PATCH 24/24] Update config_webrx.py --- config_webrx.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index 68a1a457..9649f7da 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -93,13 +93,14 @@ Note: if you experience audio underruns while CPU usage is 100%, you can: # ==== I/Q sources ==== # (Uncomment the appropriate by removing # characters at the beginning of the corresponding lines.) -# There are guides for setting may different SDR hardware including AirSpy, AFEDRI-SDR, RTL-SDR in direct sampling mode, etc. in the Wiki: -# https://github.com/simonyiszk/openwebrx/wiki +################################################################################################# +# Is my SDR hardware supported? # +# Check here: https://github.com/simonyiszk/openwebrx/wiki#guides-for-receiver-hardware-support # +################################################################################################# # You can use other SDR hardware as well, by giving your own command that outputs the I/Q samples... Some examples of configuration are available here (default is RTL-SDR): # >> RTL-SDR via rtl_sdr - start_rtl_command="rtl_sdr -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -".format(rf_gain=rf_gain, center_freq=center_freq, samp_rate=samp_rate, ppm=ppm) format_conversion="csdr convert_u8_f"