Berechnung einzelner Spektralwerte
Dieses Beispiel implementiert exemplarisch die Verwendungsmöglichkeiten des Funktionsbausteins FB_CMA_SparseSpectrum. Es werden verschiedene Fensterfunktionen und Skalierungen für die möglichen Berechnungen von DFT-, Magnituden- und Power-Werten vorgestellt. Numerische Effekte bei der Detektion werden in zwei Frequenzanteilen eines generierten Signals aufgezeigt: Die erste Frequenz entspricht einem Vielfachen der numerischen Auflösung im Spektralbereich, die Zweite liegt zwischen zwei solcher Werte.
Den Quellcode für das Beispiel können Sie hier herunterladen: SparseSpectrum_Sample.zip
Blockdiagramm
Programmparameter
Die Tabelle unten zeigt eine Liste mit den wichtigen Parametern für die Konfiguration der Funktionsbausteine.
FFT-Länge | 2048 / 2048 / 2048 |
Fenstergröße | 2048 / 2048 / 2048 |
Puffergröße | 2048 / 1024 / 1024 |
Fenster Typ | eCM_RectangularWindow / eCM_HannWindow / eCM_HannWindow |
Spaklierungsart | eCM_NoScaling / eCM_PeakAmplitude / eCM_PeakAmplitude |
Typ der Spektralwerte | eCM_DFT / eCM_Magnitude / eCM_Power |
Konfiguration der Frequenzbänder
In der GVL_Constants werden die zentralen Parameter für die Initialisierung des Algorithmus sowie die Eigenschaften des generierten Signals definiert.
VAR_GLOBAL CONSTANT
cSampleRate : LREAL := 10000; // Sample rate of input signal.
cWindowLength : UDINT := 2048; // Internal buffer size with 50% overlapping
cResolution : LREAL := cSamplerate / cWindowLength; // Frequency resolution
cBands : UDINT := 2; // Number of bands
cSetFrequency : ARRAY[1..cBands] OF LREAL := [ 41*cResolution, 413 ]; // Frequency in Hz; [ exact, intermediate ]
cSetAmplitude : ARRAY[1..cBands] OF LREAL := [ 1.0, 2.0 ]; // Peak amplitudes of sine signals
cBandWidth : UDINT := 5; // Computed bins per frequency.
cDFTBins : UDINT := cBandWidth * cBands; // Number of spectral bins, cBandWidth bins per frequency
END_VAR
Das generierte Signal (MAIN.aBuffer
) besteht aus zwei Frequenzkomponenten. Eine ist bezüglich der numerischen Auflösung gewählt, d.h. sie ist ein Vielfaches von f = 10000 Hz/2048 = 4,8828125 Hz.
Die zweite ist so gewählt, dass der Peak zwischen zwei Spektralwerten liegt und somit nicht exakt dargestellt werden kann. Um die numerischen Effekte veranschaulichen zu können, werden um die jeweiligen gesuchten Spektralwerte weitere vier Werte berechnet. Die Konfiguration erfolgt in der MAIN_CM
.
// Compute parameters, adjust if cDFTBins is changed.
FOR i := 1 TO cBands DO
k := LREAL_TO_DINT(cSetFrequency[i] / cResolution);
aDFTBins[(i-1) * cBandWidth + 1] := DINT_TO_UDINT(MAX(k-2,1));
aDFTBins[(i-1) * cBandWidth + 2] := DINT_TO_UDINT(MAX(k-1,1));
aDFTBins[(i-1) * cBandWidth + 3] := DINT_TO_UDINT(MIN(k+0,nyquist));
aDFTBins[(i-1) * cBandWidth + 4] := DINT_TO_UDINT(MIN(k+1,nyquist));
aDFTBins[(i-1) * cBandWidth + 5] := DINT_TO_UDINT(MIN(k+2,nyquist));
END_FOR
Visualisierung der Ergebnisse
Das Beispiel beinhaltet ein umfangreiches TwinCAT Measurement Projekt, in dem die berechneten Spektralwerte aus dem Baustein FB_CMA_SparseSpectrum den Referenzalgorithmen (FB_CMA_RealFFT, FB_CMA_MagnitudeSpectrum, FB_CMA_PowerSpectrum) gegenübergestellt sind. Es wird der Unterschied zwischen einer Anregung als vielfaches der numerischen Frequenzauflösung und einem Wert zwischen zwei solcher Werte verdeutlicht. Die visualisierten Frequenzbänder können als „Zoom“ auf den entspechenden Bereich angesehen werden.
Die folgenden Abbildungen zeigen die Ergebnisse für die Gegenüberstellung zu den Bausteinen FB_CMA_RealFFT und FB_CMA_MagnitudeSpectrum.
Spektrum des FB_RealFFT (oben) sowie die Spektralwerte der Bänder 1 (mitte) und 2 (unten).
Magnituden Spektrum des Bausteins FB_MagnitudeSpectrum (oben) sowie die Spektralwerte der Bänder 1 (mitte) und 2 (unten).
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS-Bibliotheken |
---|---|---|
TwinCAT v3.1.4022.25 | PC or CX (x86, x64) | Tc3_CM, Tc3_CM_Base, Tc3_MultiArray |