diff --git a/main.c b/main.c index e87a3ac..eb64a6d 100644 --- a/main.c +++ b/main.c @@ -953,13 +953,16 @@ config_t config = { .low_level_output_offset = 0.0, // Uncalibrated .high_level_output_offset = 0.0, // Uncalibrated #ifdef TINYSA3 - .correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, - .correction_value = { +6.0, +2.8, +1.6, -0.4, 0.0, -0.4, +0.4, +3.0, +4.0, +8.1 }, + .low_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, + .low_correction_value = { +6.0, +2.8, +1.6, -0.4, 0.0, -0.4, +0.4, +3.0, +4.0, +8.1 }, + .high_correction_frequency = { 240000000, 280000000, 300000000, 400000000, 500000000, 600000000, 700000000, 800000000, 900000000, 960000000 }, + .high_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 }, #endif #ifdef TINYSA4 - .correction_frequency = { 10000, 100000, 200000, 500000, 1000000000U, 1500000000U, 2500000000U, 2800000000U, 3000000000U, 3300000000U }, - .correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 }, - // .correction_value = { 0, 0, 0, 0, 0.0, 1.5, 3, 6, 10, 10 }, + .low_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, + .low_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 }, + .high_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, + .high_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 }, #endif .setting_frequency_30mhz = 30000000, .cor_am = -5, diff --git a/nanovna.h b/nanovna.h index 79e7b65..a8dc15a 100644 --- a/nanovna.h +++ b/nanovna.h @@ -573,6 +573,8 @@ typedef struct config { float high_level_output_offset; freq_t low_correction_frequency[CORRECTION_POINTS]; float low_correction_value[CORRECTION_POINTS]; + freq_t high_correction_frequency[CORRECTION_POINTS]; + float high_correction_value[CORRECTION_POINTS]; uint32_t deviceid; freq_t setting_frequency_30mhz; @@ -880,6 +882,8 @@ typedef struct setting int extra_lna; int ultra; int R; + freq_t *correction_frequency; + float *correction_value; uint32_t dummy; uint32_t checksum; // must be last }setting_t; diff --git a/sa_cmd.c b/sa_cmd.c index fcce4ce..aa764d1 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -730,13 +730,13 @@ VNA_SHELL_FUNCTION(cmd_correction) if (argc == 0) { shell_printf("index frequency value\r\n"); for (int i=0; i> SCALE_FACTOR; + int32_t d = (setting.correction_frequency[i] - setting.correction_frequency[i-1]) >> SCALE_FACTOR; scaled_correction_multi[i] = (int32_t) ( m / d ); } } @@ -1183,7 +1191,7 @@ void calculate_correction(void) pureRSSI_t get_frequency_correction(freq_t f) // Frequency dependent RSSI correction to compensate for imperfect LPF { pureRSSI_t cv = 0; - if (!(setting.mode == M_LOW || setting.mode == M_GENLOW)) + if (setting.mode == M_GENHIGH) return(0.0); if (setting.extra_lna) { @@ -1199,7 +1207,7 @@ pureRSSI_t get_frequency_correction(freq_t f) // Frequency dependent RSSI c } int i = 0; - while (f > config.correction_frequency[i] && i < CORRECTION_POINTS) + while (f > setting.correction_frequency[i] && i < CORRECTION_POINTS) i++; if (i >= CORRECTION_POINTS) { cv += scaled_correction_value[CORRECTION_POINTS-1] >> (SCALE_FACTOR - 5); @@ -1209,11 +1217,11 @@ pureRSSI_t get_frequency_correction(freq_t f) // Frequency dependent RSSI c cv += scaled_correction_value[0] >> (SCALE_FACTOR - 5); goto done; } - f = f - config.correction_frequency[i-1]; + f = f - setting.correction_frequency[i-1]; #if 0 - freq_t m = (config.correction_frequency[i] - config.correction_frequency[i-1]) >> SCALE_FACTOR ; - float multi = (config.correction_value[i] - config.correction_value[i-1]) * (1 << (SCALE_FACTOR -1)) / (float)m; - float cv = config.correction_value[i-1] + ((f >> SCALE_FACTOR) * multi) / (float)(1 << (SCALE_FACTOR -1)) ; + freq_t m = (setting.correction_frequency[i] - setting.correction_frequency[i-1]) >> SCALE_FACTOR ; + float multi = (setting.correction_value[i] - setting.correction_value[i-1]) * (1 << (SCALE_FACTOR -1)) / (float)m; + float cv = setting.correction_value[i-1] + ((f >> SCALE_FACTOR) * multi) / (float)(1 << (SCALE_FACTOR -1)) ; #else int32_t scaled_f = f >> SCALE_FACTOR; cv += (scaled_correction_value[i-1] + (scaled_f * scaled_correction_multi[i])) >> (SCALE_FACTOR - 5) ;