#*************************************************************
# Progamm:			fourier_2
# Sinn des Programms: 		Zeitreihenanalyse durch Fourieranalyse
# Sinn der Einheit  :		Recheneinheit	
# Name dieser Datei:		rechner.py
# Versionsnummer:		1
# Wird aufgerufen von:		fourier_2_haupt.py
# Ruft auf:			-
# Nummer im Programmpaket:	4
# von:				5			
# Autor: 			Armin Ulrich
# Erster Lauf: 			03.11.2022
# Letzte Änderung: 		15.11.2022
#*************************************************************

import math
import numpy as np


class Zurück_Rechner:
  #Konstruktormethode
  def __init__(self):		
    print("Rechnerobjekt erzeugt")
    
  
  #Destruktormethode
  def __del__(self):	
    print("Rechnerobjekt entfernt")  
    
  def fourier_zurück(self, spektrum_wähler, cos_min, cos_max, sin_min, sin_max, alle_min, alle_max, m, x_min, x_max, A_cos, B_sin):
#  def fourier_zurück(self, m, x, A_cos, B_sin):
  # m im Zurmühl und Überhuber: 2*N =>
    self.N=int(m/2)

    cos_max += 1  # Damit der Koeffizient cos_max in der Schleife mit "in range" berücksichtigt wird 
    sin_max += 1  # Damit der Koeffizient sin_max in der Schleife mit "in range" berücksichtigt wird 
    alle_max += 1 # Damit der Koeffizient alle_max in der Schleife mit "in range" berücksichtigt wird 
    
    
    print ("A=",A_cos)
    print ("B=",B_sin)
    B_sin[0] = 0.0
    self.theta =np.zeros(2*self.N) 		#Zurmühl Gl. (10)

    self.F_cos = np.zeros(2*self.N) 
    self.F_sin = np.zeros(2*self.N) 
    self.F_alle = np.zeros(2*self.N) 


    print ("Theta=",self.theta)
    for j in range(2*self.N): 			#Zurmühl Gl. (10)
      self.theta[j] = j*math.pi/float(self.N) 	#Zurmühl Gl. (10)
    print(self.theta)
    print("oniheidi", cos_min, cos_max, sin_min, sin_max, alle_min, alle_max)
  
      
        
    for nue in range(0,self.N):
      print(nue,A_cos[nue],B_sin[nue])  

    if spektrum_wähler:
# Cosinus
      for j in range(2*self.N):   
        self.F_cos[j] = A_cos[0]      
        for nue in range(0,self.N):
          self.F_cos[j] += (A_cos[nue]*math.cos(float(nue)*self.theta[j]))    
    
# Sinus
      for j in range(2*self.N):   
        self.F_sin[j] = 0.0
        for nue in range(0,self.N):
          self.F_sin[j] += (B_sin[nue]*math.sin(float(nue)*self.theta[j]))    

# Alle      
      for j in range(2*self.N):
        for nue in range(0,self.N):
          self.F_alle[j] += (A_cos[nue]*math.cos(float(nue)*self.theta[j]) + B_sin[nue]*math.sin(float(nue)*self.theta[j])) 
            
    else:


# Cosinus
      for j in range(2*self.N):  
        self.F_cos[j] = A_cos[0]      
        for nue in range(cos_min,cos_max):
          self.F_cos[j] += (A_cos[nue]*math.cos(float(nue)*self.theta[j]))
 
# Sinus
      for j in range(2*self.N):  
        self.F_sin[j] = 0.0
        for nue in range(sin_min,sin_max):
          self.F_sin[j] += (B_sin[nue]*math.sin(float(nue)*self.theta[j]))

# Alle      
      for j in range(2*self.N):
        for nue in range(alle_min,alle_max):
          self.F_alle[j] += (A_cos[nue]*math.cos(float(nue)*self.theta[j]) + B_sin[nue]*math.sin(float(nue)*self.theta[j]))   


# x_neu aus theta
    self.x_neu =np.zeros(2*self.N)

    for j in range(2*self.N):
      self.x_neu[j] = x_min + (self.theta[j]/(2.0 * math.pi)) * (x_max - x_min)

      

