//My code-module:
private int FunktionMath_FourierTransform(string argument)
{
int fehler = 0;
//argument: (Typ1 Feld1, out Typ2 Feld2, Typ3 Vorwärts); //Diskrete Fourier-Transformation.
//Feld1 und Feld2 können zwei gleichgroße n-dimensionale Vektoren oder m x n Matrizen sein, wobei m, n ganzzahlig > 0 mit äquidistanten Stützpunkten sind.
//Bei der Hin-Transformation mit Vorwärts == "true" kann Typ1 "decimal" oder "complex" sein,
//bei der Rück-Transformation mit Vorwärts == "false" wird Typ1 "complex" erwartet,
//Typ2 ist immer "complex", Typ3 ist \"var\" mit Subtyp "bool"
string SystemLokal = ""; string meldung = "";
bool diagnoselok = diagnosealt;
string[] trennmuster = { "," };
int maxanzahl = 4;
StringSplitOptions SSO = StringSplitOptions.RemoveEmptyEntries;//None
string[] argumenteliste = argument.Split(trennmuster, maxanzahl, SSO);
int anzahl = argumenteliste.Length;
string ArgumentName = "";
string ErgebnisName = "";
string SteuerungName = "";
//meldung = "Fourier Punkt 10: fehler = " + Convert.ToString(fehler);
//ProtokollSchreiben.WriteLine(meldung);//Test
if (anzahl == 3)
{
ArgumentName = argumenteliste[0].Trim();
ErgebnisName = argumenteliste[1].Trim();
SteuerungName = argumenteliste[2].Trim();
ErgebnisName = VorwortOutAbschneiden(ErgebnisName);
bool rechenerfolgvor = OBR.GetRechenErfolg();
OBR.ResetRechenErfolg();
string EingabeTyp = "";
string AusgabeTyp = ""; string FeldElementTyp = "";
bool finde = VariablenNamePruefenDatentyp(ErgebnisName, out AusgabeTyp, out FeldElementTyp);
if (finde != true) { fehler = 1; }
ArrayList FeldWert = new ArrayList();
if (fehler == 0)
{
fehler = VariablenWertPruefen(ArgumentName, out FeldWert);
}
ArrayList SteuerungWert = new ArrayList();
if (fehler == 0)
{
fehler = VariablenWertPruefen(SteuerungName, out SteuerungWert);
}
bool Vorwärts = true;
if (fehler == 0)
{
string Vorwärtswort = (string)SteuerungWert[0];
Vorwärtswort = Vorwärtswort.ToLower();
if (Vorwärtswort == "false") { Vorwärts = false; }
}
//meldung = "Fourier Punkt 12: fehler = " + Convert.ToString(fehler);
//ProtokollSchreiben.WriteLine(meldung);//Test
ProgrammMethoden PM = new ProgrammMethoden();
string indexvektor;
int index;
VariablenFeldDaten VarFeldDaten1 = new VariablenFeldDaten();
int DimAnzahl1 = 0;
int Achsenzahl11 = 0;
int Achsenzahl12 = 0;
int MatrixDezimalDim0 = 1;
int MatrixDezimalDim1 = 1;
int MatrixKomplexDim0 = 1;
int MatrixKomplexDim1 = 1;
int Achsenzahl1 = 0;
int VektorDezimalDim = 1;
int VektorKomplexDim = 1;
//meldung = "Fourier Punkt 13: fehler = " + Convert.ToString(fehler);
//ProtokollSchreiben.WriteLine(meldung);//Test
int laufanz = 0;
if (fehler == 0)
{
switch (FeldWert[0].GetType().Name)
{
case "VariablenFeldDaten":
VarFeldDaten1 = (VariablenFeldDaten)FeldWert[0];
DimAnzahl1 = VarFeldDaten1.DimensionenVektor.Count;
if (DimAnzahl1 == 2)
{
Achsenzahl11 = (int)VarFeldDaten1.DimensionenVektor[0];
Achsenzahl12 = (int)VarFeldDaten1.DimensionenVektor[1];
EingabeTyp = VarFeldDaten1.Typ;
if (0 < (Achsenzahl11 * Achsenzahl12))
{
/*
//Nur für Fast-Fourier-Transform erforderlich:
if ((Achsenzahl11 % 2 != 0) || (Achsenzahl12 % 2 != 0))
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler: Nur geradzahlige Anzahl von Elementen bei Matrix1 in jeder Dimension zulässig, " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
*/
laufanz = Achsenzahl11 + Achsenzahl12;
if (EingabeTyp == "Dezimal")
{
MatrixDezimalDim0 = Achsenzahl11; MatrixDezimalDim1 = Achsenzahl12;
}
else
{
MatrixKomplexDim0 = Achsenzahl11; MatrixKomplexDim1 = Achsenzahl12;
}
}
else
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler: Anzahl der Elemente bei Matrix1 ist Null; " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
}
else if (DimAnzahl1 == 1)
{
Achsenzahl1 = (int)VarFeldDaten1.DimensionenVektor[0];
EingabeTyp = VarFeldDaten1.Typ;
if (0 < Achsenzahl1)
{
/*
//Nur für Fast-Fourier-Transform erforderlich:
if (Achsenzahl1 % 2 != 0)
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler: Nur geradzahlige Anzahl von Elementen bei Vektor1 zulässig, " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
*/
laufanz = 1;
if (EingabeTyp == "Dezimal")
{
VektorDezimalDim = Achsenzahl1;
}
else
{
VektorKomplexDim = Achsenzahl1;
}
}
else
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler: Anzahl der Elemente bei Vektor1 ist Null; " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
}
else
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler: Nur max. 2 Dimensionen bei Feld1 zulässig; " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
break;
default:
fehler = 1;
break;
}
if (fehler != 0)
{
SystemNavigation(out SystemLokal);
meldung = "Fehler: Datentyp von Parameter 1 ist unzulässig; " + SystemLokal + "; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
}
//meldung = "Fourier Punkt 2: fehler = " + Convert.ToString(fehler) + ", DimAnzahl1 = " + Convert.ToString(DimAnzahl1) + ", Achsenzahl1 = " + Convert.ToString(Achsenzahl1) + ", Achsenzahl11 = " + Convert.ToString(Achsenzahl11) + ", Achsenzahl12 = " + Convert.ToString(Achsenzahl12);
//ProtokollSchreiben.WriteLine(meldung);//Test
if (fehler == 0)
{
FunktionC();//Löschen der x- und y-Zeile
FunktionDegree("false");//Winkeleinheit zu rad umschalten
int moduli = 1; string modulmax = laufanz.ToString();
DiagnoseAnzeige DA;
DA = new DiagnoseAnzeige();
if (diagnoselok == true)
{
DA.Opacity = 100;
DA.Show();
}
Dezimal DeziWert = new Dezimal();
DeziWert.Mantisse = 0; DeziWert.Exponent = 0;
if (DimAnzahl1 == 2)
{
Dezimal[,] Matrix1Dezimalelem = new Dezimal[MatrixDezimalDim0, MatrixDezimalDim1];
Komplex[,] Matrix1Komplexelem = new Komplex[MatrixKomplexDim0, MatrixKomplexDim1];
/*
if (EingabeTyp == "Dezimal")//Test
{
TestDatenSetzenDezimal(Achsenzahl11, Achsenzahl12, out Matrix1Dezimalelem);
}
else
{
TestDatenSetzenKomplex(Achsenzahl11, Achsenzahl12, out Matrix1Komplexelem);
}
*/
//Orig
for (int i = 0; (i < Achsenzahl11) && (fehler == 0); i++)
{
for (int j = 0; (j < Achsenzahl12) && (fehler == 0); j++)
{
indexvektor = "[" + Convert.ToString(i) + "][" + Convert.ToString(j) + "]";
fehler = PM.VariablenFeldElementBehandeln(VarFeldDaten1.DimensionenVektor, indexvektor, out index);
if (fehler == 0)
{
if (EingabeTyp == "Dezimal")
{
Matrix1Dezimalelem[i, j] = (Dezimal)VarFeldDaten1.Wert[index];
}
else
{
Matrix1Komplexelem[i, j] = (Komplex)VarFeldDaten1.Wert[index];
}
}
}
}
Komplex[,] ErgebnisMatrixKomplexWert = new Komplex[Achsenzahl11, Achsenzahl12];
for (int i = 0; i < Achsenzahl11; i++)//nzb
{
for (int j = 0; j < Achsenzahl12; j++)
{
ErgebnisMatrixKomplexWert[i, j].Re = DeziWert;
ErgebnisMatrixKomplexWert[i, j].Im = DeziWert;
}
}
fehler = FunkFourierTransform2Dim(Matrix1Dezimalelem, Matrix1Komplexelem, EingabeTyp, out ErgebnisMatrixKomplexWert, Vorwärts, moduli, modulmax, diagnoselok, DA);
//meldung = "Fourier Punkt 3: fehler = " + Convert.ToString(fehler);
//ProtokollSchreiben.WriteLine(meldung);//Test
for (int i = 0; (i < Achsenzahl11) && (fehler == 0); i++)
{
for (int j = 0; (j < Achsenzahl12) && (fehler == 0); j++)
{
FeldWert.Clear();
FeldWert.Add(ErgebnisMatrixKomplexWert[i, j]);
string ErgebnisNameElem = ErgebnisName + "[" + Convert.ToString(i) + "][" + Convert.ToString(j) + "]";
fehler = VariablenWertSetzen(ErgebnisNameElem, FeldWert);
}
}
}
else if (DimAnzahl1 == 1)
{
Dezimal[] Vektor1Dezimalelem = new Dezimal[VektorDezimalDim];
Komplex[] Vektor1Komplexelem = new Komplex[VektorKomplexDim];
for (int i = 0; (i < Achsenzahl1) && (fehler == 0); i++)
{
if (EingabeTyp == "Dezimal")
{
Vektor1Dezimalelem[i] = (Dezimal)VarFeldDaten1.Wert[i];
}
else
{
Vektor1Komplexelem[i] = (Komplex)VarFeldDaten1.Wert[i];
}
}
Komplex[] ErgebnisVektorKomplexWert = new Komplex[Achsenzahl1];
for (int i = 0; i < Achsenzahl1; i++)//nzb
{
ErgebnisVektorKomplexWert[i].Re = DeziWert;
ErgebnisVektorKomplexWert[i].Im = DeziWert;
}
fehler = FunkFourierTransform1Dim(Vektor1Dezimalelem, Vektor1Komplexelem, EingabeTyp, out ErgebnisVektorKomplexWert, Vorwärts, moduli, modulmax, diagnoselok, DA);
//meldung = "Fourier Punkt 4: fehler = " + Convert.ToString(fehler);
//ProtokollSchreiben.WriteLine(meldung);//Test
for (int i = 0; (i < Achsenzahl1) && (fehler == 0); i++)
{
FeldWert.Clear();
FeldWert.Add(ErgebnisVektorKomplexWert[i]);
string ErgebnisNameElem = ErgebnisName + "[" + Convert.ToString(i) + "]";
fehler = VariablenWertSetzen(ErgebnisNameElem, FeldWert);
}
}
else { fehler = 1; }
DA.Close();
}
OBR.SetRechenErfolg(rechenerfolgvor);
}
else
{
fehler = 1;
SystemNavigation(out SystemLokal);
meldung = "Fehler in " + SystemLokal + ": Nur 3 Parameter bei Aufruf der Funktion zulässig; ";
ProtokollSchreiben.WriteLine(meldung);
if (ProgrammDebug == true)
{
if (DebugAnzeigeFrei == true)
{
int Debugfehler = FunktionSystem_DebugInfo("");
DebugAnzeigeFrei = false;
}
}
}
return fehler;
}
private void TestDatenSetzenDezimal(int Vekdim0, int Vekdim1, out Dezimal[,] Matrix1Dezimalelem)//Test
{
bool diagnoselok = false; string status = ""; string statuslok = "";
Dezimal DeziNull = new Dezimal();
DeziNull.Mantisse = 0; DeziNull.Exponent = 0;
BigInteger PImant; int PIexpo;
OBR.Pi(out PImant, out PIexpo, diagnoselok, out statuslok);//Pi lang
BigInteger PiViertelmant; int PiViertelexpo;
BigInteger ymant = 4; int yexpo = 0;
OBR.DivideDez(PImant, PIexpo, ymant, yexpo, out PiViertelmant, out PiViertelexpo, diagnoselok, out statuslok);
status += statuslok;
BigInteger SinPiViertelmant; int SinPiViertelexpo;
int modulilok = 0; int moduljlok = 0; string modulmaxlok = "1";
OBR.Sin(PiViertelmant, PiViertelexpo, out SinPiViertelmant, out SinPiViertelexpo, diagnoselok, modulilok, out moduljlok, modulmaxlok, out statuslok);
status += statuslok;
Dezimal SinPiViertel = new Dezimal();
SinPiViertel.Mantisse = SinPiViertelmant; SinPiViertel.Exponent = SinPiViertelexpo;
BigInteger Amplitudemant = 1; int Amplitudeexpo = 0;
Dezimal Amplitude = new Dezimal();
Amplitude.Mantisse = Amplitudemant; Amplitude.Exponent = Amplitudeexpo;
int Elodim = 8;
Dezimal[] Elongation = new Dezimal[Elodim];
int k = 0;
while (k < Elodim - 3)
{
Elongation[k + 0] = DeziNull;
Elongation[k + 1] = SinPiViertel;
Elongation[k + 2] = Amplitude;
Elongation[k + 3] = SinPiViertel;
SinPiViertel.Mantisse = (-1) * SinPiViertel.Mantisse;
Amplitude.Mantisse = (-1) * Amplitude.Mantisse;
k = k + 4;
}
Matrix1Dezimalelem = new Dezimal[Vekdim0, Vekdim1];
k = 0;
int m; int n;
for (int i = 0; i < Vekdim0; i++)
{
m = k + i;
for (int j = 0; j < Vekdim1; j++)
{
n = m + j;
Matrix1Dezimalelem[i, j] = Elongation[n % Elodim];
}
}
}
private void TestDatenSetzenKomplex(int Vekdim0, int Vekdim1, out Komplex[,] Matrix1Komplexelem)//Test
{
bool diagnoselok = false; string status = ""; string statuslok = "";
Dezimal DeziNull = new Dezimal();
DeziNull.Mantisse = 0; DeziNull.Exponent = 0;
BigInteger PImant; int PIexpo;
OBR.Pi(out PImant, out PIexpo, diagnoselok, out statuslok);//Pi lang
BigInteger PiViertelmant; int PiViertelexpo;
BigInteger ymant = 4; int yexpo = 0;
OBR.DivideDez(PImant, PIexpo, ymant, yexpo, out PiViertelmant, out PiViertelexpo, diagnoselok, out statuslok);
status += statuslok;
BigInteger SinPiViertelmant; int SinPiViertelexpo;
int modulilok = 0; int moduljlok = 0; string modulmaxlok = "1";
OBR.Sin(PiViertelmant, PiViertelexpo, out SinPiViertelmant, out SinPiViertelexpo, diagnoselok, modulilok, out moduljlok, modulmaxlok, out statuslok);
status += statuslok;
Dezimal SinPiViertel = new Dezimal();
SinPiViertel.Mantisse = SinPiViertelmant; SinPiViertel.Exponent = SinPiViertelexpo;
BigInteger Amplitudemant = 1; int Amplitudeexpo = 0;
Dezimal Amplitude = new Dezimal();
Amplitude.Mantisse = Amplitudemant; Amplitude.Exponent = Amplitudeexpo;
int Elodim = 8;
Dezimal[] Elongation = new Dezimal[Elodim];
int k = 0;
while (k < Elodim - 3)
{
Elongation[k + 0] = DeziNull;
Elongation[k + 1] = SinPiViertel;
Elongation[k + 2] = Amplitude;
Elongation[k + 3] = SinPiViertel;
SinPiViertel.Mantisse = (-1) * SinPiViertel.Mantisse;
Amplitude.Mantisse = (-1) * Amplitude.Mantisse;
k = k + 4;
}
Matrix1Komplexelem = new Komplex[Vekdim0, Vekdim1];
k = 0;
int m; int n;
for (int i = 0; i < Vekdim0; i++)
{
m = k + i;
for (int j = 0; j < Vekdim1; j++)
{
n = m + j;
Matrix1Komplexelem[i, j].Re = Elongation[n % Elodim];
Matrix1Komplexelem[i, j].Im = Elongation[n % Elodim];
}
}
}
private int FunkFourierTransform1Dim(Dezimal[] Vektor1Dezimalelem, Komplex[] Vektor1Komplexelem, string EingabeTyp, out Komplex[] ErgebnisVektorKomplexWert, bool Vorwärts, int moduli, string modulmax, bool diagnosevor, DiagnoseAnzeige DA)
{
int fehler = 0;
//Diskrete Fourier-Transformation.
//Feld1, Feld2 und out Feld3 können drei gleichgroße n-dimensionale Vektoren sein, wobei n ganzzahlig > 0 ist.
string SystemLokal; string meldung;
bool diagnoselok = false;
//Versuch: diagnoselok = diagnosevor; //Führt zu Flackern der Anzeige wegen OBR.Cos und OBR.Sin, bei OBR.AddDez, OBR.SubtractDez, OBR.MultiplyDez und OBR.DivideDez wird diagnose nicht benutzt
if (diagnosevor == true)
{
DA.Refresh();
DA.SetDiagnoseAnzeige(1, "Teil " + moduli.ToString() + " / " + modulmax + "; Modul: Math_FourierTransform()");
DA.SetDiagnoseAnzeige(2, "Berechnung wird ausgeführt ...");
DA.SetDiagnoseAnzeige(3, "Fortschritt: 0 %");
}
int Ergebnisdim = 0;
if (EingabeTyp == "Dezimal")
{
Ergebnisdim = Vektor1Dezimalelem.Length;
}
else
{
Ergebnisdim = Vektor1Komplexelem.Length;
}
//meldung = "Fourier1Dim Punkt 1: fehler = " + Convert.ToString(fehler) + ", EingabeTyp = " + EingabeTyp + ", Ergebnisdim = " + Convert.ToString(Ergebnisdim);
//ProtokollSchreiben.WriteLine(meldung);//Test
Dezimal ErgebnisDezimalWert = new Dezimal();
ErgebnisDezimalWert.Mantisse = 0; ErgebnisDezimalWert.Exponent = 0;
ErgebnisVektorKomplexWert = new Komplex[Ergebnisdim];
//Initialisierung bringt (keinen) Geschwindigkeitsvorteil:
//for (int i = 0; i < Ergebnisdim; i++)
//{
// ErgebnisVektorKomplexWert[i].Re = ErgebnisDezimalWert;
// ErgebnisVektorKomplexWert[i].Im = ErgebnisDezimalWert;
//}
BigInteger Remant = 0; int Reexpo = 0;
BigInteger Immant = 0; int Imexpo = 0;
BigInteger xmant = 0; int xexpo = 0;
BigInteger ymant = 0; int yexpo = 0;
BigInteger zmant = 0; int zexpo = 0;
BigInteger umant = 0; int uexpo = 0;
BigInteger vmant = 0; int vexpo = 0;
BigInteger wmant = 0; int wexpo = 0;
BigInteger SignPhiKonstmant = 0; int SignPhiKonstexpo = 0;
Komplex WertKompx;
string status = ""; string statuslok = "";
bool rechenerfolg = OBR.GetRechenErfolg();
if (rechenerfolg != true)
{
fehler = 1;
}
OBR.Pi(out ymant, out yexpo, diagnoselok, out statuslok);//Pi lang
status += statuslok;
xmant = 2; xexpo = 0;
OBR.MultiplyDez(xmant, xexpo, ymant, yexpo, out SignPhiKonstmant, out SignPhiKonstexpo, diagnoselok, out statuslok);
status += statuslok;
ymant = Ergebnisdim; yexpo = 0;
OBR.DivideDez(SignPhiKonstmant, SignPhiKonstexpo, ymant, yexpo, out SignPhiKonstmant, out SignPhiKonstexpo, diagnoselok, out statuslok);
status += statuslok;
if (Vorwärts == true)
{
SignPhiKonstmant = BigInteger.Negate(SignPhiKonstmant);//Signum für Phi im Exponent
}
int modulilok = 0; int moduljlok = 0; string modulmaxlok = "1";
BigInteger SignPhiKonstimant; int SignPhiKonstiexpo;
BigInteger SignPhiKonstijmant; int SignPhiKonstijexpo;
for (int i = 0; (i < Ergebnisdim) && (fehler == 0); i++)
{
ymant = i; yexpo = 0;
OBR.MultiplyDez(SignPhiKonstmant, SignPhiKonstexpo, ymant, yexpo, out SignPhiKonstimant, out SignPhiKonstiexpo, diagnoselok, out statuslok);
status += statuslok;
for (int j = 0; (j < Ergebnisdim) && (fehler == 0); j++)
{
ymant = j; yexpo = 0;
OBR.MultiplyDez(SignPhiKonstimant, SignPhiKonstiexpo, ymant, yexpo, out SignPhiKonstijmant, out SignPhiKonstijexpo, diagnoselok, out statuslok);
status += statuslok;
OBR.Cos(SignPhiKonstijmant, SignPhiKonstijexpo, out ymant, out yexpo, diagnoselok, modulilok, out moduljlok, modulmaxlok, out statuslok);
status += statuslok;
OBR.Sin(SignPhiKonstijmant, SignPhiKonstijexpo, out vmant, out vexpo, diagnoselok, modulilok, out moduljlok, modulmaxlok, out statuslok);
status += statuslok;
if (EingabeTyp == "Dezimal")
{
xmant = Vektor1Dezimalelem[j].Mantisse; xexpo = Vektor1Dezimalelem[j].Exponent;
OBR.MultiplyDez(xmant, xexpo, ymant, yexpo, out zmant, out zexpo, diagnoselok, out statuslok);
status += statuslok;
OBR.MultiplyDez(xmant, xexpo, vmant, vexpo, out wmant, out wexpo, diagnoselok, out statuslok);
status += statuslok;
}
else
{
WertKompx = Vektor1Komplexelem[j];
ErgebnisDezimalWert = WertKompx.Re;
xmant = ErgebnisDezimalWert.Mantisse; xexpo = ErgebnisDezimalWert.Exponent;
ErgebnisDezimalWert = WertKompx.Im;
umant = ErgebnisDezimalWert.Mantisse; uexpo = ErgebnisDezimalWert.Exponent;
fehler = OBR.MultiplyKomplex(xmant, xexpo, umant, uexpo, ymant, yexpo, vmant, vexpo, out zmant, out zexpo, out wmant, out wexpo, diagnoselok, out statuslok);
status += statuslok;
}
OBR.AddDez(Remant, Reexpo, zmant, zexpo, out Remant, out Reexpo, diagnoselok, out statuslok);
status += statuslok;
OBR.Ad