From faba586311d85a3c99d39b7b44323d0830f75a07 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org>
Date: Sun, 25 Feb 2024 23:15:58 +0100
Subject: [PATCH] Assume decimation and optimize the loops

---
 src/main.c | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/src/main.c b/src/main.c
index dbd959a..6950eca 100644
--- a/src/main.c
+++ b/src/main.c
@@ -43,7 +43,6 @@
 #define LPF_SIZE DECIMATION
 
 #define IQ_BLOCK_LEN 64
-#define RX_BLOCK_LEN (IQ_BLOCK_LEN * DECIMATION)
 
 #define XOR_ADDR 0x1000
 #define LO_COS_ACCUMULATOR (&pio1->sm[2].pinctrl)
@@ -62,7 +61,7 @@ static uint32_t rx_sin[RX_WORDS] __attribute__((__aligned__(RX_WORDS * 4)));
 #define SIN_PHASE (UINT_MAX / 4)
 #define COS_PHASE (0)
 
-static_assert(RX_WORDS > RX_BLOCK_LEN, "RX buffers too short for given decimation");
+static_assert(RX_WORDS > 2 * DECIMATION, "RX buffers too short for given decimation");
 
 /* rx -> cp -> cos -> sin -> pio_cos -> pio_sin -> rx ... */
 static int dma_ch_rx = -1;
@@ -580,24 +579,24 @@ static void rf_rx(void)
 			return;
 		}
 
-		int delta = prev_transfers - dma_hw->ch[dma_ch_in_cos].transfer_count;
-		gap = RX_BLOCK_LEN - delta;
-
-		while (delta < RX_BLOCK_LEN) {
-			delta = prev_transfers - dma_hw->ch[dma_ch_in_cos].transfer_count;
-			sleep_us(100);
-		}
-
-		prev_transfers -= RX_BLOCK_LEN;
-
-		uint32_t *cos_ptr = rx_cos + pos;
-		uint32_t *sin_ptr = rx_sin + pos;
-
-		pos = (pos + RX_BLOCK_LEN) & (RX_WORDS - 1);
-
 		int8_t *blockptr = block;
 
 		for (int i = 0; i < IQ_BLOCK_LEN / 2; i++) {
+			int delta = prev_transfers - dma_hw->ch[dma_ch_in_cos].transfer_count;
+			gap = 2 * DECIMATION - delta;
+
+			while (delta < 2 * DECIMATION) {
+				delta = prev_transfers - dma_hw->ch[dma_ch_in_cos].transfer_count;
+				sleep_us(100);
+			}
+
+			prev_transfers -= 2 * DECIMATION;
+
+			uint32_t *cos_ptr = rx_cos + pos;
+			uint32_t *sin_ptr = rx_sin + pos;
+
+			pos = (pos + 2 * DECIMATION) & (RX_WORDS - 1);
+
 			int64_t dI = 0;
 			int64_t dQ = 0;