diff --git a/bilby/gw/detector/interferometer.py b/bilby/gw/detector/interferometer.py
index 82c6f1c4a38abcbd6a03cc8d3205b88c09c575da..4f54b71579eefe878cb6039a5c543e515a7f315f 100644
--- a/bilby/gw/detector/interferometer.py
+++ b/bilby/gw/detector/interferometer.py
@@ -597,6 +597,26 @@ class Interferometer(object):
             power_spectral_density=self.power_spectral_density_array[self.strain_data.frequency_mask],
             duration=self.strain_data.duration)
 
+    def template_template_inner_product(self, signal_1, signal_2):
+        """A noise weighted inner product between two templates, using this ifo's PSD.
+
+        Parameters
+        ==========
+        signal_1 : array_like
+            An array containing the first signal
+        signal_2 : array_like
+            an array containing the second signal
+
+        Returns
+        =======
+        float: The noise weighted inner product of the two templates
+        """
+        return gwutils.noise_weighted_inner_product(
+            aa=signal_1[self.strain_data.frequency_mask],
+            bb=signal_2[self.strain_data.frequency_mask],
+            power_spectral_density=self.power_spectral_density_array[self.strain_data.frequency_mask],
+            duration=self.strain_data.duration)
+
     def matched_filter_snr(self, signal):
         """
 
diff --git a/test/gw/detector/interferometer_test.py b/test/gw/detector/interferometer_test.py
index 66e8476035d52d41b4791a1a2126f3927fadd605..08a8f6a872f8e6fa3fbddef3b554ff07776b340b 100644
--- a/test/gw/detector/interferometer_test.py
+++ b/test/gw/detector/interferometer_test.py
@@ -321,6 +321,18 @@ class TestInterferometer(unittest.TestCase):
             self.assertTrue(np.array_equal(expected[2], actual[2]))
             self.assertEqual(expected[3], actual[3])
 
+    def test_template_template_inner_product(self):
+        signal_1 = np.ones_like(self.ifo.power_spectral_density_array)
+        signal_2 = np.ones_like(self.ifo.power_spectral_density_array) * 2
+        signal_1_optimal = self.ifo.optimal_snr_squared(signal=signal_1)
+        signal_1_optimal_by_template_template = self.ifo.template_template_inner_product(
+            signal_1=signal_1,
+            signal_2=signal_1
+        )
+        self.assertTrue(np.array_equal(signal_1_optimal, signal_1_optimal_by_template_template))
+        signal_1_signal_2_inner_product = self.ifo.template_template_inner_product(signal_1=signal_1, signal_2=signal_2)
+        self.assertTrue(np.array_equal(signal_1_optimal * 2, signal_1_signal_2_inner_product))
+
     def test_repr(self):
         expected = (
             "Interferometer(name='{}', power_spectral_density={}, minimum_frequency={}, "