Fractional modulation freq

pull/94/head
erikkaashoek 2 years ago
parent e95e79c8e5
commit 95d48eb744

@ -474,7 +474,7 @@ void set_noise(int);
void toggle_tracking_output(void); void toggle_tracking_output(void);
extern int32_t frequencyExtra; extern int32_t frequencyExtra;
void set_modulation(int); void set_modulation(int);
void set_modulation_frequency(int); void set_modulation_frequency(float);
int search_maximum(int m, freq_t center, int span); int search_maximum(int m, freq_t center, int span);
//extern int setting.modulation; //extern int setting.modulation;
void set_measurement(int); void set_measurement(int);
@ -1270,7 +1270,6 @@ typedef struct setting
uint16_t freq_mode; // 0...1!!! need convert to bool or bit field uint16_t freq_mode; // 0...1!!! need convert to bool or bit field
int16_t refer; // -1 disabled int16_t refer; // -1 disabled
uint16_t modulation_frequency; // 50...6000
#ifdef TINYSA4 #ifdef TINYSA4
uint16_t modulation_depth_x100; // AM (30% - 100%) multiplied by 100 uint16_t modulation_depth_x100; // AM (30% - 100%) multiplied by 100
uint16_t modulation_deviation_div100; // FM (2.5kHz to 100kHz) divided by 100 uint16_t modulation_deviation_div100; // FM (2.5kHz to 100kHz) divided by 100
@ -1285,6 +1284,7 @@ typedef struct setting
uint32_t vbw_x100; uint32_t vbw_x100;
uint32_t scan_after_dirty[TRACES_MAX]; uint32_t scan_after_dirty[TRACES_MAX];
float modulation_frequency; // 50...6000
float reflevel; float reflevel;
float scale; float scale;
float external_gain; float external_gain;
@ -1465,7 +1465,7 @@ typedef struct properties {
//sizeof(properties_t) == 0x1200 //sizeof(properties_t) == 0x1200
#define CONFIG_MAGIC 0x434f4e65 /* 'CONF' */ #define CONFIG_MAGIC 0x434f4e65 /* 'CONF' */
#define SETTING_MAGIC 0x434f4e64 #define SETTING_MAGIC 0x434f4e65
extern int16_t lastsaveid; extern int16_t lastsaveid;
//extern properties_t *active_props; //extern properties_t *active_props;

@ -1136,7 +1136,7 @@ void set_depth(int d)
} }
#endif #endif
void set_modulation_frequency(int f) void set_modulation_frequency(float f)
{ {
if (f < 1) if (f < 1)
f = 1; f = 1;
@ -3637,7 +3637,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
int sine_wave_index = 1; int sine_wave_index = 1;
config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
while ( (modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) { while ( (modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
sine_wave_index <<= 1; sine_wave_index <<= 1;
modulation_steps >>= 1; modulation_steps >>= 1;
} }
@ -3661,7 +3661,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
//modulation_steps = 8; // <-----------------TEMP!!!!! //modulation_steps = 8; // <-----------------TEMP!!!!!
while ( ((modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am)) < 900 && modulation_steps >= 4) { while ( ((modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am)) < 900 && modulation_steps >= 4) {
sine_wave_index <<= 1; sine_wave_index <<= 1;
modulation_steps >>= 1; modulation_steps >>= 1;
} }
@ -3897,7 +3897,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
if (setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL && setting.modulation_frequency != 0) { if (setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL && setting.modulation_frequency != 0) {
modulation_counter = 0; modulation_counter = 0;
cycle_counter = 0; cycle_counter = 0;
modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8 modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8
modulation_delay += config.cor_am; modulation_delay += config.cor_am;
#ifdef TINYSA3 #ifdef TINYSA3
if (setting.modulation == MO_WFM) if (setting.modulation == MO_WFM)
@ -3952,10 +3952,11 @@ modulation_again:
modulation_counter = 0; modulation_counter = 0;
cycle_counter++; cycle_counter++;
if (config.cor_am == INITIAL_MODULATION_CORRECTION) { if (config.cor_am == INITIAL_MODULATION_CORRECTION) {
if (chVTGetSystemTimeX() - start_of_sweep_timestamp > 1000) { // 100 ms, System tick 10000 per second int cycle_time = chVTGetSystemTimeX() - start_of_sweep_timestamp;
if (cycle_time > 1000) { // 100 ms, System tick 10000 per second
start_of_sweep_timestamp = chVTGetSystemTimeX(); start_of_sweep_timestamp = chVTGetSystemTimeX();
modulation_delay -= config.cor_am; modulation_delay -= config.cor_am;
int actual_delay = 800000 / cycle_counter / modulation_steps; // In units of 1/8 microsecond int actual_delay = 800 * cycle_time / cycle_counter / modulation_steps; // In units of 1/8 microsecond
config.cor_am += modulation_delay - actual_delay; config.cor_am += modulation_delay - actual_delay;
if (config.cor_am >0) if (config.cor_am >0)
config.cor_am = 0; config.cor_am = 0;

10
ui.c

@ -1433,7 +1433,7 @@ static const struct {
[KM_FASTER_SPEEDUP] = {keypads_positive , "WIDE\nSPEEDUP"}, // KM_FAST_SPEEDUP [KM_FASTER_SPEEDUP] = {keypads_positive , "WIDE\nSPEEDUP"}, // KM_FAST_SPEEDUP
[KM_GRIDLINES] = {keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES [KM_GRIDLINES] = {keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES
[KM_MARKER] = {keypads_freq , "MARKER\nFREQ"}, // KM_MARKER [KM_MARKER] = {keypads_freq , "MARKER\nFREQ"}, // KM_MARKER
[KM_MODULATION] = {keypads_freq , "MODULATION\nFREQ"}, // KM_MODULATION [KM_MODULATION] = {keypads_positive , "MODULATION\nFREQ"}, // KM_MODULATION
[KM_HIGHOUTLEVEL] = {keypads_plusmin , "OUTPUT\nLEVEL"}, // KM_HIGHOUTLEVEL #25 [KM_HIGHOUTLEVEL] = {keypads_plusmin , "OUTPUT\nLEVEL"}, // KM_HIGHOUTLEVEL #25
#ifdef TINYSA4 #ifdef TINYSA4
[KM_COR_AM] = {keypads_plusmin , "COR\nAM"}, // KM_COR_AM [KM_COR_AM] = {keypads_plusmin , "COR\nAM"}, // KM_COR_AM
@ -2412,9 +2412,9 @@ static UI_FUNCTION_ADV_CALLBACK(menu_smodulation_acb){
else { else {
#ifdef TINYSA4 #ifdef TINYSA4
if (setting.modulation == MO_AM) if (setting.modulation == MO_AM)
plot_printf(b->text, sizeof b->text, "MOD: %4dHz AM %d%%", (int)(setting.modulation_frequency), setting.modulation_depth_x100); plot_printf(b->text, sizeof b->text, "MOD: %8.4FHz AM %d%%", setting.modulation_frequency, setting.modulation_depth_x100);
else else
plot_printf(b->text, sizeof b->text, "MOD: %4dHz FM %4QHz", (int)(setting.modulation_frequency), (freq_t)(setting.modulation_deviation_div100*100)); plot_printf(b->text, sizeof b->text, "MOD: %8.4FHz FM %4QHz", setting.modulation_frequency, (freq_t)(setting.modulation_deviation_div100*100));
#else #else
plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]); plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]);
#endif #endif
@ -5497,7 +5497,7 @@ static void fetch_numeric_target(uint8_t mode)
case KM_MODULATION: case KM_MODULATION:
if (active_marker >=0) { if (active_marker >=0) {
uistat.value = setting.modulation_frequency; uistat.value = setting.modulation_frequency;
plot_printf(uistat.text, sizeof uistat.text, "%7.0fHz", uistat.value); plot_printf(uistat.text, sizeof uistat.text, "%8.4FHz", uistat.value);
} }
break; break;
#ifdef TINYSA4 #ifdef TINYSA4
@ -5766,7 +5766,7 @@ set_numeric_value(void)
set_marker_time(active_marker, uistat.value); set_marker_time(active_marker, uistat.value);
break; break;
case KM_MODULATION: case KM_MODULATION:
set_modulation_frequency((int)uistat.value); set_modulation_frequency(uistat.value);
break; break;
#ifdef TINYSA4 #ifdef TINYSA4
case KM_COR_AM: case KM_COR_AM:

Loading…
Cancel
Save

Powered by TurnKey Linux.