|
|
# compute the two scaled butterfly equations
|
|
|
# A o--->----o---->---
|
|
|
# \ /
|
|
|
# \ /
|
|
|
# \ /
|
|
|
# \/
|
|
|
# /\
|
|
|
# / \
|
|
|
# / \
|
|
|
# / \
|
|
|
# B o--->----o---->---
|
|
|
# (-1) (W)
|
|
|
|
|
|
from efficient_complex_multiplier import EfficientComplexMultiplier
|
|
|
|
|
|
class ButterflyProcessor(object):
|
|
|
"""docstring for ClassName"""
|
|
|
def __init__(self, scale):
|
|
|
super(ButterflyProcessor, self).__init__()
|
|
|
self.scale = scale
|
|
|
self.efficient_complex_multiplier = EfficientComplexMultiplier(0);
|
|
|
|
|
|
def butterfly(self, Are, Aim, Bre, Bim, C, C_plus_S, C_minus_S):
|
|
|
if self.scale == 1:
|
|
|
res = self.butterfly_scaled(Are, Aim, Bre, Bim, C, C_plus_S, C_minus_S)
|
|
|
else:
|
|
|
res = self.butterfly_not_scaled(Are, Aim, Bre, Bim, C, C_plus_S, C_minus_S)
|
|
|
return res
|
|
|
|
|
|
def butterfly_not_scaled(self, Are, Aim, Bre, Bim, C, C_plus_S, C_minus_S):
|
|
|
out1_re = ( Are + Bre )
|
|
|
out1_im = ( Aim + Bim )
|
|
|
tmp_re = ( Are - Bre )
|
|
|
tmp_im = ( Aim - Bim )
|
|
|
res = self.efficient_complex_multiplier.multiply(tmp_re, tmp_im, C, C_plus_S, C_minus_S)
|
|
|
out2_re = res[0]
|
|
|
out2_im = res[1]
|
|
|
out1 = out1_re + 1j * out1_im
|
|
|
out2 = out2_re + 1j * out2_im
|
|
|
return [out1, out2]
|
|
|
|
|
|
def butterfly_scaled(self, Are, Aim, Bre, Bim, C, C_plus_S, C_minus_S):
|
|
|
out1_re = ( Are + Bre ) / 2
|
|
|
out1_im = ( Aim + Bim ) / 2
|
|
|
tmp_re = ( Are - Bre ) / 2
|
|
|
tmp_im = ( Aim - Bim ) / 2
|
|
|
res = self.efficient_complex_multiplier.multiply(tmp_re, tmp_im, C, C_plus_S, C_minus_S)
|
|
|
out2_re = res[0]
|
|
|
out2_im = res[1]
|
|
|
out1 = out1_re + 1j * out1_im
|
|
|
out2 = out2_re + 1j * out2_im
|
|
|
return [out1, out2]
|