diff --git a/firmware/baseband/dsp_demodulate.cpp b/firmware/baseband/dsp_demodulate.cpp
index 1c59c1743..3a0b7f12d 100644
--- a/firmware/baseband/dsp_demodulate.cpp
+++ b/firmware/baseband/dsp_demodulate.cpp
@@ -137,5 +137,14 @@ buffer_s16_t FM::execute(
 	return { dst.p, src.count, src.sampling_rate };
 }
 
+void FM::configure(const float sampling_rate, const float deviation_hz) {
+	/*
+	 * angle: -pi to pi. output range: -32768 to 32767.
+	 * Maximum delta-theta (output of atan2) at maximum deviation frequency:
+	 * delta_theta_max = 2 * pi * deviation / sampling_rate
+	 */
+	k = static_cast<float>(32767.0f / (2.0 * pi * deviation_hz / sampling_rate));
+}
+
 }
 }
diff --git a/firmware/baseband/dsp_demodulate.hpp b/firmware/baseband/dsp_demodulate.hpp
index d7117b9d9..00f9236a7 100644
--- a/firmware/baseband/dsp_demodulate.hpp
+++ b/firmware/baseband/dsp_demodulate.hpp
@@ -55,14 +55,7 @@ public:
 		const buffer_s16_t& dst
 	);
 
-	void configure(const float sampling_rate, const float deviation_hz) {
-		/*
-		 * angle: -pi to pi. output range: -32768 to 32767.
-		 * Maximum delta-theta (output of atan2) at maximum deviation frequency:
-		 * delta_theta_max = 2 * pi * deviation / sampling_rate
-		 */
-		k = static_cast<float>(32767.0f / (2.0 * pi * deviation_hz / sampling_rate));
-	}
+	void configure(const float sampling_rate, const float deviation_hz);
 
 private:
 	complex16_t::rep_type z_ { 0 };