add pucch energy plot
This commit is contained in:
@@ -15,6 +15,10 @@ ID = PUCCH_1AB_IQ
|
||||
DESC = eNodeB PUCCH received IQ data
|
||||
GROUP = PHY:GRAPHIC:HEAVY
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,I : int,Q
|
||||
ID = PUCCH_1_ENERGY
|
||||
DESC = eNodeB PUCCH 1 energy and threshold
|
||||
GROUP = PHY:GRAPHIC:HEAVY
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
|
||||
|
||||
#legacy logs
|
||||
ID = LEGACY_MAC_INFO
|
||||
|
||||
+3
-1
@@ -4,13 +4,15 @@
|
||||
/* types of plots */
|
||||
#define PLOT_VS_TIME 0
|
||||
#define PLOT_IQ_POINTS 1
|
||||
#define PLOT_MINMAX 2
|
||||
|
||||
/* ... is { int count; int type; char *color; } for 'nplots' plots */
|
||||
void *make_plot(int width, int height, char *title, int nplots, ...);
|
||||
void plot_set(void *plot, float *data, int len, int pos, int pp);
|
||||
void iq_plot_set(void *plot, short *data, int len, int pos, int pp);
|
||||
void iq_plot_set_sized(void *_plot, short *data, int len, int pp);
|
||||
void iq_plot_add_point_loop(void *_plot, short i, short q, int pp);
|
||||
void iq_plot_add_iq_point_loop(void *_plot, short i, short q, int pp);
|
||||
void iq_plot_add_energy_point_loop(void *_plot, int e, int pp);
|
||||
|
||||
/* returns an opaque pointer - truly a 'database *', see t_data.c */
|
||||
void *parse_database(char *filename);
|
||||
|
||||
+40
-10
@@ -7,6 +7,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
@@ -14,10 +15,14 @@
|
||||
#include "../T_IDs.h"
|
||||
#include "../T_defs.h"
|
||||
|
||||
#define BLUE "#0c0c72"
|
||||
#define RED "#d72828"
|
||||
|
||||
void *ul_plot;
|
||||
void *chest_plot;
|
||||
void *pusch_iq_plot;
|
||||
void *pucch_iq_plot;
|
||||
void *pucch_plot;
|
||||
|
||||
#ifdef T_USE_SHARED_MEMORY
|
||||
|
||||
@@ -213,8 +218,12 @@ void get_message(int s)
|
||||
GET(s, &size, sizeof(int));
|
||||
GET(s, buf, size);
|
||||
#if 0
|
||||
printf("got T_ENB_INPUT_SIGNAL eNB %d frame %d subframe %d antenna %d size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
|
||||
eNB, frame, subframe, antenna, size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);
|
||||
printf("got T_ENB_INPUT_SIGNAL eNB %d frame %d subframe %d antenna "
|
||||
"%d size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x "
|
||||
"%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
|
||||
eNB, frame, subframe, antenna, size, buf[0],buf[1],buf[2],
|
||||
buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],
|
||||
buf[11],buf[12],buf[13],buf[14],buf[15]);
|
||||
#endif
|
||||
if (size != 4 * 7680)
|
||||
{printf("bad T_ENB_INPUT_SIGNAL, only 7680 samples allowed\n");abort();}
|
||||
@@ -272,8 +281,22 @@ void get_message(int s)
|
||||
GET(s, &subframe, sizeof(int));
|
||||
GET(s, &I, sizeof(int));
|
||||
GET(s, &Q, sizeof(int));
|
||||
printf("receiving %d %d\n", I, Q);
|
||||
if (pucch_iq_plot) iq_plot_add_point_loop(pucch_iq_plot, I*10, Q*10, 0);
|
||||
if (pucch_iq_plot) iq_plot_add_iq_point_loop(pucch_iq_plot,I*10,Q*10, 0);
|
||||
break;
|
||||
}
|
||||
case T_PUCCH_1_ENERGY: {
|
||||
int eNB, UE, frame, subframe, e, t;
|
||||
GET(s, &eNB, sizeof(int));
|
||||
GET(s, &UE, sizeof(int));
|
||||
GET(s, &frame, sizeof(int));
|
||||
GET(s, &subframe, sizeof(int));
|
||||
GET(s, &e, sizeof(int));
|
||||
GET(s, &t, sizeof(int));
|
||||
//printf("t %d e %d\n", t, (int)(10*log10(e)));
|
||||
if (pucch_plot) {
|
||||
iq_plot_add_energy_point_loop(pucch_plot, t, 0);
|
||||
iq_plot_add_energy_point_loop(pucch_plot, 10*log10(e), 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case T_buf_test: {
|
||||
@@ -281,8 +304,10 @@ printf("receiving %d %d\n", I, Q);
|
||||
int size;
|
||||
GET(s, &size, sizeof(int));
|
||||
GET(s, buf, size);
|
||||
printf("got buffer size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
|
||||
size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);
|
||||
printf("got buffer size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x"
|
||||
" %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
|
||||
size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],
|
||||
buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);
|
||||
break;
|
||||
}
|
||||
default: printf("unkown message type %d\n", m); abort();
|
||||
@@ -386,13 +411,18 @@ int main(int n, char **v)
|
||||
|
||||
if (do_xforms) {
|
||||
ul_plot = make_plot(512, 100, "UL Input Signal", 1,
|
||||
7680*10, PLOT_VS_TIME, "blue");
|
||||
7680*10, PLOT_VS_TIME, BLUE);
|
||||
chest_plot = make_plot(512, 100, "UL Channel Estimate UE 0", 1,
|
||||
512, PLOT_VS_TIME, "blue");
|
||||
512, PLOT_VS_TIME, BLUE);
|
||||
pusch_iq_plot = make_plot(100, 100, "PUSCH IQ", 1,
|
||||
12*25*14, PLOT_IQ_POINTS, "blue");
|
||||
12*25*14, PLOT_IQ_POINTS, BLUE);
|
||||
pucch_iq_plot = make_plot(100, 100, "PUCCH IQ", 1,
|
||||
1000, PLOT_IQ_POINTS, "blue");
|
||||
1000, PLOT_IQ_POINTS, BLUE);
|
||||
pucch_plot = make_plot(512, 100, "PUCCH 1 energy (SR)", 2,
|
||||
/* threshold */
|
||||
10240, PLOT_MINMAX, RED,
|
||||
/* pucch 1 */
|
||||
10240, PLOT_MINMAX, BLUE);
|
||||
}
|
||||
|
||||
for (i = 0; i < on_off_n; i++)
|
||||
|
||||
+30
-3
@@ -84,9 +84,21 @@ static void *plot_thread(void *_p)
|
||||
|
||||
if (pthread_mutex_lock(&p->lock)) abort();
|
||||
|
||||
XFillRectangle(p->d, p->px, p->bg, 0, 0, p->width, p->height);
|
||||
|
||||
for (pp = 0; pp < p->nplots; pp++) {
|
||||
XFillRectangle(p->d, p->px, p->bg, 0, 0, p->width, p->height);
|
||||
if (p->p[pp].type == PLOT_VS_TIME) {
|
||||
if (p->p[pp].type == PLOT_MINMAX) {
|
||||
s = p->p[pp].buf;
|
||||
for (i = 0; i < 512; i++) {
|
||||
int min = *s;
|
||||
int max = *s;
|
||||
for (j = 0; j < p->p[pp].count/512; j++, s++) {
|
||||
if (*s < min) min = *s;
|
||||
if (*s > max) max = *s;
|
||||
}
|
||||
XDrawLine(p->d, p->px, p->p[pp].g, i, 100-min, i, 100-max);
|
||||
}
|
||||
} else if (p->p[pp].type == PLOT_VS_TIME) {
|
||||
for (i = 0; i < p->p[pp].count; i++)
|
||||
p->p[pp].buf[i] =
|
||||
10*log10(1.0+(float)(p->p[pp].iqbuf[2*i]*p->p[pp].iqbuf[2*i]+
|
||||
@@ -215,6 +227,10 @@ void *make_plot(int width, int height, char *title, int nplots, ...)
|
||||
if (p->p[i].buf == NULL) abort();
|
||||
p->p[i].iqbuf = malloc(sizeof(short) * count * 2);
|
||||
if(p->p[i].iqbuf==NULL)abort();
|
||||
} else if (type == PLOT_MINMAX) {
|
||||
p->p[i].buf = malloc(sizeof(float) * count);
|
||||
if (p->p[i].buf == NULL) abort();
|
||||
p->p[i].iqbuf = NULL;
|
||||
} else {
|
||||
p->p[i].buf = NULL;
|
||||
p->p[i].iqbuf = malloc(sizeof(short) * count * 2);
|
||||
@@ -269,7 +285,7 @@ void iq_plot_set_sized(void *_plot, short *data, int count, int pp)
|
||||
if (pthread_mutex_unlock(&p->lock)) abort();
|
||||
}
|
||||
|
||||
void iq_plot_add_point_loop(void *_plot, short i, short q, int pp)
|
||||
void iq_plot_add_iq_point_loop(void *_plot, short i, short q, int pp)
|
||||
{
|
||||
plot *p = _plot;
|
||||
if (pthread_mutex_lock(&p->lock)) abort();
|
||||
@@ -280,3 +296,14 @@ void iq_plot_add_point_loop(void *_plot, short i, short q, int pp)
|
||||
if (p->p[pp].iq_insert_pos == p->p[pp].count) p->p[pp].iq_insert_pos = 0;
|
||||
if (pthread_mutex_unlock(&p->lock)) abort();
|
||||
}
|
||||
|
||||
void iq_plot_add_energy_point_loop(void *_plot, int e, int pp)
|
||||
{
|
||||
plot *p = _plot;
|
||||
if (pthread_mutex_lock(&p->lock)) abort();
|
||||
p->p[pp].buf[p->p[pp].iq_insert_pos] = e;
|
||||
if (p->p[pp].iq_count != p->p[pp].count) p->p[pp].iq_count++;
|
||||
p->p[pp].iq_insert_pos++;
|
||||
if (p->p[pp].iq_insert_pos == p->p[pp].count) p->p[pp].iq_insert_pos = 0;
|
||||
if (pthread_mutex_unlock(&p->lock)) abort();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user