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

Bode Diagramm / Frequenzanalyse aus Messwerten

 

Pete19
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2013, 13:31     Titel: Bode Diagramm / Frequenzanalyse aus Messwerten
  Antworten mit Zitat      
Hallo!


Ich muss mal wieder stören. Ich würde mir gern die genaue Charakteristik einiger Filter ansehen. Dazu habe ich Eingangs- und Ausgangssignale abgeführt, die stehen also genauso zur Verfügung wie die Sampletime.

Jetzt gibt es ja in SML diesen ARX Block, mit dem man theoretisch wunderbar die Übertragungsfkt bestimmen kann. Da kommt aber nicht genau die raus, die tatsächlich dem Filter entspricht.

Dann habe ich mir Ein- und Ausgangssignal hergenommen und das mit Bode... geplottet. Da kommt auch wieder nicht genau das raus, was bei Bode(tatsächlicher Übertragungsfunktion) zu sehen ist. Die Verläufe ähneln sich zwar ganz gut - aber ich würde es gern sehr genau machen.

Als Eingangssignal habe ich erst eine Sinuswelle verwendet. Jetzt nutze ich einen Stoß (von 0 auf 1). Sollte ich das vll anders machen?

Wie würdet ihr denn in der Sache vorgehen? Ich hab auch überlegt, dass händisch durch berechnung der Amplitudenverhältnisse zu lösen. Aber eigentlich sollte ja bode(Ein-;Ausgangssignal) nichts anderes tun, oder!? Ich bin ein wenig verwirrt. Für eine hilfreiche Antwort wäre ich euch wirklich sehr dankbar...


Grüße

Peter
Private Nachricht senden Benutzer-Profile anzeigen


Pete19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2013, 09:52     Titel:
  Antworten mit Zitat      
Gibt es niemanden, der hier einen Ratschlag parat hat?
Oder sind alle frustriert, weil das Thema schon so oft kam? Ich hab die Suchfunktion durchaus bemüht. Aber so richtig finden konnte ich nichts. Ich habe nur Fragestellungen zu Grundsatzproblemen gefunden und ein Thread, indem lediglich das Ausgangssignal zur Verfügung stand.
Ich wäre wirklich sehr dankbar, wenn mir jemand eine Richtung vorgeben könnte, der mit dem Thema schon Erfahrungen gesammelt hat.

Grüße


Peter
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: 11.02.2013, 11:54     Titel:
  Antworten mit Zitat      
Das Frequenzverhalten eines Filters untersucht man mit der Impulsantwort. Also ist der Eingang ein Dirac Impuls. Transformiert man den Dirac in den Frequenzbereich, hat jede diskrete Frequenz die Amplitude = 1. Nimmt man nun die Impulsantwort des Filters, sieht man nun beim Betrag, wo das Filter dämpft (Amplitude < 1) oder wo verstärkt wird (Amplitude > 1).
Das Zeitverhalten hingegen wird meistens an einer Sprungantwort beurteilt.

Für das Frequenzverhalten brauchst du nur das Ausgangssignal, da es ja die Systemantwort auf das Eingangsignal ist. Das Betrags- und Phasendiagramm wird dann mittels FFT/DFT erstellt. Um die Übertragungsfunktion mit einem Parameterschätzverfahren zu ermitteln, z.B. an Hand des erwähnten ARX Modells, braucht man Ein- und Aussgangssignal. Wenn du einen FIR Filter hast, entspricht dies aber einem MA-Prozess...ein IIR Filter einem AR-Prozess. Das X bei ARX steht für ein zusätzlich genutzes Eingangssignal bei dem Schätzverfahren, was die Genauigkeit erhöht.

Prinzipell ist es hier immer besser gleich deinen Code zu posten, damit man sieht, was du schon versucht hast. So wirst du wohl in über 90% deutlich schneller eine Antwort erhalten Wink. Außerdem fehlen Informationen zu dem Filtertyp. Was willst du nun genau, das Frequenzverhalten untersuchen, oder die Übertragungsfunktion ermitteln/schätzen? Woher hast du die tatsächliche Übertragungsfunktion und wo/wie wurden die Filter erstellt/Koeffizienten berechnet?
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2013, 15:25     Titel:
  Antworten mit Zitat      
Hey DSP,


vielen Dank schonmal für deine Antwort! Das hat mir schonmal weitergeholfen. Mir war der Zusammenhang Sprungfunktion / Dirac - Zeit- / Frequenzbereich nicht mehr so klar vor Augen. Da bin ich ja schonmal ein Stück weiter gekommen.

Ich habe in dem Bereich wohl noch Wissenslücken. Den Unterschied zwischen einem FIR- und einem IIR-Filter kenn ich erst seitdem ich vor einer Minute danach gegooglet habe. Da die Systemantwort aber scheinbar unbegrenz dem Eingang folgt, muss es wohl ein IIR Filter sein.

Berechtigter Einwand. Ich habe im Prinzip den Code verwendet, der hier im Forum zu finden ist. Den habe ich erweitert um die FFT des Eingangssignals.


Code:

function [mag, mag_dB, fv] = FFT_betragsspektrum(input, signal, nfft, fa) ;
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2

% un-,gerade Anzahl Messwerte?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Signal transformieren
Fy = fft(sig,nfft);
Fu = fft(input(:),nfft);
 
%   Betrag - nur positives Freq.spektrum  
Fy_pos0 = abs(Fy(1:k));
Fu_pos0 = abs(Fu(1:k));

%   Skalierung  
mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)

% Berechung der Phase in rad/s
phase_rad = angle(Fy(1:k));

% Umrechnung in grad
phase_grad = phase_rad * (180/pi) ;

% Berechnen Amplitudenverhältnis
 



Die Subplot Befehle hab ich zur Übersichtlichkeit weggelassen. Was genau kommen für Signale an: Eingangssignal Sprungfunktion; dazwischen ein diskreter Filter mit TF: z/(z + 0.5). Ich habe separat bode(TF) probiert, wobei da ein anderes Bode-Diagramm herauskam. Daher mein Thread.

Das könnte ja durchaus daran liegen, dass ich keinen Dirac Stoß als Input verwende. Ich habe jetzt einen Dirac angenähert als Eingangssignal (Signal Builder: zum Zeitpunkt t0 Input=10000000; einen Simulationsschritt später Input = 0). Reicht das so provisorisch oder gibt es da eine "korrektere" Lösung?

Zum Filtertyp: Es handelt sich um einen Bandpassfilter. An den Filter wird aber nicht nur das Eingangssignal übergeben sondern auch die Parameter sampletime, Filterordnung und untere sowie obere cutoff frequency. Gefiltert wird also je nach Parametern (max. Ordnung n = 7). Mich interessiert, wie das Frequenzverhalten in Abhängigkeit der übergebenen Parameter aussieht. (Also NICHT primär die Übertragungsfkt; ich dachte nur, damit wäre es am einfachsten das Frequenzverhalten zu ermitteln).

Die tatsächliche Übertragungsfkt habe ich nicht. Ich habe nur erstmal an einem einfachen Filter (Tf(z) = z/(z + 0.5)) geprüft, ob das Skript funktioniert, wie es soll. Denn so kann man ja einfach mittels bode(Tf) gegenprüfen.

Ich habe jetzt mal einen Probelauf mit FFT_betragsspektrum(Ausgangssignal,1024,100) ausgewertet. Das Bode-Diagramm zeigt jedoch ein reines P-Glied. Ich sehe noch nicht, wie das zu Stande kommt...

Für weitere Hilfe wäre ich sehr dankbar!



Grüße

Peter
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: 11.02.2013, 15:42     Titel:
  Antworten mit Zitat      
Der Code kommt mir doch sehr bekannt vor...stammt nämlich von mir Wink

Einen diskreten Dirac Impuls würde man z.B. so erstellen:

Code:

N = ... % Anzahl Werte
dirac = [1; zeros(N-1,1)]; % Dirac Impuls zur Zeit t = 0
 


Wie hast du denn das Filter erstellt? Mit einer Matlab Designfunktion z.B. IIR Butterworth:

Code:


Es gibt in Matlab nämlich etliche Funktionen, die dir die Filtereigenschaften grafisch darstellen können. Für digitiale Filter (Übertragungsfunktion im z-Bereich) sollte man nicht den Bode Befehl nutzen. Dieser ist für TF's im s-Bereich. Nimm besser
Code:
Wenn du mir die obere Frage beantwortest bzw. am Besten noch deinen Code für den Filterentwurf postest, kann ich dir schneller helfen. Du wirst wohl keine eigene Funktionen erstellen müssen, sondern kannst auf vorhandene zurückgreifen. Hast du die Signal Processing,Control System und Filter Design Toolbox für Matlab? Im Übrigen nutzt auch Bode eine Impulsantwort des Systems zur Frequenzanalyse. Wenn du ein Filterobject hast, kann du die Impulsantwort auch mit
Code:
erstellen lassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2013, 16:52     Titel:
  Antworten mit Zitat      
Abermals danke danke für deine Zeit, DSP!


Dirac: Ah sehr gut, hab ich so eingefügt.


Der Filter wurde mir vorgegeben. Den habe ich nicht selbst erstellt - das ist natürlich fatal für's Verständnis... Aber zur Erklärung: Der Filter wurde meiner Einschätzung nach mit keiner Add-on Toolbox generiert. Es werden leidglich (die aus den Parametern resultierenden) Koeffizienten der Übertragungsfunktion zugeführt. Die werden im Diskreten (also bspw. (Eingangssignal - Output_Filter) * (1/z)² * a2n + restliche Koeffizienten * (Eingangssignal - Output_Filter)) einfach nur verrechnet und somit das gefilterte Signal bestimmt. Das passiert je nach Filterordnung N logischerweise N-mal. Es gibt daher keinen Code zur Filter-Erstellung sondern nur die manuell zusammengestellten Simulink-Blöcke.

Ah, ok. Ich dachte...

Code:


h = tf([1 ],[1 0.5],0.1,'variable','z^-1');
bode(h)

 


... wäre legitim. Na gut, Fehler erkannt.


"freqz" habe ich auch probiert. Aber da ist mir noch nicht klar, ob das hinhaut, so wie ich das verwende:

Code:


 y = Out_F.data; % Signalausgangs-Datenvektor aus SML.
 freqz(y)

 



In der Doku wird diese Fkt ja stets auf den Filter an sich angewendet.
Code:


b = fir1(48,[0.35 0.65]);
freqz(b,1,512)

 


Und ich wende sie ja auf den Signalausgang an. Haut das trotzdem hin? Bzw. wie kann man das prüfen? Ggf. les ich nochml in meinen Aufzeichnungen nach und skizziere das Bode Diagramm eben händisch zum Abgleich.


Die ersten 2 Toolboxes hab ich. Falls die letzte Filter DesignS Toolbox heißt, hab ich sie auch.


Auf jeden Fall kommt schonmal etwas halbwegs brauchbares dabei heraus - besten Dank schonmal bis hierher Wink




Grüße

Peter
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: 11.02.2013, 19:47     Titel:
  Antworten mit Zitat      
Ok...ich habe nicht erwartet, dass das Filter in Simulink vorliegt. So kannst du den freqz Befehl natürlich nicht verwenden. Dafür brauchst du entweder ein Filterobjekt oder die Koeffizienten a und b des Filters. Wenn du nun die Frequenzantwort des Filters mit dem Bodeplot vergleichen willst, nutze die oben von dir gepostete Funktion. Das Eingangssignal brauchst du nicht, falls doch gewünscht, musst du es ebenso skalieren, wie auch mag und mag_dB erstellt werden. Gib auf das Filter in Simulink einen Dirac Stoß. Dafür gibt es sogar einen eigenen Block, oder du nutzt den erstellten Datenvektor dirac aus dem Workspace. Beim Bode Befehl wird die x- und y-Achse logarithmisch dargestellt. Außerdem ist standardmäßig die Frequenz w (rad/s) und nicht Hz. Das solltest du im Hinterkopf haben, damit du sie vergleichen kannst.

Übergib die Daten der Simulation an die Funktion
Code:

% habe noch bei Output die Phase hinzugefügt
function [mag, mag_dB, phase_rad, phase_grad, fv] = FFT_betragsspektrum(input, signal, nfft, fa) ;
...
 


Für die Darstellung gehst du so vor:
Code:

omega = 2*pi*fv; % Umrechnung in rad/s
% Betrag
semilogx(omega,mag_dB); % logarithmische Darstellung, entspricht bode standard
% phase
semilogx(omega,phase_grad);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2013, 11:34     Titel:
  Antworten mit Zitat      
Hey DSP,



tschuldige dass es um mich so ruhig worde. Ich musste krankheitsbedingt ne Runde aussetzen.

Ich habe deine Tipps jetzt aber mal umgesetzt - das sieht mit Hilfe deines Skriptes schon verdammt ordentlich aus. Ich nehm mal an, dass das Problem vor allem daraus bestand, dass ich keinen Dirac-Impuls als Eingang verwendet habe.

Das habe ich jetzt also korrigiert und das Frequenzspektrum sieht gut aus. Ich habe das mal mit dem oben beschriebenen Bode-Befehl verglichen. Die Verläufe sind ähnlich aber noch nicht ganz gleich. Ich habe die plots mal in den Anhang gelegt.

Es fällt auf, dass einerseits die Grenzfrequenzen verschieden sind. Das kann ja eigentlich nur mit unterschiedlichen Abtastfrequenzen zusammenhängen. Dabei habe ich aber bei der TF für den Bode-Befehl folgendes deklariert:

Code:

h = tf([1 ],[1 0.5],0.0025,'variable','z^-1')
bode(h)
 


und als Funktionsaufruf für deine Funktion:

Code:

FFT_betragsspektrum(y,2048,400);
 


Wobei y der Ausgangsvektor der SML-Messung ist. Also eigentlich sollte das mit Sampletime / Abtastfrequenz schon hinhauen, oder?

Darüber hinaus ist die Amplitude um einen Offset von rund 60dB verschieden. Die Änderung stimmt überein aber es ist dieser Offset vorhanden. Wo könnte der denn herkommen?

Danke schonmal für deine Anregungen!



Grüße

Peter

FFT.fig
 Beschreibung:

Download
 Dateiname:  FFT.fig
 Dateigröße:  24.28 KB
 Heruntergeladen:  405 mal
bode.fig
 Beschreibung:

Download
 Dateiname:  bode.fig
 Dateigröße:  16.98 KB
 Heruntergeladen:  392 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Pete19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 21.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 15:02     Titel:
  Antworten mit Zitat      
Hey, ich nochmal!



Ich hatte zuletzt das Problem, dass ein Amplituden-Offset vorlag (-60 dB oder sowas). Das lag darin begründet, dass ein Dirac-Stoß bei t = 0 nicht den Wert 1 haben muss sondern dass das Flächenintegral (unter dem Stoß) betragsmäßig 1 entsprechen muss. Als ich da endlich mal drauf gekommen bin, hat's funktioniert. Den Rest konnte ich in weiten Teilen mit DSP's Skript lösen.

Das Tool funktioniert jetzt astrein. Ich DANKE ganz besonders DSP für die umfangreiche Hilfe! Für die, die es interessiert: Im Anhang ein Beispiel, wie es jetzt aussieht.


Grüße

Peter

Filter_analyse.fig
 Beschreibung:

Download
 Dateiname:  Filter_analyse.fig
 Dateigröße:  55.37 KB
 Heruntergeladen:  450 mal
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 - 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.