Added dynamic/static spur table

SI443_RBW_update
erikkaashoek 4 years ago
parent 565646711c
commit 4209a82525

2
.gitignore vendored

@ -16,5 +16,5 @@ dorelease.bat
ChibiOS
.settings/language.settings.xml
.cproject
Rubbish*
desktop.ini

@ -470,7 +470,7 @@ VNA_SHELL_FUNCTION(cmd_if1)
usage_printf("if1 {975M..979M}\r\n%QHz\r\n", config.frequency_IF1);
return;
} else {
freq_t a = (freq_t)my_atoi(argv[0]);
freq_t a = (freq_t)my_atoui(argv[0]);
if (a!= 0 &&( a < (DEFAULT_IF - (freq_t)80000000) || a>(DEFAULT_IF + (freq_t)80000000)))
goto usage;
config.frequency_IF1 = a;

@ -2533,36 +2533,74 @@ static const freq_t spur_table[] = // Frequenci
const int spur_table_size = (sizeof spur_table)/sizeof(freq_t);
#endif
#ifdef TINYSA4
#define MAX_SPUR_TABLE_SIZE 100
static freq_t spur_table[MAX_SPUR_TABLE_SIZE] = // Frequencies to avoid
{
#if 1
6363000,
21363000,
60000000,
120000000,
180000000,
300000000,
480000000,
487700000,
540000000,
650892000,
704886000,
720000000,
#else
243775000, // OK
325000000, // !!! This is a double spur
325190000, // !!! This is a double spur
390123000,
487541650, // OK This is linked to the MODULO of the ADF4350
650687000, // OK
731780000, // OK
977400000,
977400000*2,
#endif
#define STATIC_SPUR_TABLE_SIZE 55
static const freq_t static_spur_table[STATIC_SPUR_TABLE_SIZE] = // Valid for IF=977.4MHz
{
5233000,
6300000,
16483000,
16783000,
21300000,
26134000,
36300000,
41134000,
51300000,
66000000,
66300000,
70800000,
72000000,
78000000,
85200000,
101134000,
113134000,
114000000,
115200000,
243881127,
471300000,
487762254,
501300000,
508800000,
650974672,
688800000,
699667000,
702865000,
703094000,
703465000,
706616000,
707216000,
708667000,
710366000,
710966000,
711667000,
711667000,
714115000,
714668000,
718465000,
718800000,
721616000,
722216000,
726300000,
729715000,
732865000,
738667000,
740366000,
740966000,
741667000,
747865000,
756667000,
759116000,
793465000,
797216000,
};
int spur_table_size = 12;
#define MAX_DYNAMIC_SPUR_TABLE_SIZE 100
static freq_t dynamic_spur_table[MAX_DYNAMIC_SPUR_TABLE_SIZE]; // Frequencies to be calculated
static int dynamic_spur_table_size = 0;
static int always_use_dynamic_table = false;
static freq_t *spur_table = (freq_t *)static_spur_table;
int spur_table_size = STATIC_SPUR_TABLE_SIZE;
#endif
int binary_search(freq_t f)
@ -2585,28 +2623,51 @@ int binary_search(freq_t f)
return true; // index is m
}
#ifdef TINYSA4
#if 1
#if 0
if (!setting.auto_IF && setting.frequency_IF-2000000 < f && f < setting.frequency_IF -200000)
return true;
if(config.frequency_IF1+200000 > f && config.frequency_IF1 < f+200000)
return true;
#endif
if(4*config.frequency_IF1 > fmin && 4*config.frequency_IF1 < fplus)
return true;
#endif
#endif
return false;
}
#ifdef TINYSA4
static const uint8_t spur_div[] = {3, 3, 5, 2, 3, 4}; // 4/1 removed
static const uint8_t spur_mul[] = {1, 1, 2, 1, 2, 3};
#define IF_OFFSET 468750*4 //
//static const uint8_t spur_div[] = {3, 3, 5, 2, 3, 4}; // 4/1 removed
//static const uint8_t spur_mul[] = {1, 1, 2, 1, 2, 3};
//#define IF_OFFSET 468750*4 //
#define SPUR_FACTOR 937746
void fill_spur_table(void)
{
return; // TODO remove spur table updating.
uint8_t i;
freq_t corr_IF;
if (always_use_dynamic_table) {
spur_table = dynamic_spur_table;
spur_table_size = dynamic_spur_table_size;
return;
}
if (actual_rbw_x10 < 200) { // if less then 20kHz use static table
spur_table = (freq_t *)static_spur_table;
spur_table_size = STATIC_SPUR_TABLE_SIZE;
return;
}
if (!setting.auto_IF)
corr_IF = setting.frequency_IF;
else {
corr_IF = config.frequency_IF1;
}
dynamic_spur_table_size = 0;
dynamic_spur_table[dynamic_spur_table_size++] = corr_IF/4 -SPUR_FACTOR/2;
dynamic_spur_table[dynamic_spur_table_size++] = corr_IF/2 -SPUR_FACTOR;
dynamic_spur_table[dynamic_spur_table_size++] = corr_IF*2/3 -SPUR_FACTOR*2/3;
spur_table = dynamic_spur_table;
spur_table_size = dynamic_spur_table_size;
#if 0
return; // TODO remove spur table updating.
for (i=0; i < sizeof(spur_div)/sizeof(uint8_t); i++)
{
@ -2641,6 +2702,7 @@ void fill_spur_table(void)
spur_table[i++] = corr_IF - IF_OFFSET*3/2;
spur_table[i++] = corr_IF*2 - IF_OFFSET;
spur_table_size = i;
#endif
}
#endif
@ -2681,6 +2743,7 @@ int avoid_spur(freq_t f) // find if this frequency should be a
R = m - 1;
else
{
#if 0
#ifdef TINYSA4
int w = ((unsigned int)m >= sizeof(spur_div)/sizeof(uint8_t) ? 3 : 1);
fmin = f - spur_gate*w;
@ -2688,6 +2751,7 @@ int avoid_spur(freq_t f) // find if this frequency should be a
if (spur_table[m] < fmin || spur_table[m] > fplus)
return F_NEAR_SPUR; // index is m
else
#endif
#endif
return F_AT_SPUR;
}
@ -3342,6 +3406,9 @@ again: // Spur redu
else
{
#ifdef TINYSA4
if (actual_rbw_x10 < 200 )
local_IF = 977400000; // static spur table IF
else
local_IF = config.frequency_IF1;
#if 0
if ( S_IS_AUTO(setting.below_IF)) {
@ -5786,6 +5853,19 @@ int add_spur(int f, float p)
return 1;
}
void sort_dynamic_spur_table(void) {
for (int counter = 0 ; counter < dynamic_spur_table_size - 1; counter++)
{
for (int counter1 = 0 ; counter1 < dynamic_spur_table_size - counter - 1; counter1++)
{
if (dynamic_spur_table[counter1] > dynamic_spur_table[counter1+1]) //increasing frequency
{
float swap_var = dynamic_spur_table[counter1]; dynamic_spur_table[counter1] = dynamic_spur_table[counter1+1]; dynamic_spur_table[counter1+1] = swap_var;
}
}
}
}
void sort_spur_freq(void) {
for (int counter = 0 ; counter < last_spur - 1; counter++)
{
@ -5923,7 +6003,7 @@ quit:
set_refer_output(-1);
#ifdef TINYSA4
} else if (test == 1) {
float average, p, p_min = -115.0;
float average, p;
freq_t start = get_sweep_frequency(ST_START);
freq_t stop = get_sweep_frequency(ST_STOP);
debug_avoid = false;
@ -5942,10 +6022,14 @@ quit:
setting.frequency_IF=DEFAULT_IF;
setting.frequency_step = 30000;
#endif
if (setting.test_argument > 0)
if (setting.test_argument > 0) {
setting.frequency_step = setting.test_argument;
shell_printf("\n\rResetting spur table\n\r");
// int i = 0; // Index in spur table (temp_t)
spur_table_size = 0; // Reset table before scanning
dynamic_spur_table_size = 0; // Reset table before scanning
} else
shell_printf("\n\rAdding to current dynamic spur table\n\r");
set_RBW(setting.frequency_step/100);
last_spur = 0;
for (int j = 0; j < 4; j++) {
@ -5964,7 +6048,7 @@ quit:
shell_printf("Pass %d, freq %D\r", j+1, f);
int cnt = 0;
p = 0;
#define SPUR_CHECK_COUNT 4 // 4
#define SPUR_CHECK_COUNT 2 // 4
do {
cnt++;
p = PURE_TO_float(perform(false, 1, f, false));
@ -5974,7 +6058,7 @@ quit:
#define SPUR_DELTA 15
#endif
} while ( average + SPUR_DELTA < p && cnt < SPUR_CHECK_COUNT);
if (cnt == SPUR_CHECK_COUNT /* && p > p_min */ && average + SPUR_DELTA < p) {
if (cnt == SPUR_CHECK_COUNT && average + SPUR_DELTA < p) {
shell_printf("Pass %d, %4.2fdBm spur at %DkHz with count %d\n\r", j+1, p,f/1000, add_spur(f, p));
}
average = (average*19+p)/20;
@ -5986,20 +6070,21 @@ quit:
in_selftest = false;
setting.spur_removal = S_ON;
sort_spur_count(); // Reduce table to most certain spurs
if (last_spur > MAX_SPUR_TABLE_SIZE)
last_spur = MAX_SPUR_TABLE_SIZE;
if (last_spur > MAX_DYNAMIC_SPUR_TABLE_SIZE)
last_spur = MAX_DYNAMIC_SPUR_TABLE_SIZE;
sort_spur_level(); // Reduce table to only strongest spurs
if (last_spur > MAX_SPUR_TABLE_SIZE)
last_spur = MAX_SPUR_TABLE_SIZE;
if (last_spur > MAX_DYNAMIC_SPUR_TABLE_SIZE)
last_spur = MAX_DYNAMIC_SPUR_TABLE_SIZE;
sort_spur_freq();
spur_table_size = 0;
// dynamic_spur_table_size = 0;
for (int j = 0; j < last_spur; j++) {
if ((int)stored_t[j] >= 1) {
if ((int)stored_t[j] >= 1 && j < MAX_DYNAMIC_SPUR_TABLE_SIZE && (int)stored_t[j] > SPUR_CHECK_COUNT-2 && stored_t[j] - stored2_t[j] > 2) {
shell_printf("%d, %d, %4.2f, %4.2f\n\r", ((int)temp_t[j])/1000, (int)stored_t[j], stored2_t[j], PURE_TO_float(perform(false, 1, (freq_t)temp_t[j], false)));
if (j < MAX_SPUR_TABLE_SIZE && (int)stored_t[j] >= 3)
spur_table[spur_table_size++] = temp_t[j];
dynamic_spur_table[dynamic_spur_table_size++] = temp_t[j];
}
}
sort_dynamic_spur_table();
always_use_dynamic_table = true;
reset_settings(M_LOW);
set_sweep_frequency(ST_START, start);
set_sweep_frequency(ST_STOP, stop);

Loading…
Cancel
Save

Powered by TurnKey Linux.