From cb47fd3aa52022b47d273390c836b5196eb634a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org>
Date: Tue, 2 Jul 2024 13:00:14 +0200
Subject: [PATCH] Optimize frequency shift

---
 src/main.c | 52 +++++++++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/src/main.c b/src/main.c
index a450aeb..3b39512 100644
--- a/src/main.c
+++ b/src/main.c
@@ -500,7 +500,7 @@ static void rf_rx(void)
 		 * gain but keep it slightly below the maximum to make
 		 * sure we do not overshoot often.
 		 */
-		max_amplitude = max_amplitude / 2;
+		max_amplitude /= 2;
 
 		/*
 		 * We are allowing the counters to only go as high
@@ -509,40 +509,38 @@ static void rf_rx(void)
 		max_amplitude /= sample_rate;
 
 		for (int i = 0; i < IQ_SAMPLES; i++) {
-			uint32_t cos_neg = *cos_ptr++;
-			uint32_t cos_pos = *cos_ptr++;
-			int I1 = cos_neg - cos_pos;
+			int sI = 0, sQ = 0;
 
-			cos_neg = *cos_ptr++;
-			cos_pos = *cos_ptr++;
-			int I2 = cos_neg - cos_pos;
+			/*
+			 * I: +I1 -I3 +Q2 -Q4
+			 * Q: +Q1 -Q3 -I2 +I4
+			 */
+			sI += *cos_ptr++;
+			sI -= *cos_ptr++;
 
-			cos_neg = *cos_ptr++;
-			cos_pos = *cos_ptr++;
-			int I3 = cos_neg - cos_pos;
+			sQ -= *cos_ptr++;
+			sQ += *cos_ptr++;
 
-			cos_neg = *cos_ptr++;
-			cos_pos = *cos_ptr++;
-			int I4 = cos_neg - cos_pos;
+			sI -= *cos_ptr++;
+			sI += *cos_ptr++;
 
-			uint32_t sin_neg = *sin_ptr++;
-			uint32_t sin_pos = *sin_ptr++;
-			int Q1 = sin_neg - sin_pos;
+			sQ += *cos_ptr++;
+			sQ -= *cos_ptr++;
 
-			sin_neg = *sin_ptr++;
-			sin_pos = *sin_ptr++;
-			int Q2 = sin_neg - sin_pos;
+			sQ += *sin_ptr++;
+			sQ -= *sin_ptr++;
 
-			sin_neg = *sin_ptr++;
-			sin_pos = *sin_ptr++;
-			int Q3 = sin_neg - sin_pos;
+			sI += *sin_ptr++;
+			sI -= *sin_ptr++;
 
-			sin_neg = *sin_ptr++;
-			sin_pos = *sin_ptr++;
-			int Q4 = sin_neg - sin_pos;
+			sQ -= *sin_ptr++;
+			sQ += *sin_ptr++;
 
-			int64_t I = I1 - I3 + Q2 - Q4;
-			int64_t Q = Q1 - Q3 - I2 + I4;
+			sI -= *sin_ptr++;
+			sI += *sin_ptr++;
+
+			int64_t I = sI;
+			int64_t Q = sQ;
 
 			I *= gain;
 			I /= max_amplitude;