diff --git a/src/main.c b/src/main.c
index 390ceea..1d19dbe 100644
--- a/src/main.c
+++ b/src/main.c
@@ -40,11 +40,15 @@ static uint32_t lo_sin[LO_WORDS] __attribute__((__aligned__(1 << LO_BITS_DEPTH))
 #define RX_STRIDE (2 * IQ_SAMPLES)
 #define RX_BITS_DEPTH 12
 #define RX_WORDS (1 << (RX_BITS_DEPTH - 2))
+
+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_sin[RX_WORDS] __attribute__((__aligned__(1 << RX_BITS_DEPTH)));
 
-#define INIT_GAIN 256
+#define INIT_GAIN 120
 #define INIT_SAMPLE_RATE 100000
+#define INIT_FREQ 94600000
 
 #define NUM_GAINS 29
 static int gains[NUM_GAINS] = { 0,   9,	  14,  27,  37,	 77,  87,  125, 144, 157,
@@ -457,11 +461,13 @@ static void rf_rx(void)
 
 		/*
 		 * Since the waveform is normally half of the time
-		 * above zero, we could halve once more.
+		 * above zero, we can halve once more.
 		 *
-		 * Instead we use 2/3 to provide 1/3 reserve.
+		 * This is not perfect, so we do not max out the base
+		 * gain but keep it slightly below the maximum to make
+		 * sure we do not overshoot often.
 		 */
-		max_amplitude = max_amplitude * 2 / 3;
+		max_amplitude = max_amplitude / 2;
 
 		/*
 		 * We are allowing the counters to only go as high
@@ -482,6 +488,11 @@ static void rf_rx(void)
 			I *= gain;
 			I /= max_amplitude;
 
+			if (I > 127)
+				I = 127;
+			else if (I < -128)
+				I = -128;
+
 			*blockptr++ = I + 128;
 
 			uint32_t sin_neg = *sin_ptr++;
@@ -496,7 +507,12 @@ static void rf_rx(void)
 			Q *= gain;
 			Q /= max_amplitude;
 
-			*blockptr++ = Q + 128;
+			if (Q > 127)
+				Q = 127;
+			else if (Q < -128)
+				Q = -128;
+
+			*blockptr++ = (uint8_t)Q + 128;
 		}
 
 		(void)queue_try_add(&iq_queue, block);