FC_FourierCoefficients - Allgemeine Informationen
Typ |
Funktion |
Verfügbar ab: |
V1.0.3.0 |
Versionen: |
Aktuelle Version |
Berechnung von Fourier-Koeffizienten
Eine periodische Funktion f, die auf einem Intervall [a, b] definiert ist, lässt sich unter geeigneten Voraussetzungen als Fourier-Reihe darstellen:
Die Fourier-Koeffizienten ak und bk sind hierbei gegeben durch:
Die Funktion FC_FourierCoefficients berechnet die oben definierten Fourier-Koeffizienten bis zum Index k = i_diMaxIndex („k-te Harmonische“). Die berechneten Fourier-Koeffizienten werden in Arrays eingetragen, deren Beginn der Funktion über die Zeiger i_plrFourierCoefficientsA (Array für die ak) und i_plrFourierCoefficientsB (Array für die bk) mitgeteilt wird.
Die Funktion f wird durch eine Wertetabelle übergeben. Als Definitionsbereich wird vom Intervall 0,0 ... i_lrXPeriod ausgegangen. i_diNumberOfIntervals enthält die Länge der Wertetabelle (Anzahl der Teilintervalle, in die der Definitionsbereich [0,0, i_lrXPeriod] untergliedert ist).
Die berechneten Fourier-Koeffizienten werden von der Funktion FC_FourierPartialSum verwendet, um endliche Fourier-Teilsummen zu berechnen. Eine mögliche Anwendung ist die Ausblendung höherer Harmonischer (Filterung).
Eingang |
Datentyp |
Beschreibung |
---|---|---|
i_lrXPeriod |
LREAL |
Periode der Funktion / Länge des Definitionsbereichs. |
i_diNumberOfIntervals |
DINT |
Anzahl der Teilintervalle, in die der Definitionsbereich zerlegt wird / Länge der Wertetabelle, die zur Definition der Funktion verwendet wird. |
i_plrFunctionValues |
POINTER TO LREAL |
Zeiger auf den Beginn der Wertetabelle, die die Funktion definiert. |
i_diMaxIndex |
DINT |
Index, bis zu dem die Fourier-Koeffizienten berechnet werden sollen (Vorsicht: Die Arrays, auf die i_plrFourierCoefficientsA und i_plrFourierCoefficientsB zeigen, müssen mindestens i_diMaxIndex Einträge haben). |
i_plrFourierCoefficientsA |
POINTER TO LREAL |
Zeiger auf den Beginn des Arrays, in das die Fourier-Koeffizienten ak eingetragen werden sollen. |
i_plrFourierCoefficientsB |
POINTER TO LREAL |
Zeiger auf den Beginn des Arrays, in das die Fourier-Koeffizienten bk eingetragen werden sollen. |
Ausgang |
Datentyp |
Beschreibung |
---|---|---|
q_etDiag |
Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose. Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung. |
|
q_etDiagExt |
POU-spezifischer, diagnosebezogener Ausgang. q_etDiag = ET_Diag.Ok -> Statusmeldung q_etDiag <> ET_Diag.Ok -> Diagnosemeldung |
q_etDiag |
q_etDiagExt |
Enumerationswert |
Beschreibung |
---|---|---|---|
OK |
0 |
OK |
|
InputParameterInvalid |
61 |
MaxIndex ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
59 |
NumberOfIntervals ist außerhalb des gültigen Bereichs. |
|
InputParameterInvalid |
62 |
Der Zeiger VourierCoefficientsA ist ungültig. |
|
InputParameterInvalid |
63 |
Der Zeiger VourierCoefficientsB ist ungültig. |
|
InputParameterInvalid |
60 |
Der Zeiger FunctionValues ist ungültig. |
|
InputParameterInvalid |
58 |
XPeriod ist außerhalb des gültigen Bereichs. |
(* Berechnen der Fourier-Koeffizienten einer anwenderdefinierten Funktion FC_TestFunction, definiert für das Intervall 0,0 ... 360,0 *)
(* Deklarationen *)
VAR
alrFunctionValues: ARRAY[0..360] of LREAL;
alrFourierCoeffsA: ARRAY[0..100] of LREAL;
alrFourierCoeffsB: ARRAY[0..100] of LREAL;
etDiag: PD_GlobalDiagnostic.ET_Diag;
etDiagExt: PD_PacDriveLib.ET_DiagExt;
END_VAR
(* Vorbereiten der Tabelle mit den Funktionswerten *)
FOR diJ: = 0 TO 359 DO
alrFunctionValues[diJ]: = FC_TestFunction(DINT_TO_LREAL(diJ) + 0.5);
END_FOR
(* Berechnen der Fourier-Koeffizienten *)
FC_FourierCoefficients(
i_lrXPeriod: = 360.0,
i_diNumberOfIntervals: = 360,
i_plrFunctionValues: = ADR(alrFunctionValues[0]),
i_diMaxIndex: = 50,
i_plrFourierCoefficientsA: = ADR(alrFourierCoeffsA[0]),
i_plrFourierCoefficientsB: = ADR(alrFourierCoeffsB[0]),
q_etDiag => etDiag,
q_etDiagExt => etDiagExt);
(* Die Fourier-Koeffizienten bis zur 50. Harmonischen wurden jetzt berechnet und in die Arrays alrFourierCoeffsA[] und alrFourierCoeffsB[] kopiert. *)
Enumerationsname: |
MaxIndexRange |
Enumerationswert: |
61 |
Beschreibung: |
MaxIndex ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_diMaxIndex wurde ein ungültiger Wert angelegt. |
Dem Eingang i_diMaxIndex muss ein Wert größer oder gleich 1 übergeben werden. |
Enumerationsname: |
NumberOfIntervalsRange |
Enumerationswert: |
59 |
Beschreibung: |
NumberOfIntervals ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_diNumberOfIntervals wurde ein ungültiger Wert angelegt. |
Dem Eingang i_diNumberOfIntervals muss ein Wert größer oder gleich 2 übergeben werden. |
Enumerationsname: |
Ok |
Enumerationswert: |
0 |
Beschreibung: |
OK |
Die Koeffizienten wurden erfolgreich berechnet.
PointerFourierCoefficientsAInvalid
Enumerationsname: |
PointerFourierCoefficientsAInvalid |
Enumerationswert: |
62 |
Beschreibung: |
Der Zeiger VourierCoefficientsA ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_plrFourierCoefficientsA wurde ein ungültiger Wert angelegt. |
Dem Eingang i_plrFourierCoefficientsA, muss ein Wert ungleich 0 übergeben werden. |
PointerFourierCoefficientsBInvalid
Enumerationsname: |
PointerFourierCoefficientsBInvalid |
Enumerationswert: |
63 |
Beschreibung: |
Der Zeiger VourierCoefficientsB ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_plrFourierCoefficientsB wurde ein ungültiger Wert angelegt. |
Dem Eingang i_plrFourierCoefficientsB muss ein Wert ungleich 0 übergeben werden. |
Enumerationsname: |
PointerFunctionValuesInvalid |
Enumerationswert: |
60 |
Beschreibung: |
Der Zeiger FunctionValues ist ungültig. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_plrFunctionValues wurde ein Nullzeiger übergeben. |
Dem Eingang i_plrFunctionValues muss die Addresse des Speichers übergeben werden, in dem die Wertetabelle liegt. |
Enumerationsname: |
XPeriodRange |
Enumerationswert: |
58 |
Beschreibung: |
XPeriod ist außerhalb des gültigen Bereichs. |
Problem |
Ursache |
Lösung |
---|---|---|
- |
Am Eingang i_lrXPeriodGc_lrZeroTolerance wurde eine Zahl kleiner angelegt. |
i_lrXPeriod muss größer sein als 0. |