diff --git a/algorithms/butterfly_algorithm.py b/algorithms/butterfly_algorithm.py index 3cfe3366e02904e9ffad50af2d1da5efbd6fa076..b76737116e9b4fee241d99de2ef17b2c61efdf86 100644 --- a/algorithms/butterfly_algorithm.py +++ b/algorithms/butterfly_algorithm.py @@ -40,15 +40,18 @@ class ButterflyAlgorithm(BaseAlgorithm): self.null_deg = self.null_degrees[0] self.theta = pi * cos(radians(self.null_deg)) + self.vector_dirs = [wrapToPi(k * self.theta) for k in range(self.N)] self.sum_dir = wrapToPi(phase(sum([exp(1j* x) for x in self.vector_dirs]))) - self.vector_changes = [0.0 for _ in range(self.N)] + + self.vector_changes = [0.0] * self.N + self.vector_change_limit = (pi * (2**self.bit_count - 1) / 2**self.bit_resolution) self.update_pattern() - before_loop_pattern = nan - while before_loop_pattern != self.pattern: - before_loop_pattern = self.pattern + pattern_before_loop = nan + while pattern_before_loop != self.pattern: + pattern_before_loop = self.pattern for idx in range(self.N // 2): # index for half the vectors original_vector_changes = self.vector_changes[:] original_pattern = self.pattern @@ -62,6 +65,9 @@ class ButterflyAlgorithm(BaseAlgorithm): self.vector_changes[idx] -= alpha self.vector_changes[other] += alpha + self.normalize_change_vector(idx) + self.normalize_change_vector(other) + self.vector_changes = vectorWrapToPi(self.vector_changes) self.update_pattern() @@ -75,3 +81,12 @@ class ButterflyAlgorithm(BaseAlgorithm): # print(f'\nFinal pattern value: {abs(self.pattern) = }' # f'\nFinal score: {-20 * log10(abs(self.pattern))}') return -20 * log10(abs(self.pattern)) + + def normalize_change_vector(self, idx): + limit = self.vector_change_limit + + if self.vector_changes[idx] > 0: + self.vector_changes[idx] = min(limit, self.vector_changes[idx]) + + if self.vector_changes[idx] < 0: + self.vector_changes[idx] = max(-limit, self.vector_changes[idx])