Dieses soll im Frequenzbereich dargestellt werden.
Theorie:
td=0.1 betrachtete Dauer
fa=1/0.0015 Abtastfrequenz
N=td/0.0015 Abtastwerte
df=fa/N Abstand 2er diskreten ein Träge im Frequenzspektrum
dx=[0:df:fa] Frequenzvektor für plot
und dann kann man nach fft und dem ganzen rest einfach den Vektor
der Fourtransformierten gegen dx plotten, natürlich muss man darauf achten das die Vektoren gleich lang sind.
Ich habes an sich auch geschafft und richtig ist es auch. Es ist aber nicht perfekt, da es zu Fehlern kommt wenn man den Vektor t ändert.
Mein Problem ist df soll 10 sein bzw ist 10 im Bsp oben
,aber wenn man es berechnen will ( damit es auch bei Änderung des t Vektors funktioniert) gibt es einen Rundungsfehler.
1.Der Vektor den Matlap anlegt hat nicht N=td/0.0015 Werte
(es gibt ja keine 1/2 werte)
2. Wenn man anschließend dann df mit N berechnet kommt nicht mehr 10
raus. (Ich hab erstmal gerundet dann stimmt es aber nicht für jedenfall)
3.Solange nicht Segmentiert wird könnte ichauch einfach fd=1/td schreiben, leider hab ich keine ahnung wie ich an die 0,1 dran komme weil der letzte wert im Vektor t(67)=0.099.
4. zB gehts mit 0,1 / 0,2 aber nicht mit 0.3 / 0.4
Es geht ja hier um eine feste Frequenzauflösung df (in deinem Code fx genannt). Wenn die Abtastfreq. ebenfalls unverändert bleiben soll, kann ja nur die Anzahl Messwerte N geändert werden. Also entweder wird die Messzeit entsprechend angepasst, es werden Messwerte am Anfang und/oder Ende des Datensatzes nicht berücksichtigt, oder man führt ein Zeropadding durch. Das bedeutet, dass man Nullen am Ende des Signals vor der FFT anfügt. Der FFT Befehl kann das automatisch, in dem man den Parameter nfft mit übergibt.
Code:
N = length(signal);
% nfft > N -> dann werden nfft-N Nullen ans Ende angefügt % nfft < N -> hier wird am Ende vom Signal abgeschnitten
y = fft(signal, N);
Somit ändert sich natürlich auch die Anzahl der Abtastwerte, indirekt,
doppelt so lange abtaste oder toppelt so schnell führt beides mal zur doppelten Anzahl an Abtastwerten.
Weiterhin hast du recht die Skalierung funktioniert auch nur bei 1 Bsp.
Natürlich ist die Amplitude dann 2 wenn man die Signaldauer verdoppelt werden zu jeder Frequenz auch doppelt so viele Werte bestimmt.
Leider hab ich das Bsp im Link mir angesehen, es aber nicht wirklich herraus finden können wie dort skaliert wird. Ich hätte gerne immer die max amplitude 1 ich hab mein Programm bisschen verändert, da müsste der Amplitudenteil dann stimmen.
Wegen dem Zeropadding weiß ich nicht ob das in diesem Fall hilft, bzw so wie ich das eigentlich verstanden habe macht er das so oder so automatisch.
Ich habe nur noch das Problem das man den t Vektor ändern kann und damit, die Abtastfrequenz, die Signaldauer,die Anzahl der N.
Wobei hier das Problem darin besteht das für die diskreten Abstände im Frequensspektrum fd=fa/N falsche Werte herraus kommen wenn, der Vektor nicht genau auf geht weil zb im Standartbeispiel (wie es im ersten Beitrag oben steht
rein rechnerisch mit Taschenrechner hab ich kein Problem:
N=66.666666667 (0.1/0.0015)
(eigentlich, das geht natürlich nicht und wird zu 67 weil der Taschenrechner 0 nicht mitzählt und 67.6667 dann halt zu 67 ganzen vektoriellen Einträgen macht)
fa=(0.0015)^-1=666.66666667
draus folgt mit Taschenrechner:
df=fa/N=10
oder einfashc und schneller ohne Segmentierung gilt :
df=fa/n=1/td=1/0.1=10
so und geau hier ist das Problem in Mathlap, da gibt es 67 Einträge und
fa=666.666667
dadurch ist der Bruch df=fa/N != 10 sondern im Bezug auf das erste Beispiel 9.95 und dann hab ich einfach gerundet.
Leider bringt mir das nichts denn sobald man t=[0:0.0015:0.3] macht führt das Runden zu Fehlern.
Ich könnte auch einfach df=1/td nutzen nur hier ist das Problem wenn
man zb einen Vektor v=[1:2:4] hat wäre td=4 df=0.25 aber der Vektor ist
1 3 die 4 die ich zur Berechnung von df brauche kommt im Vektor nicht
vor.
Wenn jemand weiß wei ich von einem solchen Vektor das nicht vorhandene ,,letzte Element,, bekommen könnte oder ich immer sauber
df mit fa/N bestimmen kann obwohl Mathlap 67 ganze Werte macht ,bitte
mir link senden oder vielleicht einfach Programm verändern und einstellen.
Natürlich ist die Amplitude dann 2 wenn man die Signaldauer verdoppelt werden zu jeder Frequenz auch doppelt so viele Werte bestimmt.
Das ist falsch. Egal wie lang die Messdauer ist, die Amplitude bleibt immer gleich. Es gibt lediglich einen Faktor, der die Amplitude beeinflusst...der Leck-Effekt. Dieser tritt dann auf, wenn keine komplette Anzahl von Perioden des Signals im Messfenster enthalten ist.
In dem Skript aus dem Link ist die richtige Skalierung doch recht eindeutig:
Code:
% Hier als Bsp. für Darstellung NUR des positiven Freq.-bereichs
Wegen dem Zeropadding weiß ich nicht ob das in diesem Fall hilft, bzw so wie ich das eigentlich verstanden habe macht er das so oder so automatisch.
Das ist nicht korrekt. Wenn du, wie in deinem Codebeispiel, der fft() Funktion lediglich das signal als Vektor übergibst, dann wird niemals Zeropadding durchgeführt. Wie das die Funktion automatisch durchführt, habe ich in meinem vorherigen Post gezeigt. Ist die Anzahl Messwerte in deinem übergebenen Vektor keine 2er Potenz, wird lediglich der deutlich langsamere DFT Algorithmus verwendet. Ansonsten FFT...
Und hier sind wir auch gleich bei deinem Grundproblem. Es empfiehlt sich in der Praxis eigentlich immer, eine 2er Potenz als Anzahl Messwerte zu wählen. Wenn das Signal nicht schon solch eine Länge hat, kann man entweder mit Zeropadding Nullen anhängen oder eben etwas vom Signal abschneiden. Außerdem erachte ich dein Bsp. doch als recht sehr theoretisch. Niemand wird bei einem A/D Wandler eine so krumme Abtastfreq. einstellen bzw. ist das so genau gar nicht möglich. Zweitens unterschlägst du auch, dass in deinem Zeitvektor t
die Endzeit eben nicht 0.1 ist, sondern 0.099, da es mit den gewählten Parametern nicht aufgeht. Sicherlich kann man schon auch theoretische Ansätze verfolgen...aber hier sehe ich den Mehrwert ehrlich gesagt nicht. In der Praxis wird man so nie arbeiten.
Kordi
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.12.2012, 14:13
Titel: Lösung
Hi Entschuldigung ich habe lange nicht mehr nachgesehen, die Aufgabe konnte ich mittlerweile lösen. Beziehungsweise ich hatte die Lösung eigentlich schon, den Fehler den ich meinte kann man gar nicht wirklich eliminieren.
Zitat:
Mein Problem ist df soll 10 sein bzw ist 10 im Bsp oben
,aber wenn man es berechnen will ( damit es auch bei Änderung des t Vektors funktioniert) gibt es einen Rundungsfehler.
oder
Zitat:
Wobei hier das Problem darin besteht das für die diskreten Abstände im Frequensspektrum fd=fa/N falsche Werte herraus kommen wenn, der Vektor nicht genau auf geht
Es ging also darum das in der vorgegebenen Aufgabe der Vektor nicht genau aufgeht und letztlich dadurch eine falsche Frequenzskalierung entsteht.
So wie es dir dann auch aufgefallen ist.
Zitat:
Außerdem erachte ich dein Bsp. doch als recht sehr theoretisch. Niemand wird bei einem A/D Wandler eine so krumme Abtastfreq. einstellen bzw. ist das so genau gar nicht möglich. Zweitens unterschlägst du auch, dass in deinem Zeitvektor tdie Endzeit eben nicht 0.1 ist, sondern 0.099, da es mit den gewählten Parametern nicht aufgeht. Sicherlich kann man schon auch theoretische Ansätze verfolgen...aber hier sehe ich den Mehrwert ehrlich gesagt nicht. In der Praxis wird man so nie arbeiten.
Da bin ich ganz deiner Meinung der Prof hatte wohl darüber nicht nachgedacht und das mit der Theorie ist leider immer so im Studium.
Aber das der Zeitvektor nicht aufgeht ist ja nicht meine Schuld und unterschlagen hab ich es auch nicht.
Zitat:
3.Solange nicht Segmentiert wird könnte ichauch einfach fd=1/td schreiben, leider hab ich keine Ahnung wie ich an die 0,1 dran komme weil der letzte wert im Vektor t(67)=0.099.
Was meinst du eigentlich damit?
Zitat:
Das ist falsch. Egal wie lang die Messdauer ist, die Amplitude bleibt immer gleich.
Es ging ja um die Amplitude im Frequenzspektrum und so wie wir es in Signalverarbeitung gelernt haben wir bei der Fouriertransformation vereinfacht gesagt die Summe alle Signalwerte bei der jeweiligen Frequenz gebildet.
Ich habes auch schon mal ausprobiert wenn man das Signal doppelt solange mit der gleichen Abtastrate/frequenz abtastet bekommt man auch doppelt so viele Abtastwerte, weil das vorgegebene Signal periodisch ist passiert doch folgendes:
zb bei 50Hz haben wir eine Amplitude von 100 und bei 80Hz eine von 30
wenn man jetzt doppelt so lange abtastet zB. 2 Perioden statt vorher einer,
dann hat man ohne Skalierung der Y-Achse im Frequenzspektrum bei 50Hz
eine Amplitude von 200 und bei 80Hz eine Amplitude von 60. Realtiv hat sich also nichts geändert nur quantitativ.
Und danke sehr für das Beispiel das ist wirklich sehr elegant gemacht, einzig bei der Magnitude komme ich nicht ganz mit.
gemacht habe. Für die Aufgabe hat es gereicht da man die y-Achse einfach nur normieren sollte und sie von 0 bis 1 gehen sollte.
Leider habe ich den Begriff Magnitude in der Tat noch nie gehört. Wir haben bisher immer nur von Amplituden gesprochen. Und soweit ich das jetzt verstanden habe ist Magnitude ein sehr allgemeiner Begriff der eine Größenordung ist, in Form eines Faktor oder eine Beschreibung von Wertebreichen und Skalen.
Ich kann also nicht ganz folgen was es eigntlich bedeutet, wenn ich den
Spaltenvektor mag sehe.
Wie ich sehe wird es ja auch bei der logarithmischen Darstellung des Amplitudengangs verwendet.
Zitat:
% falls gewünscht: Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
Dann müsste es ja eigentlich so etwas wie eine Betragsfunktion oder (Versträrkungs) Faktor sein.
Mfg
Kordi
Einstellungen und Berechtigungen
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.