TX changes
This commit is contained in:
parent
2825e5e49d
commit
8a6283c5ae
81
src/main.c
81
src/main.c
|
@ -96,6 +96,14 @@ static int agc = 0;
|
|||
|
||||
#define PSU_PIN 23
|
||||
|
||||
static uint32_t rnd = 0;
|
||||
|
||||
inline static uint32_t rnd_next()
|
||||
{
|
||||
rnd = rnd * 0x41c64e6d + 12345;
|
||||
return rnd;
|
||||
}
|
||||
|
||||
static void bias_init(int in_pin, int out_pin)
|
||||
{
|
||||
gpio_disable_pulls(in_pin);
|
||||
|
@ -264,7 +272,7 @@ static void adder_init()
|
|||
pio_sm_set_enabled(pio1, 3, true);
|
||||
}
|
||||
|
||||
inline static float lo_round_freq(size_t bits, float req_freq)
|
||||
inline static double lo_round_freq(size_t bits, double req_freq)
|
||||
{
|
||||
const double step_hz = (double)CLK_SYS_HZ / bits;
|
||||
return round(req_freq / step_hz) * step_hz;
|
||||
|
@ -272,7 +280,7 @@ inline static float lo_round_freq(size_t bits, float req_freq)
|
|||
|
||||
static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase)
|
||||
{
|
||||
unsigned step = ((double)UINT_MAX + 1.0) / (double)CLK_SYS_HZ * freq;
|
||||
unsigned step = (UINT_MAX + 1.0) / CLK_SYS_HZ * freq;
|
||||
unsigned accum = phase;
|
||||
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
|
@ -280,10 +288,7 @@ static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase)
|
|||
|
||||
for (int j = 0; j < 32; j++) {
|
||||
#if LO_DITHER
|
||||
int n0 = rand() - RAND_MAX / 2;
|
||||
int n1 = rand() - RAND_MAX / 2;
|
||||
int noise = (n0 + n1) / 2;
|
||||
|
||||
int noise = (rnd_next() >> 3) - (rnd_next() >> 3);
|
||||
bits |= (accum + noise) >> 31;
|
||||
#else
|
||||
bits |= accum >> 31;
|
||||
|
@ -296,9 +301,9 @@ static void lo_generate(uint32_t *buf, size_t len, double freq, unsigned phase)
|
|||
}
|
||||
}
|
||||
|
||||
static float rx_lo_init(double req_freq)
|
||||
static double rx_lo_init(double req_freq)
|
||||
{
|
||||
float freq = lo_round_freq(LO_WORDS * 32, req_freq);
|
||||
double freq = lo_round_freq(LO_WORDS * 8, req_freq);
|
||||
|
||||
lo_generate(lo_cos, LO_WORDS, freq, COS_PHASE);
|
||||
lo_generate(lo_sin, LO_WORDS, freq, SIN_PHASE);
|
||||
|
@ -306,10 +311,10 @@ static float rx_lo_init(double req_freq)
|
|||
return freq;
|
||||
}
|
||||
|
||||
static float tx_fsk_lo_init(float req_freq, float separation)
|
||||
static double tx_fsk_lo_init(double req_freq, double separation)
|
||||
{
|
||||
float hi = lo_round_freq(LO_WORDS * 32, req_freq + separation / 2);
|
||||
float lo = lo_round_freq(LO_WORDS * 32, hi - separation);
|
||||
double hi = lo_round_freq(LO_WORDS * 8, req_freq + separation / 2);
|
||||
double lo = lo_round_freq(LO_WORDS * 8, hi - separation);
|
||||
|
||||
lo_generate(lo_cos, LO_WORDS, hi, COS_PHASE);
|
||||
lo_generate(lo_sin, LO_WORDS, lo, SIN_PHASE);
|
||||
|
@ -364,7 +369,7 @@ static const uint32_t samp_insn[] __attribute__((__aligned__(16))) = {
|
|||
|
||||
static uint32_t null, one = 1;
|
||||
|
||||
static float rf_rx_start(int rx_pin, int bias_pin, float freq, int frac_num, int frac_denom)
|
||||
static double rf_rx_start(int rx_pin, int bias_pin, double freq, int frac_num, int frac_denom)
|
||||
{
|
||||
dma_ch_rx = dma_claim_unused_channel(true);
|
||||
dma_ch_cp = dma_claim_unused_channel(true);
|
||||
|
@ -472,7 +477,7 @@ static float rf_rx_start(int rx_pin, int bias_pin, float freq, int frac_num, int
|
|||
bias_init(rx_pin, bias_pin);
|
||||
adder_init();
|
||||
|
||||
float actual = rx_lo_init(freq);
|
||||
double actual = rx_lo_init(freq);
|
||||
|
||||
dma_channel_start(dma_ch_rx);
|
||||
dma_channel_start(dma_ch_samp_trig);
|
||||
|
@ -782,9 +787,9 @@ static void __unused plot_IQ(int I, int Q)
|
|||
}
|
||||
}
|
||||
|
||||
static void do_rx(int rx_pin, int bias_pin, float freq, char mode)
|
||||
static void do_rx(int rx_pin, int bias_pin, double freq, char mode)
|
||||
{
|
||||
float actual = rf_rx_start(rx_pin, bias_pin, freq, 1, CLK_SYS_HZ / BANDWIDTH);
|
||||
double actual = rf_rx_start(rx_pin, bias_pin, freq, 1, CLK_SYS_HZ / BANDWIDTH);
|
||||
sleep_us(100);
|
||||
|
||||
dma_ch_in_cos = dma_claim_unused_channel(true);
|
||||
|
@ -837,8 +842,8 @@ static void do_rx(int rx_pin, int bias_pin, float freq, char mode)
|
|||
fflush(stdout);
|
||||
} else {
|
||||
/* Because AGC is kept 1 bit below to accomodate for jitter. */
|
||||
float agc_frac = 2.0f * (float)agc / (float)INT_MAX;
|
||||
float rssi = 10.0f * log10f(powf(agc_frac, 2));
|
||||
double agc_frac = 2.0f * (double)agc / (double)INT_MAX;
|
||||
double rssi = 10.0f * log10f(powf(agc_frac, 2));
|
||||
|
||||
for (int i = 0; i < IQ_BLOCK_LEN / 2; i += 2) {
|
||||
int I = block[i] >> 8;
|
||||
|
@ -879,7 +884,7 @@ static void command(const char *cmd)
|
|||
{
|
||||
static char tmp[83];
|
||||
int n, x;
|
||||
float f, g;
|
||||
double f, g;
|
||||
|
||||
if (1 == sscanf(cmd, " help %[\a]", tmp)) {
|
||||
puts("help - this help");
|
||||
|
@ -912,25 +917,25 @@ static void command(const char *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (4 == sscanf(cmd, " rx %i %i %f %[\a]", &n, &x, &f, tmp)) {
|
||||
if (4 == sscanf(cmd, " rx %i %i %lf %[\a]", &n, &x, &f, tmp)) {
|
||||
do_rx(n, x, f, 'a');
|
||||
return;
|
||||
}
|
||||
|
||||
if (4 == sscanf(cmd, " brx %i %i %f %[\a]", &n, &x, &f, tmp)) {
|
||||
if (4 == sscanf(cmd, " brx %i %i %lf %[\a]", &n, &x, &f, tmp)) {
|
||||
do_rx(n, x, f, 'b');
|
||||
return;
|
||||
}
|
||||
|
||||
if (3 == sscanf(cmd, " bpsk %i %f %[\a]", &n, &f, tmp)) {
|
||||
float actual = rx_lo_init(f);
|
||||
if (3 == sscanf(cmd, " bpsk %i %lf %[\a]", &n, &f, tmp)) {
|
||||
double actual = rx_lo_init(f);
|
||||
printf("Frequency: %.0f\n", actual);
|
||||
|
||||
rf_tx_start(n);
|
||||
puts("Transmitting, press ENTER to stop.");
|
||||
|
||||
bool phase = false;
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32);
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8);
|
||||
|
||||
while (true) {
|
||||
int c = getchar_timeout_us(10000);
|
||||
|
@ -972,8 +977,8 @@ static void command(const char *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (4 == sscanf(cmd, " fsk %i %f %f %[\a]", &n, &f, &g, tmp)) {
|
||||
g = lo_round_freq(LO_WORDS * 32, g);
|
||||
if (4 == sscanf(cmd, " fsk %i %lf %lf %[\a]", &n, &f, &g, tmp)) {
|
||||
g = lo_round_freq(LO_WORDS * 8, g);
|
||||
f = tx_fsk_lo_init(f, g);
|
||||
printf("Frequency: %.0f +/- %.f\n", f, g / 2.0f);
|
||||
|
||||
|
@ -981,7 +986,7 @@ static void command(const char *cmd)
|
|||
puts("Transmitting, press ENTER to stop.");
|
||||
|
||||
bool high = true;
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32);
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8);
|
||||
|
||||
while (true) {
|
||||
int c = getchar_timeout_us(10000);
|
||||
|
@ -1024,15 +1029,15 @@ static void command(const char *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (3 == sscanf(cmd, " ook %i %f %[\a]", &n, &f, tmp)) {
|
||||
float actual = rx_lo_init(f);
|
||||
if (3 == sscanf(cmd, " ook %i %lf %[\a]", &n, &f, tmp)) {
|
||||
double actual = rx_lo_init(f);
|
||||
printf("Frequency: %.0f\n", actual);
|
||||
|
||||
rf_tx_start(n);
|
||||
puts("Transmitting, press ENTER to stop.");
|
||||
|
||||
bool off = false;
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 32);
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8);
|
||||
|
||||
while (true) {
|
||||
int c = getchar_timeout_us(10000);
|
||||
|
@ -1063,12 +1068,12 @@ static void command(const char *cmd)
|
|||
return;
|
||||
}
|
||||
|
||||
if (5 == sscanf(cmd, " sweep %i %f %f %i %[\a]", &n, &f, &g, &x, tmp)) {
|
||||
const float step_hz = (float)CLK_SYS_HZ / (LO_WORDS * 32);
|
||||
const float start = roundf(f / step_hz) * step_hz;
|
||||
const float stop = roundf(g / step_hz) * step_hz;
|
||||
if (5 == sscanf(cmd, " sweep %i %lf %lf %i %[\a]", &n, &f, &g, &x, tmp)) {
|
||||
const double step_hz = (double)CLK_SYS_HZ / (LO_WORDS * 8);
|
||||
const double start = round(f / step_hz) * step_hz;
|
||||
const double stop = round(g / step_hz) * step_hz;
|
||||
|
||||
int steps = roundf((stop - start) / step_hz);
|
||||
int steps = round((stop - start) / step_hz);
|
||||
|
||||
for (int i = 0; i < LO_WORDS; i++)
|
||||
lo_cos[i] = 0;
|
||||
|
@ -1080,7 +1085,7 @@ static void command(const char *cmd)
|
|||
if ('\r' == c)
|
||||
break;
|
||||
|
||||
float actual = rx_lo_init(start + i * step_hz);
|
||||
double actual = rx_lo_init(start + i * step_hz);
|
||||
printf("Frequency: %.0f\n", actual);
|
||||
}
|
||||
|
||||
|
@ -1091,7 +1096,7 @@ static void command(const char *cmd)
|
|||
|
||||
if (2 == sscanf(cmd, " noise %i %[\a]", &n, tmp)) {
|
||||
for (int i = 0; i < LO_WORDS; i++)
|
||||
lo_cos[i] = rand();
|
||||
lo_cos[i] = rnd_next();
|
||||
|
||||
rf_tx_start(n);
|
||||
|
||||
|
@ -1103,7 +1108,7 @@ static void command(const char *cmd)
|
|||
break;
|
||||
|
||||
for (int i = 0; i < LO_WORDS; i++)
|
||||
lo_cos[i] = rand();
|
||||
lo_cos[i] = rnd_next();
|
||||
}
|
||||
|
||||
rf_tx_stop();
|
||||
|
@ -1138,7 +1143,7 @@ int main()
|
|||
}
|
||||
|
||||
printf("\nPuppet Online!\n");
|
||||
printf("clk_sys = %10.6f MHz\n", (float)clock_get_hz(clk_sys) / MHZ);
|
||||
printf("clk_sys = %10.6f MHz\n", (double)clock_get_hz(clk_sys) / MHZ);
|
||||
|
||||
queue_init(&iq_queue, IQ_BLOCK_LEN * sizeof(int16_t), 256);
|
||||
|
||||
|
|
Loading…
Reference in a new issue