본문 바로가기
프로그램...

[RSSI] 기준 위치 측정 후 Table화하기

by 크크다스 2019. 11. 5.
반응형

[RSSI] 기준 위치 측정 후 Table화 하기


기준 위치 측정>


실제 측정을 통해서 2.4G / 5G의 거리별/RSSI별 위치를 측정한다.
예>
2.4G 미터 5G   2.4G 미터 5G   2.4G 미터 5G   2.4G 미터 5G
-24.2 1 -16.2 -78.2 500 -70.2 -84.7 1050 -76.7 -88.3 1600 -80.3
-44.2 10 -36.2 -79.1 550 -71.1 -85.1 1100 -77.1 -88.6 1650 -80.6
-58.2 50 -50.2 -79.8 600 -71.8 -85.5 1150 -77.5 -88.9 1700 -80.9
-64.2 100 -56.2 -80.5 650 -72.5 -85.8 1200 -77.8 -89.1 1750 -81.1
-67.8 150 -59.8 -81.1 700 -73.1 -86.2 1250 -78.2 -89.4 1800 -81.4
-70.3 200 -62.3 -81.7 750 -73.7 -86.5 1300 -78.5 -89.6 1850 -81.6
-72.2 250 -64.2 -82.3 800 -74.3 -86.9 1350 -78.9 -89.8 1900 -81.8
-73.8 300 -65.8 -82.8 850 -74.8 -87.2 1400 -79.2 -90 1950 -82
-75.1 350 -67.1 -83.3 900 -75.3 -87.5 1450 -79.5 -90.3 2000 -82.3
-76.3 400 -68.3 -83.8 950 -75.8 -87.8 1500 -79.8    
-77.3 450 -69.3   -84.2 1000 -76.2   -88.1 1550 -80.1        



적용 범위 정의>


실제 측정 데이타중 최소 / 최대 값을 설정하여  
그 이외값은 정의된 방식에 따라서 일률 적용한다.
예> (-) 임을 감안하여 MAX/MIN 설정
MAX   MIN
2.4G 미터 5G   2.4G 미터 5G
-24.2 1 -16.2   -85.1 1100 -77.1



RSSI별 세부 Table 생성>


Rule>
RSSI는 .1 단위로 분리
측정 데이타의 각 구간별로 .1단위의 RSSI별 Meter Table을 생성(프로그램 사용)
Filtering>
실제 적용용 Table의 RSSI는 Integer 타입으로 하시 위해서 나머지 값들은 Table에서 제외한다.



소스>


실제 측정을 통해서 2.4G / 5G의 거리별/RSSI별 위치를 측정한다.
예> gcc -g get_rssi_table.c -lm; ./a.out 
[get_rssi_table.c]
#include <stdio.h>
#include <math.h>
#include <string.h>


struct RssiTbl_t
{
float rssi;
float meter;
} PACKED;
typedef struct RssiTbl_t RssiTbl_T;

#define MAX_OUTPUT 1000
RssiTbl_T Output[MAX_OUTPUT];

RssiTbl_T T2G[] = {
{-24.2, 1},
{-44.2, 10},
{-58.2, 50},
{-64.2, 100},
{-67.8, 150},
{-70.3, 200},
{-72.2, 250},
{-73.8, 300},
{-75.1, 350},
{-76.3, 400},
{-77.3, 450},
{-78.2, 500},
{-79.1, 550},
{-79.8, 600},
{-80.5, 650},
{-81.1, 700},
{-81.7, 750},
{-82.3, 800},
{-82.8, 850},
{-83.3, 900},
{-83.8, 950},
{-84.2, 1000},
{-84.7, 1050},
{-85.1, 1100},
{0, 0}
};

RssiTbl_T T5G[] = {
{-16.2, 1},
{-36.2, 10},
{-50.2, 50},
{-56.2, 100},
{-59.8, 150},
{-62.3, 200},
{-64.2, 250},
{-65.8, 300},
{-67.1, 350},
{-68.3, 400},
{-69.3, 450},
{-70.2, 500},
{-71.1, 550},
{-71.8, 600},
{-72.5, 650},
{-73.1, 700},
{-73.7, 750},
{-74.3, 800},
{-74.8, 850},
{-75.3, 900},
{-75.8, 950},
{-76.2, 1000},
{-76.7, 1050},
{-77.1, 1100},
{0, 0}
};

int prn_table(char* pTag, RssiTbl_T* pTbl)
{
RssiTbl_T delta;

int idx, fdx;
float rssi;

memset(Output, 0x00, sizeof(Output));

for(idx = 1; pTbl[idx].rssi; idx++)
{
delta.rssi =  (pTbl[idx].rssi -  pTbl[idx-1].rssi) * 10; // per 0.1 RSSI
delta.meter =  (pTbl[idx].meter -  pTbl[idx-1].meter) / delta.rssi;

// printf("idx/Delta_rssi/meter[%u/%f/%f]\n", idx, delta.rssi, delta.meter);
for(rssi = pTbl[idx-1].rssi; rssi > pTbl[idx].rssi; rssi -= 0.1) {
fdx = abs((int)(rssi * 10));

Output[fdx].rssi = rssi;
Output[fdx].meter = pTbl[idx-1].meter + delta.meter * ((rssi - pTbl[idx-1].rssi) * 10);
// printf("   fdx/Delta_rssi/meter[%u/%f/%f]\n", fdx, Output[fdx].rssi, Output[fdx].meter);
}
}
printf("%s>\n", pTag);
for(idx = 0; idx < MAX_OUTPUT; idx++)
{
if(! Output[idx].rssi) continue;
fdx = (int)(Output[idx].rssi * 10);
if(fdx % 10) continue; // Only X.0

printf("{ %4.0f, %4.0f },\n", Output[idx].rssi, Output[idx].meter);
}

return 1;
}

int main()
{
prn_table("2.4G", T2G);
prn_table("5G", T5G);

}




Table>


[gRssiValTbl]
struct RssiInfoTbl_t
{
int max_rssi;
int max_val;
int min_rssi;
int min_val;
} PACKED;
typedef struct RssiInfoTbl_t RssiInfoTbl_T;
RssiInfoTbl_T gRssiInfoTbl[2] = {
{
-25,    1,
-85, 1100
},
{
-17,    1,
-77, 1100
}
};

struct RssiTbl_t
{
float rssi;
float meter;
} PACKED;
typedef struct RssiTbl_t RssiTbl_T;
RssiTbl_T gRssiValTbl[2][62] = {
{// 2.4G>
{  -25,    1 },
{  -26,    2 },
{  -27,    2 },
{  -28,    3 },
{  -29,    3 },
{  -30,    4 },
{  -31,    4 },
{  -32,    5 },
{  -33,    5 },
{  -34,    5 },
{  -35,    6 },
{  -36,    6 },
{  -37,    7 },
{  -38,    7 },
{  -39,    8 },
{  -40,    8 },
{  -41,    9 },
{  -42,    9 },
{  -43,   10 },
{  -44,   10 },
{  -45,   13 },
{  -46,   15 },
{  -47,   18 },
{  -48,   21 },
{  -49,   24 },
{  -50,   27 },
{  -51,   30 },
{  -52,   33 },
{  -53,   35 },
{  -54,   38 },
{  -55,   41 },
{  -56,   44 },
{  -57,   47 },
{  -58,   50 },
{  -59,   57 },
{  -60,   66 },
{  -61,   74 },
{  -62,   82 },
{  -63,   91 },
{  -64,   99 },
{  -65,  112 },
{  -66,  126 },
{  -67,  140 },
{  -68,  154 },
{  -69,  176 },
{  -70,  196 },
{  -71,  221 },
{  -72,  247 },
{  -73,  278 },
{  -74,  308 },
{  -75,  350 },
{  -76,  392 },
{  -77,  440 },
{  -78,  494 },
{  -79,  550 },
{  -80,  614 },
{  -81,  700 },
{  -82,  783 },
{  -83,  870 },
{  -84,  975 },
{  -85, 1100 },
{  0, 0 }
}, // 2.4G>

{ // 5G>
{  -17,    1 },
{  -18,    2 },
{  -19,    2 },
{  -20,    3 },
{  -21,    3 },
{  -22,    4 },
{  -23,    4 },
{  -24,    5 },
{  -25,    5 },
{  -26,    5 },
{  -27,    6 },
{  -28,    6 },
{  -29,    7 },
{  -30,    7 },
{  -31,    8 },
{  -32,    8 },
{  -33,    9 },
{  -34,    9 },
{  -35,    9 },
{  -36,   10 },
{  -37,   13 },
{  -38,   15 },
{  -39,   18 },
{  -40,   21 },
{  -41,   24 },
{  -42,   27 },
{  -43,   30 },
{  -44,   33 },
{  -45,   35 },
{  -46,   38 },
{  -47,   41 },
{  -48,   44 },
{  -49,   47 },
{  -50,   50 },
{  -51,   57 },
{  -52,   66 },
{  -53,   74 },
{  -54,   82 },
{  -55,   91 },
{  -56,   99 },
{  -57,  112 },
{  -58,  126 },
{  -59,  140 },
{  -60,  156 },
{  -61,  176 },
{  -62,  196 },
{  -63,  221 },
{  -64,  247 },
{  -65,  278 },
{  -66,  308 },
{  -67,  350 },
{  -68,  392 },
{  -69,  440 },
{  -70,  494 },
{  -71,  550 },
{  -72,  614 },
{  -73,  700 },
{  -74,  783 },
{  -75,  870 },
{  -76,  975 },
{  -77, 1100 },
{  0, 0 }
} // 5G>
};





계산>


if(rssi <= gRssiInfoTbl[pData->rf].min_rssi) {
distance = (gRssiInfoTbl[pData->rf].min_val);
} else if(rssi >= gRssiInfoTbl[pData->rf].max_rssi) {
distance = (gRssiInfoTbl[pData->rf].max_val);
} else {
// -25 : max_rssi, -85 : min_rssi
distance = (gRssiValTbl[pData->rf][gRssiInfoTbl[pData->rf].max_rssi - rssi].meter);
}



반응형

'프로그램...' 카테고리의 다른 글

[MySql] Character Set  (0) 2019.09.04
[Perl] 잡다(Sort, .....)  (0) 2019.08.23
[색상] 색의 표현 방식 [펌]  (0) 2019.05.03
[스크립트] Lua  (0) 2019.03.14
[TTL] TeraTerm MACRO  (0) 2019.02.25