diff --git a/bilby/gw/likelihood/relative.py b/bilby/gw/likelihood/relative.py
index 64fd81ab130753b079eaa9f6694088a3c6ef4667..2345b25c0e2cb28c3564fed285d187c676dfdc92 100644
--- a/bilby/gw/likelihood/relative.py
+++ b/bilby/gw/likelihood/relative.py
@@ -142,10 +142,6 @@ class RelativeBinningGravitationalWaveTransient(GravitationalWaveTransient):
         self.fiducial_polarizations = None
         self.per_detector_fiducial_waveforms = dict()
         self.per_detector_fiducial_waveform_points = dict()
-        self.bin_freqs = dict()
-        self.bin_inds = dict()
-        self.bin_widths = dict()
-        self.bin_centers = dict()
         self.set_fiducial_waveforms(self.fiducial_parameters)
         logger.info("Initial fiducial waveforms set up")
         self.setup_bins()
@@ -219,6 +215,8 @@ class RelativeBinningGravitationalWaveTransient(GravitationalWaveTransient):
             bin_inds.append(bin_index)
             bin_freqs.append(bin_freq)
         self.bin_inds = np.array(bin_inds, dtype=int)
+        self.bin_sizes = np.diff(bin_inds)
+        self.bin_sizes[-1] += 1
         self.bin_freqs = np.array(bin_freqs)
         self.number_of_bins = len(self.bin_inds) - 1
         logger.debug(
@@ -319,6 +317,10 @@ class RelativeBinningGravitationalWaveTransient(GravitationalWaveTransient):
             for edge in self.bin_freqs:
                 index = np.where(masked_frequency_array == edge)[0][0]
                 masked_bin_inds.append(index)
+            # For the last bin, make sure to include
+            # the last point in the frequency array
+            masked_bin_inds[-1] += 1
+
             masked_strain = interferometer.frequency_domain_strain[mask]
             masked_h0 = self.per_detector_fiducial_waveforms[interferometer.name][mask]
             masked_psd = interferometer.power_spectral_density_array[mask]
@@ -370,16 +372,15 @@ class RelativeBinningGravitationalWaveTransient(GravitationalWaveTransient):
             waveform_polarizations=signal_polarizations,
             interferometer=interferometer,
         )
-        f = interferometer.frequency_array
-        duplicated_r0, duplicated_r1, duplicated_fm = np.zeros((3, f.shape[0]), dtype=complex)
 
-        for i in range(self.number_of_bins):
-            idxs = slice(self.bin_inds[i], self.bin_inds[i + 1])
-            duplicated_fm[idxs] = self.bin_centers[i]
-            duplicated_r0[idxs] = r0[i]
-            duplicated_r1[idxs] = r1[i]
+        idxs = slice(self.bin_inds[0], self.bin_inds[-1] + 1)
+        duplicated_r0 = np.repeat(r0, self.bin_sizes)
+        duplicated_r1 = np.repeat(r1, self.bin_sizes)
+        duplicated_fm = np.repeat(self.bin_centers, self.bin_sizes)
 
-        full_waveform_ratio = duplicated_r0 + duplicated_r1 * (f - duplicated_fm)
+        f = interferometer.frequency_array
+        full_waveform_ratio = np.zeros(f.shape[0], dtype=complex)
+        full_waveform_ratio[idxs] = duplicated_r0 + duplicated_r1 * (f[idxs] - duplicated_fm)
         return fiducial_waveform * full_waveform_ratio
 
     def calculate_snrs(self, waveform_polarizations, interferometer, return_array=True):