반응형
[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 Query - Insert or Update (0) | 2024.07.03 |
---|---|
[MySql] Character Set (0) | 2019.09.04 |
[Perl] 잡다(Sort, .....) (0) | 2019.08.23 |
[색상] 색의 표현 방식 [펌] (0) | 2019.05.03 |
[스크립트] Lua (0) | 2019.03.14 |