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...
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.
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 . 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?
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? ifmod(nfft,2) == 0;
k = (nfft/2) + 1;
else
nfft = nfft + 1;
k = (nfft/2) + 1;
end
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...
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
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
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.
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
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) ;
...
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],[10.5],0.0025,'variable','z^-1') bode(h)
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?
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.
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
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.