Skip to content
This repository has been archived by the owner on Aug 1, 2020. It is now read-only.
/ readsb Public archive

Commit

Permalink
Speed up float converters a little, add a SC16Q11-nodc converter.
Browse files Browse the repository at this point in the history
  • Loading branch information
mutability committed Jan 27, 2017
1 parent cde047a commit b1a1771
Showing 1 changed file with 50 additions and 9 deletions.
59 changes: 50 additions & 9 deletions convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ static void convert_uc8_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = *in++;
Q = *in++;
fI = (I - 127.5) / 127.5;
fQ = (Q - 127.5) / 127.5;
fI = (I - 127.5f) / 127.5f;
fQ = (Q - 127.5f) / 127.5f;

// DC block
z1_I = fI * dc_a + z1_I * dc_b;
Expand All @@ -137,7 +137,7 @@ static void convert_uc8_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}

state->z1_I = z1_I;
Expand Down Expand Up @@ -173,8 +173,8 @@ static void convert_sc16_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 32768.0;
fQ = Q / 32768.0;
fI = I / 32768.0f;
fQ = Q / 32768.0f;

// DC block
z1_I = fI * dc_a + z1_I * dc_b;
Expand All @@ -189,7 +189,7 @@ static void convert_sc16_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}

state->z1_I = z1_I;
Expand All @@ -204,6 +204,46 @@ static void convert_sc16_generic(void *iq_data,
}
}

static void convert_sc16q11_nodc(void *iq_data,
uint16_t *mag_data,
unsigned nsamples,
struct converter_state *state,
double *out_mean_level,
double *out_mean_power)
{
uint16_t *in = iq_data;
unsigned i;
int16_t I, Q;
float fI, fQ, magsq;
float sum_level = 0, sum_power = 0;

MODES_NOTUSED(state);

for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 2048.0f;
fQ = Q / 2048.0f;

magsq = fI * fI + fQ * fQ;
if (magsq > 1)
magsq = 1;

float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}

if (out_mean_level) {
*out_mean_level = sum_level / nsamples;
}

if (out_mean_power) {
*out_mean_power = sum_power / nsamples;
}
}

static void convert_sc16q11_generic(void *iq_data,
uint16_t *mag_data,
unsigned nsamples,
Expand All @@ -225,8 +265,8 @@ static void convert_sc16q11_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 2048.0;
fQ = Q / 2048.0;
fI = I / 2048.0f;
fQ = Q / 2048.0f;

// DC block
z1_I = fI * dc_a + z1_I * dc_b;
Expand All @@ -241,7 +281,7 @@ static void convert_sc16q11_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(sqrtf(magsq) * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}

state->z1_I = z1_I;
Expand All @@ -266,6 +306,7 @@ static struct {
{ INPUT_UC8, 0, convert_uc8_nodc, "UC8, integer/table path" },
{ INPUT_UC8, 1, convert_uc8_generic, "UC8, float path" },
{ INPUT_SC16, 1, convert_sc16_generic, "SC16, float path" },
{ INPUT_SC16Q11, 0, convert_sc16q11_nodc, "SC16Q11, float path, no DC block" },
{ INPUT_SC16Q11, 1, convert_sc16q11_generic, "SC16Q11, float path" },
{ 0, 0, NULL, NULL }
};
Expand Down

0 comments on commit b1a1771

Please sign in to comment.