Schwingungs-/Frequenz-Anlayse

Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, hauptsache du weisst was du letzlich willst, weil weiter im Thread hat es wieder anders geklungen:

Mittlerweile, nachdem ich mich in die Fourier-Analyse, die PeterEF mir genannt hat, mal eingelesen habe, bin ich gar nicht mehr sicher, dass viele Werte der Weisheit letzter Schluss sind. Warscheinlich reichen 100 Messungen / Sekunde auch noch aus. Mein Problem ist im Augenblick tatsächlich die Umsetzung der FFT (schnelle Fourier-Transformation) in eine für mich verständliche Formel. Es gibt dazu zwar im Internet viel zu Lesen, aber (leider) nichts konkretes.


 
...
schön, dass du mich darauf hinweisst ...
Leider ist es aber auch gar nicht mein Problem (im Augenblick). Darüber hinaus hat die Fourier-Transformation (im ersten Moment) gar nichts mit der Signal-Abtastung zu tun. Es werden Misch-Frequenzen auseinander-gefiltert. Leider haber ich da vorhin nicht schnell genug geschaltet.

Mal sehen, wie es weiter geht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
schön, dass du mich darauf hinweisst ...
Leider ist es aber auch gar nicht mein Problem (im Augenblick). Darüber hinaus hat die Fourier-Transformation (im ersten Moment) gar nichts mit der Signal-Abtastung zu tun. Es werden Misch-Frequenzen auseinander-gefiltert.

Naja - doch: wenn Du vermutest, das dein Mischsignal u.a. ein Signal mit der Frequenz 60 Hz enthält, solltest Du schon mit 120 Hz abtasten, um das auch mitzukriegen.

Ich bin unter Staub und Spinnweben fündig geworden:
K.D.Kammeyer / K.Kroschel: "Digitale Signalverarbeitung - Filterung und Spektralanalyse" ; Teubner Studienbücher Elektrotechnik ; Stuttgart 1989 ; ISBN 3-519-06122-8 ; hier besonders die Seiten 166ff.

Falls das Buch in der Bibliothek Deines Vertrauens nicht vorrätig ist, kann ich heute abend mal den Scanner anschmeißen, oder läufts schon?

Schönen Tag!
 
Hallo Peter,
Das Buch ist in der "BmV" nicht vorhanden.
Wenn du da ein paar brauchbare Sachen hast, dann bin ich immer noch interessiert. Ich bin mit meinem Puzzle zwar schon etwas weiter, aber der Durchbruch fehlt noch.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit Hilfe der folgenden Formeln kann man die Fourier-Koeffizienten einer reellen periodischen Zeitfunktion und die entsprechenden Frequenzanteile des Amplituden und Phasenspektrums berechnen. Eine Periode der Funktion ist dabei durch eine beliebig vorgebbare gerade oder ungerade Zahl äquidistanter Stützstellen definiert.

Gruß Kai
 

Anhänge

  • Fourier-Koeffizienten.pdf
    6,4 KB · Aufrufe: 121
... geschafft ...

...
noch kurz vor Weihnachten :
Dank reger Beteiligung an diesem Thread von :
Zotos . IBN-Service und PeterEF ist es mir gelungen auf Excel-Basis einen ersten Ansatz zu dem genannten Thema zu erstellen. Wie ich allen versprochen habe, werde ich nun zunächst mal dieses Werk für alle, die Interesse haben (und das waren ja nun doch schon einige gewesen) hier einstellen.

Ich hoffe natürlich auf weitere Beteiligung au dem Thema. Auch Kai hat mir schon einen Beitrag zu dem Thema "angedroht" ...
Ich bin einmal gespannt, was daraus noch wird ...

Wie auch immer, allen Beteiligten an diesem Thread (und natürlich auch allen anderen) ein schönes Weihnachtsfest.

Gruß
LL
 
Hier nun ein Programmbeispiel für die DFT Diskrete Fourier-Transformation:

DFT DISKRETE FOURIER-TRANSFORMATION

Aus den Werten einer periodischen Zeitfunktion werden die Fourier-Koeffizienten AK und BK und die entsprechenden Frequenzanteile des Amplitudenspektrums CK und des Phasenspektrums PK berechnet.

Die Periode der Funktion ist durch eine beliebig vorgebbare gerade oder ungerade Zahl äquidistanter Stützstellen N vorgeben.

Code:
FUNCTION FC200 : VOID
TITLE = 'DFT Diskrete Fourier-Transormation'
 
//**************************************************
//DFT DISKRETE FOURIER-TRANSFORMATION
//
//Aus den Werten einer periodischen Zeitfunktion
//werden die Fourier-Koeffizienten AK und BK und
//die entsprechenden Frequenzanteile des 
//Amplitudenspektrums CK und des Phasenspektrums PK
//berechnet.
//
//Die Periode der Funktion ist durch eine beliebig
//vorgebbare gerade oder ungerade Zahl äquidistanter
//Stützstellen N vorgeben.
//**************************************************
 
NAME    : FOURIER
FAMILY  : SPSFORUM
AUTHOR  : KAI
VERSION : '1.0'
 
VAR_INPUT
    Y     : ARRAY[0..400] OF REAL;    // Werte Y
    N     : INT;                      // Anzahl Intervalle
    FK    : INT;                      // Anzahl Fourier-Koeffizienten
END_VAR
 
VAR_OUTPUT
    CK    : ARRAY[0..200] OF REAL;    // Amplitudenspektrum CK
    PK    : ARRAY[0..200] OF REAL;    // Phasenspektrum PK
END_VAR
 
VAR_TEMP
    AK    : REAL;                     // Fourier-Koeffizient AK
    BK    : REAL;                     // Fourier-Koeffizient BK
    PI    : REAL;                     // Pi
    FKMAX : INT;                      // Maximale Anzahl Fourier-Koeffizienten
    K     : INT;                      // Schleifenzähler
    J     : INT;                      // Schleifenzähler
    S     : INT;                      // Vorzeichen
END_VAR
 
BEGIN
 
//**************************************************
//Initialisierung
//**************************************************
 
PI := 3.14159265;
 
FOR K := 0 TO 200 DO
    CK[K] := 0;
    PK[K] := 0;
END_FOR;
 
//**************************************************
//Maximale Anzahl Fourier-Koeffizienten FKMAX
//**************************************************
 
FKMAX := DINT_TO_INT(ROUND(N/2));
 
IF FK < FKMAX THEN
    FKMAX := FK;
END_IF;
 
//**************************************************
//Fourier-Koeffizienten CK, PK
//**************************************************
 
FOR K := 1 TO FKMAX DO
    AK    := 0;
    BK    := 0;
    FOR J := 0 TO (N-1) DO
        AK := AK + Y[J]*COS(2*PI/N*K*J);
        BK := BK + Y[J]*SIN(2*PI/N*K*J);
    END_FOR;
    AK := AK*2/N;
    BK := BK*2/N;
    CK[K] := SQRT(SQR(AK) + SQR(BK));
    PK[K] := ATAN(BK/AK);
END_FOR;
 
//**************************************************
//Fourier-Koeffizient C0
//**************************************************
 
K  := 0;
AK := 0;
 
FOR J := 0 TO (N-1) DO
    AK := AK + Y[J];
END_FOR;
 
AK    := AK/N;
CK[K] := AK;
 
//**************************************************
//Fourier-Koeffizient CMAX
//**************************************************
 
IF FKMAX = (N/2) THEN
    AK := 0;
    S  := -1;
    FOR J := 0 TO (N-1) DO
        S  := -S;
        AK := AK + S*Y[J];
    END_FOR;
END_IF;
 
AK        := AK/N; 
CK[FKMAX] := AK;  
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,5 KB · Aufrufe: 62
  • FC200.pdf
    10,9 KB · Aufrufe: 63
  • Fourier.zip
    41,6 KB · Aufrufe: 57
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Anwendung der DFT Diskreten Fourier-Transformation auf die Funktion aus dem EXCEL-Beispiel von Larry Laffer zeigt eine sehr gute Übereinstimmung im Amplitudenspektrum CK.

F1 = 1 Hz => M1 = 1,00 Nm

F2 = 10 Hz => M2 = 3,00 Nm

F3 = 15 Hz => M3 = 3,00 Nm

F4 = 75 Hz => M4 = 1,00 Nm
Gruß Kai
 

Anhänge

  • FOURIER_1.jpg
    FOURIER_1.jpg
    338 KB · Aufrufe: 82
  • FOURIER_2.jpg
    FOURIER_2.jpg
    358,8 KB · Aufrufe: 63
  • EXCEL_1.jpg
    EXCEL_1.jpg
    139 KB · Aufrufe: 63
  • EXCEL_2.jpg
    EXCEL_2.jpg
    102,4 KB · Aufrufe: 60
Hallo Kai,
dein SCL-Beispiel zur DFT habe ich mir sofort einmal heruntergeladen.
Über die DFT bin ich auch häufig "gestolpert", habe im Internet aber nirgends ein für mich verständliches Beispiel gefunden. Danke also, dass du mich um die Geschichte nun auch bereichert hast. Ich werde das gleich mal in Excel umsetzen.

Gibt es deiner Ansicht nach zwischen der FFT und der DFT hinsichtlich Genauigkeit oder Ähnlichem größere Unterschiede ?

Ich danke dir in jedem Fall für deinen Beitrag. Er war, wie alle anderen deiner Beiträge, die ich bislang so begutachten durfte, wieder wie nicht anders gewohnt. große Klasse.

Gruß
LL
 
@Kai:
ich habe jetzt anlehnend an dein SCL-Script die ganze Geschichte noch mal in Excel-VBA nachvollzogen. In dem Zusammenhang gleich eine Frage:
Worin besteht der wesentliche Unterschied zwischen den biden Variablen "N" und "FK", da sie doch anscheinend den gleichen Wert haben müssen ?
...
Und noch etwas: Da du das Ganze ja als SPS-Programm erstellt hast ... Kannst du Aussagen zur Abarbeitungszeit des Bausteins machen bei z.B. 512 Quell-Variablen ? Selber bin ich noch nicht soweit und das wirdauch bestimmt vor Ende nächster Woche noch nichts werden ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es deiner Ansicht nach zwischen der FFT und der DFT hinsichtlich Genauigkeit oder Ähnlichem größere Unterschiede ?

So genau weiß ich das auch nicht, ich denke aber, dass die Unterschiede zwischen der DFT und der FFT hinsichtlich der Genauigkeit eher gering sind.

Ansonsten hat jede Berechnungsmethode ihre Vor- und Nachteile:

Die DFT hat gegenüber der FFT den Vorteil, dass bei der DFT die Anzahl der Abtastpunkte des Signals beliebig sein kann, während bei der FFT die Anzahl der Abtastpunkte einer Zweierpotenz entsprechen muss, also 1, 2, 4, 8, 16, 32 usw.

Dafür ist die FFT bei der Berechnung der Werte der Fourier-Transformation um einiges schneller als die DFT und sollte bei größeren Datenmengen eher angewendet werden.

Ich danke dir in jedem Fall für deinen Beitrag. Er war, wie alle anderen deiner Beiträge, die ich bislang so begutachten durfte, wieder wie nicht anders gewohnt, große Klasse.

Danke schön. :-D

Gruß Kai
 
Worin besteht der wesentliche Unterschied zwischen den biden Variablen "N" und "FK", da sie doch anscheinend den gleichen Wert haben müssen ?

Es gilt folgendes:

DFT:

N = Anzahl Datenpunkte (Abtastpunkte)

FK = Anzahl Fourier-Koeffizienten

FKMAX = INT(N/2) = Maximale Anzahl Fourier-Koeffizienten

FK <= FKMAX
Mit N gibt man also vor, wie viele Messwerte man hat, und mit FK gibt man vor, wie viele Fourier-Koeffizienten berechnet werden sollen. FK muss dabei <= FKMAX sein.

Beispiel:

N = 256 Datenpunkte

FKMAX = 128 Fourier-Koeffizienten

FK = 50 => Es werden die ersten 50 Fourier-Koeffizienten berechnet

FK = 100 => Es werden die ersten 100 Fourier-Koeffizienten berechnet

Und noch etwas: Da du das Ganze ja als SPS-Programm erstellt hast ... Kannst du Aussagen zur Abarbeitungszeit des Bausteins machen bei z.B. 512 Quell-Variablen ?

Was für eine CPU willst Du denn einsetzen?

Gruß Kai
 
Hallo Kai,
Danke für die Erläuterung. "N" für Anzahl war schon klar gewesen, "FK" eben nicht. Ich hatte erst der Vermutung aufgesessen, dass es Wiederholungen sein könnten, aber das hatte dann ja auch nicht gefunzt. Jetzt ist es klar ...

Als CPU stelle ich mir eine 317 vor. Ich denke, die kriegt das hin. Würde mich halt nur mal interessieren, wie lang ein Zyklus wird, wenn der Baustein läuft. Hintergrund :
von PeterEF: Wir haben mal sowas mit einer 300er gemacht, aber das ganze ist sehr rechenintensiv und der Kunde hat sich dann für eine Lösung auf einem abgesetzten PC entschieden, damit die SPS noch zu ihrer eigentlichen Aufgabe kam.
Ein hoch-Puschen der Zykluszeit über 750 ms hinaus würde mich nicht so sehr schocken, da es ja nicht ständig wäre. Außerdem habe ich noch einen anderen netten Auswerte-Baustein in einer anderen Anwendung, der das auch kann ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Als CPU stelle ich mir eine 317 vor. Ich denke, die kriegt das hin. Würde mich halt nur mal interessieren, wie lang ein Zyklus wird, wenn der Baustein läuft.
...
Ein hoch-Puschen der Zykluszeit über 750 ms hinaus würde mich nicht so sehr schocken, da es ja nicht ständig wäre.
...

Das mit der Zykluszeit erinnert mich an die Aufgabenstellung von Steve81. Auch hier würde ich, bevor die Zykluszeit aus dem Ruder läuft, den Algorithmus auf mehrere SPS-Zyklen Aufteilen.
Der Code von Kai lässt sich ja recht einfach in Sequenzen aufteilen die man mit einer Case Verzweigung ansteuern kann. Auch die Schleifen kann man auf mehrere SPS-Zyklen verteilen.
Natürlich müssen die Variablen statisch sein.

Hier mal der Code wie das aussehen könnte:
Code:
//**************************************************
//DFT DISKRETE FOURIER-TRANSFORMATION
//
//Aus den Werten einer periodischen Zeitfunktion
//werden die Fourier-Koeffizienten AK und BK und
//die entsprechenden Frequenzanteile des 
//Amplitudenspektrums CK und des Phasenspektrums PK
//berechnet.
//
//Die Periode der Funktion ist durch eine beliebig
//vorgebbare gerade oder ungerade Zahl äquidistanter
//Stützstellen N vorgeben.
//**************************************************
 
NAME    : FOURIER
FAMILY  : SPSFORUM
AUTHOR  : KAI
VERSION : '1.0'
 
VAR_INPUT
    START : BOOL;    
    Y     : ARRAY[0..400] OF REAL;    // Werte Y
    N     : INT;                      // Anzahl Intervalle
    FK    : INT;                      // Anzahl Fourier-Koeffizienten
END_VAR
 
VAR_OUTPUT
    CK    : ARRAY[0..200] OF REAL;    // Amplitudenspektrum CK
    PK    : ARRAY[0..200] OF REAL;    // Phasenspektrum PK
    BUSY  : BOOL;                     // Algorithmus läuft            
END_VAR
 
VAR
    AK    : REAL;                     // Fourier-Koeffizient AK
    BK    : REAL;                     // Fourier-Koeffizient BK
    PI    : REAL;                     // Pi
    FKMAX : INT;                      // Maximale Anzahl Fourier-Koeffizienten
    K     : INT;                      // Schleifenzähler
    J     : INT;                      // Schleifenzähler
    S     : INT;                      // Vorzeichen
    STEP  : INT;                      // Sequenser
    CYCLE : INT;                      // Wiederholungen im SPS-Zyklus
    PULSE : BOOL;                     // Sequenser takten
END_VAR
 
BEGIN

//**************************************************
//PULSE & CYCLE
//************************************************** 
IF PULSE THEN
  STEP := STEP + 1;
END_IF;

CYCLE := 0; // Neuer SPS Zyklus


CASE STEP OF 
0:; //**************************************************
    //Start
    //************************************************** 
      BUSY := START;
      PULSE := START;
      
1:; //**************************************************
    //Initialisierung
    //**************************************************         
    IF PULSE THEN
      PI := 3.14159265;
      K  := 0;
      PULSE := FALSE;
    ELSE    
      WHILE CYCLE < 50 AND NOT PULSE DO 
        CK[K] := 0;
        PK[K] := 0;


        CYCLE := CYCLE + 1;
        PULSE := K >= 200;
        K  := K + 1;        
      END_WHILE;
    END_IF; 
2:; //**************************************************
    //Maximale Anzahl Fourier-Koeffizienten FKMAX
    //************************************************** 
    FKMAX := DINT_TO_INT(ROUND(N/2));
 
    IF FK < FKMAX THEN
        FKMAX := FK;
    END_IF;
 
3:; //**************************************************
    //Fourier-Koeffizienten CK, PK
    //************************************************** 
    IF PULSE THEN
      K  := 1;
      PULSE := FALSE;
    ELSE    
      WHILE CYCLE < 10 AND NOT PULSE DO 
        AK    := 0;
        BK    := 0;
        FOR J := 0 TO (N-1) DO
            AK := AK + Y[J]*COS(2*PI/N*K*J);
            BK := BK + Y[J]*SIN(2*PI/N*K*J);
        END_FOR;
        AK := AK*2/N;
        BK := BK*2/N;
        CK[K] := SQRT(SQR(AK) + SQR(BK));
        PK[K] := ATAN(BK/AK);

  
        CYCLE := CYCLE + 1;
        PULSE := K >= FKMAX;
        K  := K + 1;              
      END_WHILE;
    END_IF;
    
4:; //**************************************************
    //Fourier-Koeffizient C0
    //************************************************** 
    IF PULSE THEN
      K  := 0;
      AK := 0;
      J  := 0;
      PULSE := FALSE;
    ELSE    
      WHILE CYCLE < 40 AND NOT PULSE DO 
        AK := AK + Y[J];

        CYCLE := CYCLE + 1;
        PULSE := J >= N-1;
        J  := J + 1;                
      END_WHILE;
    END_IF; 
    IF J >= N-1 THEN      
      AK    := AK/N;
      CK[K] := AK;
    END_IF;
 
5:; //**************************************************
    //Fourier-Koeffizient CMAX
    //************************************************** 
    IF FKMAX = (N/2) THEN
      AK := 0;
      S  := -1;
      FOR J := 0 TO (N-1) DO
          S  := -S;
          AK := AK + S*Y[J];
      END_FOR;
    END_IF;
 
    AK        := AK/N; 
    CK[FKMAX] := AK;  

6:; //**************************************************
    //Ende der Show
    //************************************************** 
    STEP  := 0;
    CYCLE := 0;
    PULSE := FALSE;
    BUSY  := FALSE;
ELSE
  //Fehler********************************************** 
  STEP  := 0;
  CYCLE := 0;
  PULSE := FALSE;
  BUSY  := FALSE;  
END_CASE;
 
END_FUNCTION_BLOCK
Man sollte noch sicherstellen das sich die Eingangsvariablen nicht ändern solange der FB Busy ausgibt bzw. bei der Initialisierung das ganze in den STAT Bereich sichern.
 
Zuletzt bearbeitet:
Danke für den Vorschlag. Hatte ich auch schon erwogen, aber dann auch wieder verworfen. Selbst wenn die Zykluszeit in dem Auswerte-Zyklus extrem ansteigt wird sie sich in meinem Restprogramm auf die dann laufenden Aktionen nur wie eine zusätzliche (aber unnötige) Nachlaufzeit auswirken. Die Station, die diese Analyse machen wird, muss wie alle anderen Stationen meiner Anlage, von denen die meißten gleichzeitig laufen, fertig sein, damit es weitergehen kann.

Aber erstmal muss es jetzt diese Station überhaupt geben ...
 
und wie versprochen noch nachgereicht :

Ich habe nun (gezwungenermaßen) Versuche mit meinen beiden Auswertungs-Bausteinen gemacht. Dabei kam folgendes heraus :

CPU 317

DFT-Analyse - 256 Werte aufgezeichnet - Zeitbedarf Auswertung : 2,3 s
DFT-Analyse - 512 Werte aufgezeichnet - Zeitbedarf Auswertung : > 5 s

FFT-Analyse - 256 Werte aufgezeichnet - Zeitbedarf Auswertung : 0,12 s
FFT-Analyse - 512 Werte aufgezeichnet - Zeitbedarf Auswertung : 0,25 s
FFT-Analyse 1024 Werte aufgezeichnet - Zeitbedarf Auswertung : 0,51 s

somit macht die FFT-Analyse für mich das Rennen. Mit der DFT-Analyse ist der Code zwar kompakter und es wäre eigentlich mein Favourit gewesen, aber die Dauer ist hier das entscheidende.

Fall sich also für den einen oder anderen dieses Problem stellt, so sei hier gesagt, dass es mit hinreichender Genauigkeit möglich ist, mittels der SPS diese Auswertung durchzuführen.

Ich möchte auf diesem Weg nochmals allen meinen Dank sagen, die mir hier "aufs Pferd geholfen haben".

Gruß
LL
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
weiterer Nachtrag :
Ich habe die Abfrage-Rate der Messung auf 3 ms festgelegt. Damit lassen sich mit gute Wiederholgenauigkeit Einzel-Frequenzen bis 120 Hz sicher feststellen und im Pegel nachweisen.
Zur Messung verwende ich aktuell einen Piezo-Schwingungssensor.
 
Hallo LL,

200 Messungen pro Sekunden erfordern aber nicht nur ne leistungsfähige
SPS sondern auch recht schnelle Analogeingänge...

Als Beispiel:
Eine "Billig" 8 - Kanal AE für die 300er hat ne Grundwandlungszeit von ca. 30ms
pro Kanal. Damit wärst du bei max. 33 Messungen / Sekunde.

Ich habe mal mit ner 300er und nem schnellen internen Analogeingang
im 1ms - Alarm ca. 1000 Messungen pro Sekunde geschafft.

Allerdings ging das mit nur einem Kanal, und die SPS (314C-2DP) war
absolut am Ende, sporadisch sprach der Weckalarm an.

Und dabei hatte die SPS sonst nichts zu tun...

Ich musste dann die Abtastrate auf 500 Hz verringern (2ms Alarm).

CU

Jürgen

.

Sorry, ist jetzt etwas aus der Vergangenheit des Threads herausgeholt:
Für das "schneller Analog Eingang"-Problem gibt es im S7 Bereich eine Lösung:

bis zu 8 Kanäle Abtasten alle 25µs (40kHz) mit Zwischenspeicherung im Modul und Abholen nach Bedarf (reicht z.B. alle 4 ms)!
Auch mit Triggerfunktion einsetzbar.
 
Zurück
Oben