Reduce jitter and use HPF to improve SNR
This commit is contained in:
parent
38b7ec34f6
commit
3d38c5796b
1 changed files with 57 additions and 16 deletions
73
src/main.c
73
src/main.c
|
|
@ -45,10 +45,10 @@ static uint32_t lo_cos[LO_WORDS] __attribute__((__aligned__(1 << LO_BITS_DEPTH))
|
||||||
|
|
||||||
#define DECIMATE 4
|
#define DECIMATE 4
|
||||||
#define RX_STRIDE (2 * IQ_SAMPLES * DECIMATE)
|
#define RX_STRIDE (2 * IQ_SAMPLES * DECIMATE)
|
||||||
#define RX_BITS_DEPTH 13
|
#define RX_BITS_DEPTH 12
|
||||||
#define RX_WORDS (1 << (RX_BITS_DEPTH - 2))
|
#define RX_WORDS (1 << (RX_BITS_DEPTH - 2))
|
||||||
|
|
||||||
static_assert(RX_STRIDE * 4 < RX_WORDS, "RX_STRIDE * 4 < RX_WORDS");
|
static_assert(RX_STRIDE * 4 <= RX_WORDS, "RX_STRIDE * 4 <= RX_WORDS");
|
||||||
|
|
||||||
static uint32_t rx_cos[RX_WORDS] __attribute__((__aligned__(1 << RX_BITS_DEPTH)));
|
static uint32_t rx_cos[RX_WORDS] __attribute__((__aligned__(1 << RX_BITS_DEPTH)));
|
||||||
|
|
||||||
|
|
@ -142,7 +142,7 @@ static void init_fb()
|
||||||
const uint16_t insn[] = {
|
const uint16_t insn[] = {
|
||||||
pio_encode_mov_not(pio_pins, pio_pins) | pio_encode_sideset(1, 1) |
|
pio_encode_mov_not(pio_pins, pio_pins) | pio_encode_sideset(1, 1) |
|
||||||
pio_encode_delay(0),
|
pio_encode_delay(0),
|
||||||
pio_encode_nop() | pio_encode_sideset(1, 0),
|
pio_encode_nop() | pio_encode_sideset(1, 0) | pio_encode_delay(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
|
|
@ -219,9 +219,7 @@ static void init_ad()
|
||||||
*/
|
*/
|
||||||
pio_encode_in(pio_y, 32),
|
pio_encode_in(pio_y, 32),
|
||||||
pio_encode_in(pio_x, 32),
|
pio_encode_in(pio_x, 32),
|
||||||
pio_encode_set(pio_x, 0),
|
pio_encode_jmp_x_dec(2),
|
||||||
pio_encode_set(pio_y, 0),
|
|
||||||
pio_encode_jmp(1),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
|
|
@ -421,6 +419,7 @@ static void rf_rx_stop(void)
|
||||||
static void rf_rx(void)
|
static void rf_rx(void)
|
||||||
{
|
{
|
||||||
const uint32_t base = (uint32_t)rx_cos;
|
const uint32_t base = (uint32_t)rx_cos;
|
||||||
|
uint32_t prevP = 0, prevN = 0, sample = 0, this = 0, prev = 0;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
@ -458,25 +457,67 @@ static void rf_rx(void)
|
||||||
* We are allowing the counters to only go as high
|
* We are allowing the counters to only go as high
|
||||||
* as sampling rate, but the I/Q conversion splits
|
* as sampling rate, but the I/Q conversion splits
|
||||||
* samples between two channels.
|
* samples between two channels.
|
||||||
|
*
|
||||||
|
* On the other hand, we high-pass the signal before
|
||||||
|
* I/Q conversion and samples potentially add up
|
||||||
|
* constructively.
|
||||||
*/
|
*/
|
||||||
max_amplitude /= sample_rate * 2;
|
max_amplitude /= sample_rate * 2 / 2;
|
||||||
|
|
||||||
for (int i = 0; i < IQ_SAMPLES; i++) {
|
for (int i = 0; i < IQ_SAMPLES; i++) {
|
||||||
int sI = 0, sQ = 0;
|
int sI = 0, sQ = 0;
|
||||||
|
|
||||||
/* Convert to I/Q signal. */
|
// +I
|
||||||
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevP;
|
||||||
|
prevP = sample;
|
||||||
|
sI += this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
sI += *cos_ptr++;
|
sample = *cos_ptr++;
|
||||||
sI -= *cos_ptr++;
|
this = sample - prevN;
|
||||||
|
prevN = sample;
|
||||||
|
sI -= this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
sQ += *cos_ptr++;
|
// +Q
|
||||||
sQ -= *cos_ptr++;
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevP;
|
||||||
|
prevP = sample;
|
||||||
|
sQ += this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
sI -= *cos_ptr++;
|
sample = *cos_ptr++;
|
||||||
sI += *cos_ptr++;
|
this = sample - prevN;
|
||||||
|
prevN = sample;
|
||||||
|
sQ -= this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
sQ -= *cos_ptr++;
|
// -I
|
||||||
sQ += *cos_ptr++;
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevP;
|
||||||
|
prevP = sample;
|
||||||
|
sI -= this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevN;
|
||||||
|
prevN = sample;
|
||||||
|
sI += this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
|
// -Q
|
||||||
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevP;
|
||||||
|
prevP = sample;
|
||||||
|
sQ -= this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
|
sample = *cos_ptr++;
|
||||||
|
this = sample - prevN;
|
||||||
|
prevN = sample;
|
||||||
|
sQ += this - prev;
|
||||||
|
prev = this;
|
||||||
|
|
||||||
int64_t I = sI;
|
int64_t I = sI;
|
||||||
int64_t Q = sQ;
|
int64_t Q = sQ;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue