WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Inverse FFT

 

djanski
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 11:14     Titel: Inverse FFT
  Antworten mit Zitat      
Guten Morgen zusammen,

Ich möchte gerne eine inverse FFT durchführen was ja grundsätzlich mit der funktion:
Code:

gemacht wird. Jedoch erhalte nicht das Zeitsignal, wenn ich zur berechnung der FFT andere Rechenoperationen mit aufgenommen habe (wie sollte ich auch).
Bsp.:
Code:

FFT_x = (abs(fft(x))*2/x_laenge)/sqrt(2);
 

Meine Frage is jetzt, wie ich trotz der verwendeten Rechenoperationen wieder auf das Zeitsignal komme. Kann mir wer dabei helfen oder ist das nicht mehr möglich?

Vielen Dank!

MfG
djanski
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 17.06.2011, 12:03     Titel:
  Antworten mit Zitat      
Im Prinzip einfach nach x die FFT Zeile umstellen

Code:
x = ifft(FFT_x*sqrt(2)*x_laenge/2);


allerdings kommt nicht das ursprüngliche Zeitsignal wegen dem Befehl abs raus Wink. Dein Vorzeichen geht hier verloren...oder ist x komplex?
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 12:39     Titel:
  Antworten mit Zitat      
DSP hat recht. Die Fourier Transformation ist prinzipiell eine komplexe Transformation. Wenn du nun den Absolutwert berechnest, dann kannst du hieraus meines Wissens ohne zusätzliche Informationen (z.B. die Phase) nicht einfach so wieder auf das ursprüngliche Signal zurück rechnen (zumindest allgemein; es gibt jedoch natürlich auch Funktionen, die im Fourier-Bereich keinen komplexen Anteil haben und nur positiv sind, hier würde es funktionieren).
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 13:18     Titel:
  Antworten mit Zitat      
hmmm...ok. Jetzt habe ich von einem Bekannten eine etwas komplexere Funktion bekommen, welche mir bei Vorgabe des Zeitsignals und des äquidistanten Zeitvektors sowohl den Frequenzvektor und die Amplituden als auch die Phase berechnet. Besonders schön ist, dass Probleme bei der Amplitudenberechnung berücksichtigt werden, die auftreten, wenn die Messzeit kein vielfaches der Periodendauer sind Smile.
Wenn ich dich (Ajax) jetzt richtig verstanden habe müsste ich mit diesen Informationen die inverse FFT berechnen können oder?

Hier mal der Code zu der Funktion und ein .m-file Beispiel um zu veranschaulichen, was dabei passieren soll:

Code:

function [f spec phase]=myFFT(t,x,varargin)
%% function [f spec phase]=myFFT(t,x,varargin)
%  berechnet die amplitudentreuen, reellen Parameter einer FFT nach Betrag
%  und Phase basierend auf der ursprünglichen funktion 'fft.m'.
%  Ausserdem wird der zugehörige Frequenzvektor aus dem Zeitvektor
%  berechnet.
%  Amplitudentreue soll hier so verstanden werden, das ein Signal im
%  Zeitbereich x=A*cos(2*pi*f*t) als Peak der Amplitude A im Spektrum
%  abgelesen werden kann, sofern keine Artefakte durch Abtastung entstehen.
%
%  Notwendige Parameter:
%    t - eingehender (äquidistanter) Zeit-Vektor
%    x - Amplitude im Zeitbereich
%  Optionaler Parameter:
%  fensterString - Fenster zur Gewichtung im Zeitbereich.
%                  Es können alle Fenster der Signal-Processing Toolbox
%                  verwendet werden.
%                  Sollte dies nicht vorhanden sein, können drei als
%                  Sub-Funktion implementierte Fenster verwendet werden
%                  'myHann', 'myHamming','myFlattopWin'
%                  Wird kein Fenster angegeben, wird ein Rechteck-Fenster
%                  verwendet
%  Ausgangsgrößen:
%  f - enthält den Frequenz-Vektor. Die Länge beträgt length(t)/2 für gerade
%      Anzahl, sonst (length(t)-1)/2
%  spec - Betrag der auf length(f) gekürzten Fourier-Koeff. Die Amplitude
%         wird mit scale=A_rect/A_window/n skaliert
%         x_fft=abs(fft(x_w));
%         spec =[x_fft(1); 2*x_fft(2:neueAnz)]*scale;
%  phase - Phase der auf length(f) gekürzten Fourier-Koeff.
%          Phase wird in ° rausgegeben
%
%%
%   01.08.2008      J.Laborenz
%   MODIFIKATION:   20.04.09   Ermittlung der Zeitspanne T
%   MODIFIKATION:   05.10.09   Anpassen der Anzahl der Koeffizienten
%   MODIFIKATION:   02.02.2010 Anpassung der Berechnung der Skalierung über
%                              Fensterflächen
%   MODIFIKATION:   20.07.2010 Übergebene Fenster-Fkt als optionalen
%                              Parameter abgeändert
%                              Standard-Fenster als Sub-Fkt abgelegt, damit
%                              auch ohne die Signal-Processing TB möglich
%--------------------------------------------------------------------------

%% Signalaufbereitung

%beide Vektoren in Spaltenvektoren umsetzen
[laenge breite]=size(t);
if (breite>laenge),
    t =t';
end;
[laenge breite]=size(x);
if (breite>laenge),
    x =x';
end;

%ermitteln der halbierten länge für Anzahl im Spektrum
anz =length(t);
if(mod(anz,2)==1), %länge des Zeitvektors ist ungerade
    neueAnz =(anz +1)/2;
else
    neueAnz =anz/2+1;
end;

%ermitteln der Periode für Freq-Vektor
dt=t(end) -t(end-1);
T =t(end)+dt-t(1);

%% Fensterung

% FensterString vorhanden?
n = (nargin-2);

if n>0,
    % Fenster-Fkt aus übergebenem Fensterstring berechnen
    fensterString =lower(varargin{1}); %Abfangen von Fehlern durch
                                         %Groß- und Kleinschreibung
    w =eval([fensterString '(' num2str(anz) ')']);
else,
    w = ones(size(t));
end;

%bestimmen des gefensterten Zeitsignals
x_w =x.*w;

%bestimmen des Skalierungsfaktors des Fensters
A_w =trapz(t,w); %fläche unter der Fensterfkt
A_rect =1*(t(end)-t(1)); %fläche eines Rechteck-Fensters
scale =A_rect/A_w/anz;

%% FFT berechnen

%Bestimmen der FFT und normieren
x_fft=abs(fft(x_w));
spec =[x_fft(1); 2*x_fft(2:neueAnz)]*scale;

%Bestimmen der Phase
x_compl = fft(x_w);
phase = angle(x_compl);
phase =360/2/pi*phase(1:neueAnz);

%Frequenz-Vektor
df=1/T;
f=0:df:(neueAnz -1)*df; %length(f) wieder =neueAnz;



%% Sub-Funktionen (eigene Fenster-Fkten)
%  Implementierung der Fenster-Fkt nach Wikipedia Eintrag 'window function'
%  und genannten Koeffizienten in der MATLAB-Hilfe

% Hann-Fenster
function w = myhann(anzPunkte),
    vek     = 0:1:anzPunkte-1;
    w       = 0.5*(1-cos(2*pi*vek/(anzPunkte-1)));
   
    [laenge breite]=size(w);
    if (breite>laenge),
        w =w';
    end;

% Hamming-Fenster    
 function w = myhamming(anzPunkte),
    vek     = 0:1:anzPunkte-1;
    w       = 0.54-0.46*cos(2*pi*vek/(anzPunkte-1));
   
    [laenge breite]=size(w);
    if (breite>laenge),
        w =w';
    end;

   
% Flattop-Fenster
function w = myflattopwin(anzPunkte),
    vek     = 0:1:anzPunkte-1;
    w       = 0.21557895...
               -0.41663158*cos(2*pi*vek/(anzPunkte-1))...
               +0.277263158*cos(4*pi*vek/(anzPunkte-1))...
               -0.083578947*cos(6*pi*vek/(anzPunkte-1))...
               +0.006947368*cos(8*pi*vek/(anzPunkte-1));
   
    [laenge breite]=size(w);
    if (breite>laenge),
        w =w';
    end;
 


Und hier das Beispiel zum testen:
Code:

%% skript_test_myFFT.m
%  Darstellen der Funktionsweise der Function 'myFFT.m'
%  Darstellen des Einflusses von Leakage und Fenster-Funktionen
%%
%  20.07.2010   J.Laborenz
%--------------------------------------------------------------------------
clear all;
close all;
clc;

%% Zeitsignale berechnen

% Parameter
dt      = 1e-2;
f       = 5;
T_id    = 1/f;
anzPer  = 10;
t_id    = 0:dt:anzPer*T_id-dt;
t_2     = 0:dt:(anzPer+0.63)*T_id-dt;
A       = 2.3;

% ideales Zeitsignal
x_id    = A*cos(2*pi*f*t_id);

% gestörtes Zeitsignal (keine volle Anzahl von Perioden)
x_2     = A*cos(2*pi*f*t_2);


%% FFT berechnen
[freq amp phase]        =   myFFT(t_id,x_id);
[freq_2 amp_2 phase_2]  =   myFFT(t_2,x_2);
[freq_3 amp_3 phase_3]  =   myFFT(t_2,x_2,'myFlattopWin');
[freq_4 amp_4 phase_4]  =   myFFT(t_2,x_2,'myHann');

% Peak extrahieren
[A_max ind]             = max(amp);
freq_max                = freq(ind);

[A_max_2 ind_2]         = max(amp_2);
freq_max_2              = freq_2(ind);

[A_max_3 ind_3]         = max(amp_3);
freq_max_3              = freq_3(ind);

[A_max_4 ind_4]         = max(amp_4);
freq_max_4              = freq_4(ind);


%% Graphische Ausgabe
figure('position', [50 50 800 700]);
    % Zeitbereich
    subplot(2,2,1)
        plot(t_id,x_id);
        axis([0 t_2(end) -1.1*A 1.1*A]);
        grid on;
        xlabel('Zeit t');
        ylabel('Amplitude A');
        hl=legend(['$T_{\rm mess}=' num2str(anzPer) '\,T$'],'location','southWest');
            set(hl,'interpreter','latex');
        title('Einfluss von Leakage und Kompensation durch Fenster',...
             'horizontalAlignment','left');
    subplot(2,2,3)
        plot(t_2,x_2);
        axis([0 t_2(end) -1.1*A 1.1*A]);
        grid on;
        xlabel('Zeit t');
        ylabel('Amplitude A');
        hl=legend('$T_{\rm mess}\neq n\,T$','location','southWest');
            set(hl,'interpreter','latex');
    % Frequenzbereich
    subplot(2,2,2)
        stem(freq,amp);
        axis([0 4*f 0 1.1*A]);
        grid on;
        xlabel('Frequenz f');
        ylabel('Amplitude A');
        legend('rectWin');
        text(1.2*freq_max,0.9*A_max,['A=' num2str(A_max)]);
    subplot(2,2,4);
        stem(freq_2,amp_2);
        hold on;
        stem(freq_3,amp_3,'-.r');
        axis([0 4*f 0 1.1*A]);
        grid on;
        xlabel('Frequenz f');
        ylabel('Amplitude A');
        stem(freq_4,amp_4,'-.c');
        legend('RectWin','Flattop','Hann');
        text(1.3*freq_max,0.95*A_max,['A_R=' num2str(A_max_2)]);
        text(1.3*freq_max,0.8*A_max,['A_F=' num2str(A_max_3)]);
        text(1.3*freq_max,0.72*A_max,['A_H=' num2str(A_max_4)]);
 


MfG
djanski
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 14:52     Titel:
  Antworten mit Zitat      
Ähm...
Also, eine Skalierung (real) einer komplexen Zahl wirkt sich nur auf den Betrag aus. Damit kannst du mit dem Betrag problemlos wie oben herum rechnen. Wenn du die Phase ebenfalls hast, dann ist es relativ leicht aus der Darstellung "Betrag und Phase" in die Darstellung "Real- und Imaginärteil" umzurechnen (siehe z.B. Hilfe von atan2()). Mit diesen Werten solltest du die inverse Fouriertransformation bestimmen können (natürlich von der skalierten Kurve) - soviel zur Theorie, ausprobiert habe ich es aber noch nicht und es könnte durchaus Probleme geben die mir spontan nicht einfallen...

Aber mal eine andere Frage: Was willst du eigentlich genau machen? In dem Beispiel berechnest du die FFT, multiplizierst und dividierst ein bißchen und willst dann die iFFT berechnen. Warum machst du diese Rechnungen nicht gleich im Zeitbereich? Und wofür brauchst du den Betrag der FFT? Falls du das Ganze nur irgendwie zwischendurch plotten willst, dann wäre es sicher einfacher, wenn du dir Kurve vor den Berechnungen temporär abspeicherst und dann im Anschluss mit dieser Kurve fortfährst.

mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 17.06.2011, 15:02     Titel:
  Antworten mit Zitat      
Habe es jetzt mal nur kurz überfolgen...entscheidend ist dann wohl dieser Teil

Code:

%% FFT berechnen

 %Bestimmen der FFT und normieren
 x_fft=abs(fft(x_w));
 spec =[x_fft(1); 2*x_fft(2:neueAnz)]*scale;

 %Bestimmen der Phase
 x_compl = fft(x_w);
 phase = angle(x_compl);
 phase =360/2/pi*phase(1:neueAnz);
 


Hier wird mit abs() der Betrag gebildet und im nächsten Teil die Phase berechnet. Wenn du nun das Frequenzspektrum wieder in den Zeitbereich transformieren willst, muss du erst von den Polarkoordinaten (Betrag, Phase) wieder zurück zu kartes. Koordinaten...also Real- und Imaginärteil

RT = Betrag * cos(phase)
IM = Betrag *sin(phase)

Dann kannst du
Code:
für die Rücktransformation verwenden. Oder viel einfacher...bevor du in Polarkorrd. wechselst, einfach das Ergebnis der FFT() zwischenspeichern = x_compl Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2011, 15:51     Titel:
  Antworten mit Zitat      
@ Ajax
In dem ersten Beispiel wo ich ein bisschen hin und her multipliziert/dividiert habe, habe ich die Formel meines Betreuers schreibe an meiner Masterarbeit) verwendet. Das ganze soll helfen Rundungsfehler zu beheben. Dabei ist jedoch ungeklärt, welche Rundungsfehler er meint oder wie er auf diese Rechenoperationen gekommen ist. Im Klartext: Ich habe es einfach übernommen ...Wink
Im Grunde genommen will ich die von mir gepostete Funktion zur bestimmung der FFT verwenden um der abweichenden Laufzeit gerecht zu werden. Ich habe das Beispiel lediglich angeführt um einen Hinweis zu bekommen, wie ich die iFFT bilde wenn ich die Werte vorher verrechnet habe, da die FFT ja auch in der Funktion weiter verrechnet wird.
Die iFFT möchte ich bilden, weil ich erwarte, dass die innerhalb der Funktion durchgeführte Fensterung einen Einfluss auf das Zeitsignal hat und ich gern wissen möchte welchen. Aber zugegeben, ich bin auf diesem Gebiet nicht sehr sicher und würde mich auch gern von euch belehren lassen sollte dieser Gedanke völlig abwegig sein.

Wenn ich das bisher gelesene zusammenfasse:
Mit der Variable "spec" werden mir die Amplituden der FFT ausgegeben die ich dann zusammen mit dem Frequenzvektor "f" zum Frequenzspektrum ploten kann.
Das heißt, ich könnte mir mit der Funktion jetzt zusätzlich die fft mit IM Anteilen ausgeben lassen um dann die inverse zu bilden. Wobei ich dann immer noch nicht weiß, welchen Einfluss die Verrechnung mit "scale" in der Funktion hat. Alternativ könnte ich dann die Variante von DSP wählen und so vorgehen:
Code:

RT = spec *cos(phase);
IM = spec *sin(phase);

%Frage hier: kann er mit der Angabe in Grad umgehen oder muss es Rad sein?

c = complex(RT,IM);
 

Jetzt müsste ich ja eigentlich "spec" und "c" zusammenführen um aus dem Ergebnis dann die iFFT zu bilden oder?

Ich kann es im Moment leider nicht testen, da ich nicht zuhause bin...-.-
ich hoffe, ich konnte verdeutlichen, was ich vorhabe.

MfG
djanski
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 17.06.2011, 16:44     Titel:
  Antworten mit Zitat      
die phase muss in rad sein (-pi...pi)

Was die Fensterung betrifft, hat die natürlich einen Einfluss auf das Rücktransformierte Spektrum mittels ifft. Dort wirst du dann je nach Fenster an den Rändern kleinere Amplituden vorfinden. Warum man die Fensterung macht, weißt du? Das multi. von Fenster und Signal passiert ja schon vor der FFT und deiner Skalierung...insofern müsste du dir gar nicht die Mühe mit der Rückrechnung machen. Evtl. habe ich aber auch einfach falsch verstanden, was du untersuchen willst.

Edit: Laut Beschreibung der Funktion wird also die Auswirkung der Fensterung untersucht...also kannst du einfach x_complx von der FFT verwenden (ist schon in RT und IM)....

Code:
x  = ifft(x_complx)


Edit2: Was meinst du denn mit abweichender Laufzeit?
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2011, 08:54     Titel:
  Antworten mit Zitat      
Also, vorweg muss ich mich erst mal korrigieren.
Code:

FFT_x = (abs(fft(x))*2/x_laenge)/sqrt(2);
 

Die hier verwendeten Rechenoperationen sollen keine Rundungsfehler beheben, sondern dazu führen, dass in der FFT die Effektivwerte angezeigt werden.
Weiterhin hätte ich den richtigen Terminus verwenden sollen. Ich meinte nicht Laufzeit, sondern Periodendauer.
Nun zu der Frage, ob ich denn weiß, was eine Fensterfunktion macht. Stellen wir das doch einfach mal auf die Probe.
Grundsätzlich ist eine Fensterfunktion eine mathematische Funktion mit der mein Originalsignal verrechnet wird um gewisse Anteile zu dämpfen und andere widerum nicht. Ausgehend von einem einfachen Rechtecksignal könnte dies zum Beispiel bedeuten, dass die Flanken des Rechtecksignals nach der Fensterung nur "langsam" ansteigen, ich mittig (im Bezug auf das Rechteck) den Peak des Signals habe und es dann wieder "langsam" abfällt. Verwendet werden Fenster, wenn die Messzeit nicht ein Vielfaches der Periodendauer ist.

Bsp1:
Sinus mit 10Hz, Messzeit: 1 sek. => Messzeit = 10*T (vielfaches der Periodendauer) => Keine Probleme bei der FFT

Bsp2:
Sinus mit 10Hz, Messzeit: 1,05 sek. => Messzeit = 10,5*T => In der FFT wird nicht die korrekte Amplitude des Signals angezeigt.

Anmerkung:
Diese Tatsache fällt natürlich nur auf, wenn man weiß, welche Amplitude das Signal eigentlich haben sollte.

Dies wird in dem von mit geposteten Beispiel sehr schön veranschaulicht. Vor allem, welchen Einfluss die verschiedenen Fenster an dieser Stelle haben können.

Warum möchte ich also Fenstern? Ich habe ein Signal, welches im Laufenden Prozess beim Trennschleifen von Granit aufgenommen wurde. Meine Aufgabe ist es jetzt zu Analysieren, welche Schwingungen dabei aufgetreten (Frequenz und Amplitude), wobei ich lediglich die Abtastrate und die Messzeit kenne. Das bedeutet also, ich bekomme über die FFT zwar die Frequenzen, muss aber davon ausgehen, dass meine Messzeit nicht einem Vielfachen der Periodendauer entspricht und ich somit nicht die reellen Amplituden angezeigt bekomme. Das führt mich dann, nach aktuellem Verständnis der Materie, zu der Überlegung, dass ich das Signal fenstern muss/sollte. Ich muss jedoch gestehen, dass ich nicht weiß, wie das mathematisch zusammenhängt mit den falsch angezeigten Amplituden...-.-
Soviel zur Vorgehensweise. Hieran schließen sich für mich jedoch noch eine nicht unerhebliche Frage an:
Welche ist für mich die "richtige/beste" Fensterung?
Matlab bietet mir eine Vielzahl von Fensterungen an, deren Effekt ich mir auch schon alle einmal angeschaut habe. Dabei passieren zum Teil faszinierende Dinge mit meinem Signal Very Happy. Aber wie bewerte ich das gefensterte Signal in der FFT? Wie müssen/sollten die gefensterten Peaks in der FFT aussehen um sie als gut zu bewerten. Bisher würde ich sagen, dass der Peak möglichst steil, ohne großartige Sprünge (zick-zack) sein sollte und der Bereich den er umschließt möglichst schmal sein sollte. Also nicht bei 95Hz beginnt zu steigen, bei 100Hz sein Maximum hat und bei 105Hz wieder Null ist sondern eher bei 99,8Hz beginnt und bei 100,2Hz wieder Null ist. Dabei handelt es sich jedoch nur um ein Bauchgefühl.

Korrigier mich bitte, wenn diese Überlegungen falsch sind. Ansonsten würde ich mich freuen, wenn du mir die Fragen beantworten oder mir einen Buchhinweis geben kannst Wink.

Ich möchte euch beiden an dieser Stelle jedoch schon mal danken. Mit euren bisherigen Antworten habt ihr mir schon sehr geholfen!

MfG
djanski

EDIT:
Nachdem ich mir jetzt innerhalb der Funktion gleich die iFFT berechnen und mit ausgeben lassen habe, bin ich in meiner Unwissenheit über Fensterfkt's doch ein wenig über die Veränderung des Zeitsignal verwundert. Ich habe mit einem solchen Ergebnis nciht gerechnet...
Ist es so, dass wenn ich von dem gefensterten Signal den Effektivwert berechne dieser eher der realität entspricht oder wird der Effektivwert trotzdem vom Ausgangssignal berechnet und die Fensterung behebt nur die oben beschriebene Problematik mit den dargestellten Amplituden in der FFT? ich bin verwirrt Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.06.2011, 13:59     Titel:
  Antworten mit Zitat      
Laughing...ich hätte jetzt auf meine Frage ein einfaches ja oder nein erwartet. Aber du hast die Thematik verstanden...Fensterung zur Minimierung des Leakage-effektes.

Was hier nun das richtige Fenster ist, läßt sich so einfach nicht beantworten. Die Wahl des Fensters wird eher für den Einzelfall betrachtet. Warum aber interessiert dich der Effektivwert? Ich weiß ja nicht was du dann mit den auftretenden Schwingungen machen sollst. Es stellt sich mir auch die Frage, ob ein Fenster nicht am Ende dein Spekrtum eher noch verfälscht. Sicherlich wirst du in den seltensten Fällen volle Perioden der Signale haben...wenn aber die Messzeit gegenüber der Signalfreq. groß genug ist, ist der Leakageeffekt evtl. gar nicht so groß. Unter Umständen wird dann die Amplitude durch ein Fenster verfälscht (viel geringer) und der Effektivwert ist dann auch zu ungenau.

Außerdem kann ich immer noch nicht nachvollziehen, warum du die ifft benötigst. Du willst doch die Frequenzen und Amplituden untersuchen, da brauchst du doch die Rücktransf. nicht. Oder wolltest du nur sehen, wie das gefensterte Signal aussieht? Wenn dich die Energie bzw. Leistung interessiert...schon mal an Leistungsdichtespektrum gedacht?

Was Literatur betrifft: zum Thema FFT und Fensterung kann ich dir
R.Best - digitale Meßwertverarbeitung empfehlen
für grundlegende Kenntnisse in Sachen FFT und co. gibt es auch im Internet ein super Script...suche mal nach DSP by Steven Smith Wink

Edit: an deinem Beispiel mit der Sinusschwingung fällt auf, dass das Flat-Top zwar gute "Amplitudentreue" hat aber dafür das Spektrum um die eigentliche Signalfrequenz deutlich verbreitert. Das Reckeckfenster liefert genau das Gegenteil. Da ist halt jetzt die Frage, was für dich wichtiger ist...eine möglichst genaue Freq. oder Amplitude? Hängt halt nun davon ab, was du nachher mit den Ergebnissen der Signaluntersuchung anstellen willst.
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2011, 15:39     Titel:
  Antworten mit Zitat      
Die ausführliche Beschreibung von meinem Verständnis der Fensterfkt's war mehr ein Selbsttest, den ich scheinbar mit Bravur bestanden habe Smile.

Die iFFT wollte ich bilden, um einfach nur mal den Einfluss der verschiedenen Fenster auf das Zeitsignal visualisiert zu bekommen. Hat also indem Sinne nichts mit meiner eigentlichen Aufgabenstellung zu tun.

Die Effektivwertberechnung wird bei der meiner weiterführenden Auswertung dann interessant. Die im Prozess auftretenden Kräfte führen zu Schwingungen im Trennschleifblatt und dass widerum zu Schnittverlauf, was was zu Abweichungen vom geforderten Sollmaß der Granitplatten führt. Der Wunsch ist es nach Möglichkeit einen Zusammenhang zwischen den Einstellparametern des Prozess (Schnittgeschwindigkeit, Vorschubgeschwindigkeit und Zustellung) und den Kräften/Schwingungen und in dessen Folge den Plattendickenabweichungen herzustellen. Aber dazu muss ich die Signale erst mal richtig aufgearbeitet haben, weshalb das dann erst im nächsten Schritt passieren wird.

Zum Verhätnis von Signalfreq. zu Messzeit:
Die Ferquenz (Drehzahl) meines Trennschleifblattes liegt, je nach Parameterwahl, zwischen 7Hz und 18Hz. Hinzu kommen noch höhere, drehzahlharmonische Frequenzen. Alle anderen Frequenzen die ich im Spektrum anezeigt bekomme müssen dann entweder Prozessbedingt sein oder durch Signalrauschen entstehen. Die Messzeit liegt mindestens bei 14 sek. und maximal bei 23 sek. (ebenfalls parameterabhängig).
Stellt sich also die Frage, ob das ausreicht um den Leakageeffekt vernachlässigen zu können? Meiner Meinung nach muss man hierbei aber auch berücksichtigen, dass das Material nicht vollständig homogen ist und somit ebenfalls das Schwingverhalten des Blattes beeinflusst.

Zur Fensterwahl:
Ich habe in der Zwischenzeit ein wenig in Büchern gewälzt und bin dabei auf folgendes Zitat gestoßen:
"Um die für die Spektrumanalyse notwendige, hohe Pegelgenauigkeit zu erreichen, wird in der Regel das sogenannte Flattop-Fenster verwendet. Der maximale Pegelfehler beträgt bei dieser Fensterfunktion lediglich 0,05 dB. Nachteilig ist die vergleichsweise breite Hauptkeule, wodurch die Frequenzauflösung reduziert wird."
Diese Aussage deckt sich ja mit der von dir. Wäre es denkbar das Spektrum einmal mit dem Flattop und einmal mit dem Rechteck-Fenster darzustellen (davon ausgehen das das Rechteckfenster eine klare Frequenzauflösung als Ergebnis hat) und sich somit mehr oder minder von Hand für interessante Frequenzen einmal die Frequenz (Rechteck) und die Amplitude (Flattop) rauszusuchen? Wäre jedoch sehr aufwendig, da die Datenmengen die ich habe doch recht groß sind. Ein Fenster, was ein mittel daraus darstellt wär super und zur Entscheidungshilfe eine Übersicht über die verschiedenen Eigenschaften der Fensterfkt's...-.-

Dein Buchhinweis werd ich im Hinterkopf behalten für den Fall, dass die gerade ausgeliehenen Bücher mir nicht weiter helfen. Es existiert auf jeden Fall bei mir hier in der Uni-Bib Smile.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.06.2011, 16:16     Titel:
  Antworten mit Zitat      
Als alt zu aufwendig erachte ich die Betrachtung mit unterschiedlichen Fenstern nicht. Läßt sich doch bequem von einem Programm erledigen, so fern die interessanten Frequenzen nicht zu dicht aufeinander liegen. Dann würde man eben erst die höchsten Amplituden suchen und anschließend die Hauptfrequenz in diesem Bereich (geht auch umgekehrt). Liegen die Freq. allerdings dicht aufeinander, wird es durch die breite Hauptkeule schwer die genaue Signalfreq. zu erfassen.

Bei 14-23 sek Messzeit passen doch aber bei Signalen im niederfreq. Bereich (was ja nicht wie hoch die Anteile des Prozesses liegen) z.B. 5-50Hz doch immens viele Perioden in das Messfenster. Da wird der Leakage effekt sicherlich nicht alt zu hoch ausfallen. Hast du dir das mal in Matlab angeschaut? Wie hoch ist denn deine Abtastung...das müssen ja schon recht viele Werte sein.

Ich wäre froh, wenn ich eine Messzeit von 500 ms hätte Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.06.2011, 17:31     Titel:
  Antworten mit Zitat      
Solltest du wirklich über eine solch Lange Messzeit verfügen, ist das Flat Top sicherlich die beste Wahl.

Bei einer Messzeit von 14 sek und einem Signal von 5 Hz, passen 70 Perioden in das Messfenster, bei höheren Freq. sogar noch mehr. Ich habe mal den Test von 70 Perioden mit deinem Sinus von 5 Hz gemacht. Die Amplitude lag bei 2,298 und der Bereich der Frequenzauflösung lag bei 4,75-5,25 Hz. In diesem Bereich war die Amplitude größer 0. Ist das nicht schon genau genug? Generell ließ sich feststellen, dass die Amplitude beim Rechteckfenster und nicht ganzen Perioden auch nicht mit einem größeren Messfenster genauer wird. Durch die höhere Auflösung des Spektrums (durch höhere Messzeit) minimiert sich aber die Ausweitung der Hauptkeule.
Private Nachricht senden Benutzer-Profile anzeigen
 
Ajax
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 09.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 08:56     Titel:
  Antworten mit Zitat      
Ihr arbeitet ja sogar am Wochenende... Wink
DSP scheint im Hinblick auf FFT und co weit mehr zu wissen, als ich es tue. Ich wüsste jetzt auch nichts mehr hinzu zu fügen - wäre jedoch dankbar, wenn du ganz kurz deine Ergebnisse (Fensterwahl usw.) hier posten könntest. Danke,
mfg
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2011, 09:20     Titel:
  Antworten mit Zitat      
Also, mit dem bisher zusammengetragenen Wissen habe ich mir das ganze dann noch mal in Matlab angeschaut und ja, aufgrund der langen Messzeit ist die verminderte Frequenzauflösung kaum zu bemerken. Die Hauptkeule ist unwesentlich breiter. Lediglich bei den Nebenmaxima sind die Werte ca. doppelt so hoch, aber im Verhältnis zur Hauptkeule immer noch sehr klein.
Das einzige was mich jetzt noch ein wenig irritiert ist, dass das Maximum der Hauptkeule beim Falttop um 0,05Hz weiter rechts liegt als bei allen anderen Fenstern...aber das könnte ich dann im zweifelsfall auch wegargumentieren Wink.
Die Messtechnik sieht so aus, dass das analoge Signale erst über einen Tiefpassfilter mit einer Grenzfreq. von 1500Hz läuft und dann mit vom A/D-Wandler mit 5300 und ein paar zerdrückte Hz abgetastet wird. Davon ausgehend das die Batterien für die Funkübertragung ausreichend Saft liefern, wenig Datenpakete verloren gehen und mit einer Messzeit von 21,5 sek führt das zu rund 86000 Messpunkten.

Dank der vielen Messpunkte die ich habe und dem Wissen über das FlattopWin im Hinblick auf die Amplitudentreue werde ich mit diesem Fenster meine Daten erst mal weiter auswerten. Die Verwendung von mehreren Fensterfkt's erscheint mir an dieser Stelle nicht Sinnoll bzw. scheint mir keinen großartigen Wissenszuwachs zu verschaffen. Sollte ich im Laufe der Zeit bei meinen Literaturrecherchen auf eine tabellarische Übersicht der Eigenschaften von verschiedenen Fensterfkt's stoßen, werde ich sie hier noch mal posten. Unter Umständen erleichtert das Nachfolgern und anderen Interessierten die Entscheidung bei der Wahl der richtigen Fensterfkt.
Bis dahin möchte ich mich noch mal bei euch beiden für eure Zeit und Hilfe bei der Diskussion des Problems bedanken. Ihr seid spitze! Very Happy

MfG
djanski

EDIT:
Mein Betreuer hat mir noch den Hinweis auf einen Filter gegeben dessen Abkürzung ich leider nur noch kenne. Er soll "NLPF-Filter heißen. Seine Eigenschaft soll sein, dass er mir eine bestimmte Frequenz und vielfache davon, also drehzahlharmonische, herausfiltert. Im Grundegenommen also eine Mehrfachfilterung mit Bandstop-Filtern. Weiß einer von euch, wie der Filter ausgeschrieben heißt oder, noch besser, kann mir dafür gleich einen Code zur verfügung stellen? Soweit ich weiß hat Matlab keinen solchen Filter...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.