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

Impulsantwort aus Übertragungsfunktion (Messwerten) mit IFF

 

schmiederoine
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 14:09     Titel: Impulsantwort aus Übertragungsfunktion (Messwerten) mit IFF
  Antworten mit Zitat      
Hallo Zusammen

Hier mein Problem:
ich habe die Übertragungsfunktion von einem Messgerät.
Nun möchte ich die Impulsantwort mit einer IFFT berechnen.
Das Signal soll nur über einen Bereich der Übertragungsfunktion übertragen. Daher nehme ich den gewünschten Teil und fülle den Rest davor / danach mit Null.

Problem ist nun dass eine komplexe Impulsantwort entsteht und ich vermute dass die ganze Impulsantwort falsch ist.

Die Messwerte schauen folgendermaßen aus:
Frequenzvektor_Messung; Real; Imaginär
9.000000000000000E3;-2.649735510349274E-1;-9.077049514461579E-1
2.589977500000000E5;-9.692166447639465E-1;7.714945716422496E-2
5.089955000000000E5;-9.449542164802551E-1;1.673908310716361E-1
…
Im Anhang findet ihr noch ein Bild.


Ich vermute ich behandle die Messwerte falsch...

kann mir jemand Helfen??

Vielen Dank
Gruß
Bernd

Code:

% Punkte für IFFT
N = 512
% übertragen von gewünschtem Teil des Spektrums in Vektor H
    H = [];
    for i = 1: length(Frequenzvektor_Messung)
        if Frequenzvektor_Messung(i) > F_start && Frequenzvektor_Messung(i) < F_stop
            H = [H ; H_Messung(i)];
        end
    end
 
    delta_f = Frequenzvektor_Messung(2)-Frequenzvektor_Messung(1);
    number_zeros = round(F_start/delta_f);    
% Vor Messwerten 0 einfügen
    for i = number_zeros:-1:1
        H = [0; H];
    end
% Nach Messwerten 0 einfügen    
    for i = length(H):(N/2-1)
        H = [H; 0];    
    end

% Negative Frequenzen erstellen
    H = [H; conj(flipud(H(2:(N/2))))];

% IFFT
    h = ifft(H,N);
 


untitled.png
 Beschreibung:

Download
 Dateiname:  untitled.png
 Dateigröße:  10.14 KB
 Heruntergeladen:  1459 mal
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: 30.01.2012, 16:10     Titel:
  Antworten mit Zitat      
Ich habe das jetzt erstmal nur überfolgen...

Gehe richtig in der Annahme, dass du also eine Frequenzantwort des Systems hat (= fouriertransformierte Impulsantwort). Nun führst du quasi eine Bandpassfilterung durch, in dem du niedrige und höhere Frequenzanteile abschneidest? Den Rest füllst du wieder mit Nullen auf und transformierst in den Zeitbereich.

Im Prinzip ist das so richtig...allerdings kann man eine Filterung durch löschen von Frequenzanteile nur bedingt durchführen. Löscht man zu viele Informationen, entsteht das sogenannte Gibbs-Phänomen. Dadurch wirst du vor allem an den Rändern der Impulsantwort gewisse Artefakte sehen. Die fouriertransformierte Impulsantwort ist ja in viele einzelne Sinus und Cosinusschwingungen zerlegt worden (Vorgang der FFT). Wenn man hier nun Sachen weglässt, kommt am Ende ein neuer Verlauf heraus, der nicht mehr viel mit der eigentlichen Impulsantwort zu tun hat.

Ich würde dir vorschlagen, zunächst eine Impulsantwort eines einfachen bekannten Systems (z.B. schwingendes PT2) zu generieren, die FFT davon durchführen und dann deinen Algorithmus darauf testen. So kannst du ganz einfach überprüfen, ob am Ende wieder deine Test-Impulsantwort herauskommt.
Private Nachricht senden Benutzer-Profile anzeigen
 
schmiederoine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 18:00     Titel:
  Antworten mit Zitat      
Hi,

ich habe die Messdaten als S-Parameter (im s2p Format). Daher vermute ich dass das Gerät es mit FFT erzeugt hat.
eingelesen werden sie mit

Code:

data = read(rfdata.data,'xxx.s2p');
...
s_params = extract(data,'S_PARAMETERS',75);
H_Messung = s_params(2,1,:);


Es sollte vor allem die Impulsantwort und zusätzlich ein Bandpass durch das Abschneiden entstehen.

Ist nur noch immer seltsam die Sache mit der komplexen Impulsantwort...

ich werde es morgen mal deinen vorschlag probieren...

Danke
Gruß Bernd
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: 30.01.2012, 18:40     Titel:
  Antworten mit Zitat      
Ich empfehle dir die Bandpassfilterung nicht durch Löschen von Freq.anteilen zu machen, sondern mit einem richtigen Filter. Da du ja schon im Freq.raum bist, kannst du die Frequenzantwort deines Systems einfach mit der fouriertransformierten Impulsantwort des Filters multiplizieren. Dies entspricht einer Faltung (= Filterung) im Zeitbereich. Schau dir dazu sonst mal in der Skriptecke den Thread "Window-Sinc-Filter" an. Damit kannst du dir das Filter erstellen und die Faltung im Freq.raum wird auch gezeigt.

Das du am Ende ein komplexen Ergebnis bekommst muss ja nicht unbedingt etwas heißen...evtl kommt das auch durch Rundungsfehler zustande.
Verwende doch mal nur den Realteil und schau dir das Ergenis an.
Code:

% IFFT
    h = real(ifft(H,N));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
schmiederoine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2012, 10:07     Titel:
  Antworten mit Zitat      
Hi
wer auch ne komplexe antwort bekommt - hier ist die lösung dazu:

Die länge von H und H* muss N/2 - 1 sein
dann gibt es H_ifft = [0; (N/2-1); 0; (N/2-1)]

Gruß

Code:

H_ifft = [0; conj(flipud(H)); 0; H];
h = ifft(H_ifft);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
schmiederoine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2012, 10:38     Titel:
  Antworten mit Zitat      
oh hab gerade gesehen ich habs hier falsch reingeschrieben
Code:

H_ifft = [0; H; 0; conj(flipud(H))];
h = ifft(H_ifft);
 

sorry
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: 22.02.2012, 13:14     Titel:
  Antworten mit Zitat      
Das ist ja alles richtig...aber kannst du die negativen Effekte, die durch das Löschen von Freq.-teilen entstehen können auch ausschließen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.