FC_FourierCoefficients

 

FC_FourierCoefficients - Allgemeine Informationen

Übersicht

Typ

Funktion

Verfügbar ab:

V1.0.3.0

Versionen:

Aktuelle Version

Aufgabe

Berechnung von Fourier-Koeffizienten

Beschreibung

Eine periodische Funktion f, die auf einem Intervall [a, b] definiert ist, lässt sich unter geeigneten Voraussetzungen als Fourier-Reihe darstellen:

G-SE-0068553.1.gif-high.gif

 

 

G-SE-0068554.1.gif-high.gif

 

 

Die Fourier-Koeffizienten ak und bk sind hierbei gegeben durch:

G-SE-0068555.1.gif-high.gif

 

 

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_plrFourierCoef­ficientsA (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).

Schnittstelle

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

GD.ET_Diag

Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose.

Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung.

q_etDiagExt

ET_DiagExt

POU-spezifischer, diagnosebezogener Ausgang.

q_etDiag = ET_Diag.Ok -> Statusmeldung

q_etDiag <> ET_Diag.Ok -> Diagnosemeldung

Diagnosemeldungen

q_etDiag

q_etDiagExt

Enumerationswert

Beschreibung

OK

Ok

0

OK

InputParameterInvalid

MaxIndexRange

61

MaxIndex ist außerhalb des gültigen Bereichs.

InputParameterInvalid

NumberOfIntervalsRange

59

NumberOfIntervals ist außerhalb des gültigen Bereichs.

InputParameterInvalid

PointerFourierCoefficientsAInvalid

62

Der Zeiger VourierCoefficientsA ist ungültig.

InputParameterInvalid

PointerFourierCoefficientsBInvalid

63

Der Zeiger VourierCoefficientsB ist ungültig.

InputParameterInvalid

PointerFunctionValuesInvalid

60

Der Zeiger FunctionValues ist ungültig.

InputParameterInvalid

XPeriodRange

58

XPeriod ist außerhalb des gültigen Bereichs.

Beispiel

(* 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. *)

MaxIndexRange

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.

NumberOfIntervalsRange

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.

Ok

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.

PointerFunctionValuesInvalid

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.

XPeriodRange

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.