Zero-Padding < Signaltheorie < Ingenieurwiss. < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 19:38 Di 11.11.2014 | Autor: | Marcel |
Hallo,
ich habe mir folgende Frage gestellt: Man kann ja
Zero-Padding betreiben, um den
Radix-2 FFT Algorithms
zu verwenden.
Wenn ich mit den FFT-Werten dann ein Signal rekonstruieren
will, und zwar als (endliche) trigonom. Reihe, sehe ich
aber, dass das Zero-Padding ein Signal durchaus *verzerren*
kann.
Gibt es eine Methode, mit der man die Abstastpunkte so
*modifzieren* kann, dass der Radix-2 FFT Algorithmus das
gleiche Ergebnis liefert wie die direkte Berechnung der
DFT?
Wenn ich z.B. ein Signal von 800 Abtastpunkten mit Periode
80 Punkte habe, gespeichert in einem Zeilenvektor y, dann
kann ich ja einfach
fft(y)/800
berechnen (die Divsion durch 800, weil ich geeignete
FFT-Werte mit den theoretischen komplexen Fourierkoeffzienten
*approximativ identifiziere*).
Füge ich nun an [mm] $y\,$ [/mm] weiteren 424 Nullen dran, das Ding
heiße [mm] $u\,,$ [/mm] dann sind bei
fft(u)/1024
die *signifikanten Fourierkoeffizienten* stark verschlechtert
worden.
Kann man aber vielleicht vorher y komponentenweise mit einem
Faktor multiplizieren (also erstmal y.*modifikationsfakor
rechnen, wobei modifikationsfaktor ein Zeilenvektor mit gleicher
Länge wie y ist), so dass
fft(u)
und fft(y) (meinetwegen bis auf eine Skalierung) wenigstens
bei den *signifikanten Frequenzen* das gleiche liefern?
Die Komponenten im *modifikationsfaktor* sollten dabei doch
sicher auf dem komplexen Einheitskreis liegen...
Oder gibt es dahingehend sonst eine Möglichkeit, die Form
des Signals als (abbrechende) trigonom. Reihe zu beschreiben?
Falls es unklar ist: Ich kann auch mal Bilder hochladen, an
denen man das Ziel meiner Frage beispielhaft sieht...
Gruß,
Marcel
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:59 Do 13.11.2014 | Autor: | Infinit |
Hallo Marcel,
da hast Du eine interessante Frage aufgeworfen, mit der ich mich als Nachrichtentechniker auch schon beschäftigt habe.
Im Zeitbereich kann ich mir so ein Padding besonders einfach vorstellen. Wenn man das ursprünglich abgetastete Signal mit solchen Nullen auffüllt, entspricht dies der Ergänzung des ursprünglichen Signals mit Nullen. An der Darstellung im Frequenzbereich ändert sich dadurch nichts. Es kommen keine neuen Freqenzen dazu, aber die Auflösung im Frequenzbereich ändert sich und damit auch die Werte im Frequenzbereich, für die Ergebnisse geliefert werden. Die Abtastung eines sinsuförmigen Signals, das phasengenau abschließt, würde genau zu einer Spektrallinie führen. Alles andere lässt sich als Überlagerung eines solch idealen Zeitsignals mit einer Fensterfunktion darstellen.
Beim Auffüllen mit Nullen entspricht dies einem rechteckförmigen Fenster, mit der Übertragungsfunktion 1 während der Dauer des Zeitsignals und mit einer glatten Null für die eingefügten Nullwerte. Zu solch einem sich wiederholen Rechtecksignals gehört die (mir zumindest) allseits bekannte si-Sunktion im Spektralbereich, die sich als Faltung der "ungestörten Frequenzen" mit dieser si-Funktion bemerkbar macht. Diese verschmiert das gesamte Signal über den Frequenzbereich. Eine Entfaltung mit der inversen si-Funktion könnte hier also beim "Reinigen" helfen. Gemacht habe ich allerdings so etwas noch nie, da man meist ja Messwerte hat, die außerdem noch verrauscht sind. Hier nun zu unterscheiden, was gehört zum Signal und was nicht, ist fast unmöglich.
Soviel erst mal in Form einiger Gedanken.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:50 Fr 14.11.2014 | Autor: | Marcel |
Hallo Infinit,
> Hallo Marcel,
> da hast Du eine interessante Frage aufgeworfen, mit der
> ich mich als Nachrichtentechniker auch schon beschäftigt
> habe.
> Im Zeitbereich kann ich mir so ein Padding besonders
> einfach vorstellen. Wenn man das ursprünglich abgetastete
> Signal mit solchen Nullen auffüllt, entspricht dies der
> Ergänzung des ursprünglichen Signals mit Nullen. An der
> Darstellung im Frequenzbereich ändert sich dadurch nichts.
> Es kommen keine neuen Freqenzen dazu, aber die Auflösung
> im Frequenzbereich ändert sich und damit auch die Werte im
> Frequenzbereich, für die Ergebnisse geliefert werden. Die
> Abtastung eines sinsuförmigen Signals, das phasengenau
> abschließt, würde genau zu einer Spektrallinie führen.
> Alles andere lässt sich als Überlagerung eines solch
> idealen Zeitsignals mit einer Fensterfunktion darstellen.
> Beim Auffüllen mit Nullen entspricht dies einem
> rechteckförmigen Fenster, mit der Übertragungsfunktion 1
> während der Dauer des Zeitsignals und mit einer glatten
> Null für die eingefügten Nullwerte. Zu solch einem sich
> wiederholen Rechtecksignals gehört die (mir zumindest)
> allseits bekannte si-Sunktion im Spektralbereich, die sich
> als Faltung der "ungestörten Frequenzen" mit dieser
> si-Funktion bemerkbar macht. Diese verschmiert das gesamte
> Signal über den Frequenzbereich. Eine Entfaltung mit der
> inversen si-Funktion könnte hier also beim "Reinigen"
> helfen. Gemacht habe ich allerdings so etwas noch nie, da
> man meist ja Messwerte hat, die außerdem noch verrauscht
> sind. Hier nun zu unterscheiden, was gehört zum Signal und
> was nicht, ist fast unmöglich.
> Soviel erst mal in Form einiger Gedanken.
erstmal Danke für die Informationen. Das meiste war mir schon klar, das
*Rauschproblem* ist natürlich momentan eher *realistischer Natur*, ich
denke aber *idealisiert*.
Was mich erstaunt hat, war folgendes: Ich kann ja, wenn ich ein
periodisches Signal habe, die fft anwenden. Wenn ich nun aber etwa
die radix2-fft anwenden will, benötige ich das Zero-padding, um die
Abtastwerte eines Signals bis zu einer 2er Potenz aufzufüllen.
Durch Auswahl geeigneter fft-Werte, die ich als komplexe Fourierkoeffizienten
der abbrechenden trigon. Reihe auffasse, kann ich dieses quasi hinschreiben.
Mir ist folgendes aufgefallen: Wenn das zero-padding so gewählt wird,
dass
[mm] $\mod(2^n,\text{Abtastwerte für Periodenabschluss})$
[/mm]
minimal wird, passt diese Approximation sehr gut (man muss dabei auch
ein wenig beachten, dass man *richtig skaliert*).
Wenn
[mm] $\mod(2^n,\text{Abtastwerte für Periodenabschluss})$
[/mm]
maximal wird, ist diese Approximation sehr schlecht.
Ich werde das aber mal anhand eines Beispiels demonstrieren.
Nebenbei: Ich habe gelesen, dass die Dekonvolution anscheinend nicht
so ganz einfach ist. Kann aber auch sein, dass wir hier wenig Probleme
damit haben, weil wir das Modell ja noch im Idealfall betrachten, und ja:
Mit ist die $si$-Funktion auch wohlbekannt.
Ich habe aber auch schonmal vorher mit einem Fenster *geglättet*, aber
da ich obiges eh bei "periodischem Abschluss" beobachte, sollte das auch
keinen Einfluss haben. Und ich bemerkte auch keinen.
Aber, wie gesagt: Bei der nächsten Frage demonstriere ich das mal an
einem Bsp., nicht, dass wir ein wenig aneinander vorbeireden. ^^
Danke für Deine Antwort.
Gruß,
Marcel
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 12:58 Fr 14.11.2014 | Autor: | Marcel |
Hallo,
so, ich habe nun in Octave eine kleine Demonstration gemacht:
1: | % Einfluss des zero-paddings
| 2: |
| 3: | clear all; close all;
| 4: |
| 5: | k=4;
| 6: | f_abt = 6000;
| 7: | t = 1/f_abt*[0:k*120];
| 8: | N = length(t);
| 9: | f0 = 50; % Grundfrequenz
| 10: | s = -3+2*sin(2*pi*f0*t)+3*cos(2*pi*f0*t);
| 11: | plot(t,s,'- g','linewidth',3);
| 12: | title('Ausgangssignal');
| 13: | pause;
| 14: |
| 15: | % fft-Berechnung
| 16: | S = fft(s);
| 17: | S = 1/N*S; % Skalierung der Fourierkoeffizienten
| 18: | FK = S([1,round(f0*N/f_abt)+1]); % Auswahl der Fourierkoeffizienten zur Rekonstruktion
| 19: | % Hinweis: round(f0*N/f_abt)*1/N*f_abt=50;
| 20: |
| 21: | % Rekonstruktion des Signals ohne zero-padding
| 22: | s_rec = -imag(FK(1))*sin(0*t) + real(FK(1))*cos(0*t) + ...
| 23: | -2*imag(FK(2))*sin(2*pi*f0*t) + 2*real(FK(2))*cos(2*pi*f0*t);
| 24: | hold on;
| 25: | plot(t,s_rec,'-o r');
| 26: | title('Rekonstruiertes Signal');
| 27: | pause;FK()
| 28: |
| 29: | % fft-Berechnung einstellbar
| 30: | % Hinweis: 80 Punkte sind 1 Periode
| 31: | n=10;
| 32: | S_zp = fft(s,2^n);
| 33: | S_zp = 1/2^n*fft(s,2^n) * 2^n/N;
| 34: | FK_zp = S_zp([1,round(f0*2^n/f_abt)+1]); % Hinweis: round(f0*2^n/f_abt) ~= 50 Hz
| 35: | szp_rec = -imag(FK_zp(1))*sin(0*t) + real(FK_zp(1))*cos(0*t) + ...
| 36: | -2*imag(FK_zp(2))*sin(2*pi*f0*t) + 2*real(FK_zp(2))*cos(2*pi*f0*t);
| 37: | hold on;
| 38: | plot(t,szp_rec,'-x b');
| 39: | title('Rekonstruiertes Signal nach ZP');
| 40: | legend({'Originalsignal','rekonstruiertes Signal nach eingestelltem zp', ...
| 41: | 'rekonstruiertes Signal nach eingstelltem zero-padding'})
| 42: | pause; close;
| 43: |
| 44: | % fft-Berechnung nach zero-padding -> worst-case, da mod(2^10,80) maximal
| 45: | % Hinweis: 80 Punkte sind 1 Periode
| 46: | S_zp = fft(s,2^10);
| 47: | S_zp = 1/2^10*fft(s,2^10) * 2^10/N;
| 48: | FK_zp = S_zp([1,10]); % Hinweis: (10-1)/2^10 * f_abt ~= 50 Hz
| 49: | szp_rec = -imag(FK_zp(1))*sin(0*t) + real(FK_zp(1))*cos(0*t) + ...
| 50: | -2*imag(FK_zp(2))*sin(2*pi*f0*t) + 2*real(FK_zp(2))*cos(2*pi*f0*t);
| 51: | plot(t,s,'- g','linewidth',3);
| 52: | hold on;
| 53: | plot(t,szp_rec,'-x b');
| 54: | title('Rekonstruiertes Signal nach ZP');
| 55: | legend({'Originalsignal','Direkt rekonstruiertes Signal', ...
| 56: | 'rekonstruiertes Signal nach worst-case-zero-padding'})
| 57: |
| 58: | pause; close;
| 59: |
| 60: | % fft-Berechnung mit "besserem" zero-padding;
| 61: | plot(t,s,'- g','linewidth',3);
| 62: | title('Ausgangssignal');
| 63: | hold on;
| 64: |
| 65: | S_zp1 = fft(s,2^11); % mod(2^11,80)=16
| 66: | S_zp1 = 1/2^11*fft(s,2^11) *2^11/N;
| 67: | FK_zp1 = S_zp1([1,18]); % Hinweis: (18-1)/2^11 * f_abt ~= 50 Hz
| 68: | szp1_rec = -imag(FK_zp1(1))*sin(0*t) + real(FK_zp1(1))*cos(0*t) + ...
| 69: | -2*imag(FK_zp1(2))*sin(2*pi*f0*t) + 2*real(FK_zp1(2))*cos(2*pi*f0*t);
| 70: | hold on;
| 71: | plot(t,szp1_rec,'-x b');
| 72: | title('Rekonstruiertes Signal nach besserem ZP');
| 73: | pause; close;
| 74: |
| 75: | % fft-Berechnung mit "besserem" zero-padding;
| 76: | plot(t,s,'- g','linewidth',3);
| 77: | title('Ausgangssignal');
| 78: | hold on;
| 79: |
| 80: | S_zp2 = fft(s,2^12); % mod(2^12,80)=16
| 81: | S_zp2 = 1/2^12*fft(s,2^12) *2^12/N;
| 82: | FK_zp2 = S_zp2([1,35]); % Hinweis: (35-1)/2^12 * f_abt ~= 50 Hz
| 83: | szp2_rec = -imag(FK_zp2(1))*sin(0*t) + real(FK_zp2(1))*cos(0*t) + ...
| 84: | -2*imag(FK_zp2(2))*sin(2*pi*f0*t) + 2*real(FK_zp2(2))*cos(2*pi*f0*t);
| 85: | hold on;
| 86: | plot(t,szp2_rec,'-x b');
| 87: | title('Rekonstruiertes Signal nach noch besserem ZP');
| 88: | pause; close;
| 89: |
| 90: | % fft-Berechnung mit "größerem" zero-padding;
| 91: | plot(t,s,'- g','linewidth',3);
| 92: | title('Ausgangssignal');
| 93: | hold on;
| 94: |
| 95: | S_zp3 = fft(s,2^14); % mod(2^14,80)=64
| 96: | S_zp3 = 1/2^14*fft(s,2^14) *2^14/N;
| 97: | FK_zp3 = S_zp3([1,138]); % Hinweis: (138-1)/2^14 * f_abt ~= 50 Hz
| 98: | szp3_rec = -imag(FK_zp3(1))*sin(0*t) + real(FK_zp3(1))*cos(0*t) + ...
| 99: | -2*imag(FK_zp3(2))*sin(2*pi*f0*t) + 2*real(FK_zp3(2))*cos(2*pi*f0*t);
| 100: | hold on;
| 101: | plot(t,szp3_rec,'-x b');
| 102: | title('Rekonstruiertes Signal nach sehr langem ZP'); |
Den Code braucht man nicht kopieren, ich hänge ihn auch dran.
Die Frage ist eigentlich: Bei der ersten Rekonstruktion (mit fft auf 960
Werte angewendet) sieht das rekonstruierte Signal fast so aus wie das
Originalsignal (mir ist gerade nicht ganz klar, wieso es da eine minimale
Verschiebung zu geben scheint - vielleicht ein numerischer Effekt? Aber
das wäre alles gut verkraftbar, denke ich). (Edit: Das Duchgestrichene
resultierte wirklich aus einem Rekonstruktionsfehler: Ich hatte Real- und
Imag.-Teil falsch herum stehen...)
Bei der Rekonstruktion des Signals nach der "auf 1024-Punkte"-Zeropadding-
Methode sieht das rekonstruierte Signal nicht besonders gut aus.
(Meine Beobachtung ist, dass mod(1024,80)=64 "maximal".)
Bei der Rekonstruktion des Signals nach der "auf 4096-Punkte"-Zeropadding-
Methode sieht das rekonstruierte Signal nicht besonders gut aus.
(Meine Beobachtung ist, dass mod(4096,80)=16 "minimal".)
(Nach dem ersten Plot dafür bitte Enter drücken!)
Meine Frage ist quasi: Kann man "das Zero-Padding" quasi so in die (zur
Rekonstruktion) ausgewählten Fourierkoeffizienten mit einbeziehen, dass
die Rekonstruktion wenigstens fast so gut wie bei der 960-fft-Methode
klappt?
(Nebenbei: Das Ganze spiel kann man auch betreiben, wenn Oberwellen-
Anteile vorhanden sind. Es ist also anscheinend nicht nur eine reine
Skalierungsgeschichte bei der Rekonstruktion, zumal ich, denke ich, da
die Skalierung ja mit einbezogen habe.)
P.S. Hier die Datei:
Zeropadding_MR.m
P.P.S. Ich habe mal ein wenig weiter damit rumgespielt, und meine jetzige
Beobachtung ist: Wenn man das Signal zur ersten folgenden 2er-Potenz
mit Nullen füllt, wo der obige Rest maximal wird, hat man wohl das Pech,
dass die aus der fft berechneten Fourierkoeffizienten stark von den theoretisch
zu erwartenden Fourierkoeffizienten abweichen. Danach wird es besser.
Leider haben wir aber auf der Arbeit für unsere Anwendung das Pech, dass
wir "mit den 2er Potenzen nicht groß genug werden können".
Im Prinzip kann man sich das also wie oben vorstellen: Nach den 960
Werten müssen wir auf 1024 gehen, mehr Speicherplatz haben wir nicht,
und dann machen wir auch den größten Fehler bei der Rekonstruktion bzw.
die fft-Werte sind stark unpassend zum Signal, wie die Rekonstruktion zeigt.
Weitere Ergänzung: Das Beispiel oben ist schlecht, man sollte das Zero-
padding natürlich nach einem Nulldurchlauf am Besten gegen Periodenende
machen. Einfach mal die Fkt. auf der x-Achse dahingehend passend
verschieben!
Edit: Neuer Code (14.11., 16.28 Uhr)
Gruß,
Marcel
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:01 Do 04.06.2015 | Autor: | Infinit |
Hallo Marcel,
nachdem nun über 6 Monate nichts weiter mehr in diesem Thread passiert ist und wir ja auch gesehen hatten, dass dieser Code nicht direkt zum Vertsändnis Deines Problemes beiträgt, habe ich mir mal erlaubt, die Unbefristetheit zurückzunehmen.
Falls Du an diesem Thema noch arbeitest (was ich nicht so ganz glaube), dann führe doch bitte die Diskussion mit den Beiträgen weiter unten fort.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:12 Sa 15.11.2014 | Autor: | Infinit |
Hallo Marcel,
ich habe bei mir Octave nicht installiert und kann deswegen Dein Programm nicht laufen lassen. Generell führt das Padding aber zu einer Faltung mit einer si-Funktion im Zeitbereich, das Signal wir, mehr oder weniger leicht, verändert. Mehr kann ich eben dazu beim besten Willen nicht sagen. Eventuell schaut ja mal noch jemand vorbei, der Dein Programm mal laufen lassen kann.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:23 Sa 15.11.2014 | Autor: | Marcel |
Hallo,
> Hallo Marcel,
> ich habe bei mir Octave nicht installiert und kann
> deswegen Dein Programm nicht laufen lassen. Generell führt
> das Padding aber zu einer Faltung mit einer si-Funktion im
> Zeitbereich, das Signal wir, mehr oder weniger leicht,
> verändert. Mehr kann ich eben dazu beim besten Willen
> nicht sagen. Eventuell schaut ja mal noch jemand vorbei,
> der Dein Programm mal laufen lassen kann.
ja, klar. Aber das ist doch unabhängig vom Zero-Padding, denn ich
habe ja im Zeitbereich immer
Signal * Rechteckfenster,
so dass die fft quasi "FT(Signal) gefaltet mit FT(Rechteckfenster)"
berechnet. Der Einfluss von "FT(Rechteckfenster)" verändert sich aber, das muss
ich mir mal angucken. Wobei ich das ja auch *verbessern* kann, indem
ich vor dem zero-padding auch mit einer Fensterfunktion multipliziere. Das
habe ich auch schonmal gemacht.
Aber okay: Ich danke Dir auf jeden Fall für den Hilfeversuch. Natürlich musst
Du deswegen nicht Octave installieren.
Hast Du denn etwas anderes installiert? Ich könnte das Programm auch
*schnell* (das dauert halt schon ein wenig) umschreiben, wenn Bedarf
besteht: Etwa für R, oder ...?
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:07 Di 18.11.2014 | Autor: | Marcel |
Hallo,
> Hallo,
>
> ich habe mir folgende Frage gestellt: Man kann ja
> Zero-Padding betreiben, um den
>
> Radix-2 FFT Algorithms
>
> zu verwenden.
>
> Wenn ich mit den FFT-Werten dann ein Signal rekonstruieren
> will, und zwar als (endliche) trigonom. Reihe, sehe ich
> aber, dass das Zero-Padding ein Signal durchaus
> *verzerren*
> kann.
ich habe mittlerweile auch rausgefunden, wieso es eine solche Verzerruung
gibt.
Dazu ist es am Besten, wenn man sich die Darstellung der Fourierkoeffizienten
als reelle hinschreibt bzw. ich mache es nun mal so, dass ich sage:
Den Realteil eines komplexen Fourierkoeffizienten kann ich als
[mm] $\frac{1}{T} \int_0^T [/mm] s(t) [mm] \cos( [/mm] k [mm] \omega t)\,dt$
[/mm]
schreiben.
Grobgesagt findet man bei den [mm] $S_k$ [/mm] dann die Fourierkoeffizienten, die
zu der Reihendarstellung passen, bei den [mm] $k\,,$ [/mm] wo die Perioden bei
plot([1:N],s)
und für
x=cos(2*pi*(k-1)/N*[0:N-1])
bei
plot([1,N],x)
"passen". Wenn [mm] $s\,$ [/mm] etwa 12 Perioden auf [0:N-1] durchläuft, sollte man $k=12$ wählen.
Man sieht dann bei S=fft(s)/N, dass S(13) (13=12+1 - oder vielleicht ist es
doch direkt S(12), ich weiß es gerade nicht.... ich habe aber eh vor, hier ein
Dokument reinzustellen, da wird das sauberer drinstehen) der komplexe
Fourierkoeffizent ist, der zur Grundschwingung passt.
Das Problem, was Zero-Padding aber macht, ist, dass man den Ko-/Sinus
"verzogen" bekommt (die Perioden werden an die 2er-Potenz-Anzahl der
Stützstellen angepasst). Damit verändert man den Integranden, und wenn
man das Zero-Padding nur *knapp* macht, verändert man damit auch
die Approximation an den schon approximierten *realen*
Fourierkoeffizienten (es steht ja eine Multiplikation zweier Funktionen unter
dem Integranden, und wenn ich die eine nicht mehr *periodisch passend
angeschmiegt* bekomme, verändere ich den Integralwert entscheidend).
Wenn man das "hochzieht", verwischt dieser Fehler wieder, d.h.
Zero-Padding sollte man eigentlich nicht machen, wenn man sieht, dass
man in dem entscheidenden Teil *den Kosinus (oder den Sinus)* dann
nur noch *verbogen periodisch passend anschmiegen kann*.
Und eine Möglichkeit, wie man doch mit radix2fft arbeiten kann, und wo
es anscheinend weniger Fehler gibt, ist, einfach das Ausgangssignal zu
verzerren. Das mache ich, indem ich einfach manche Abtastwerte kopiere.
Natürlich muss man beim Rückrechnung wieder diese *Zeitverzerrung*
beachten, aber das ist relativ harmlos. Mich wunderte es schon, dass eine
einfache "Kopiermethode" reicht, um ein Signal "auf die nächste 2er-Potenz
zu strecken" .
Nebenbei: Das Ganze ist nicht druckreif, und manches, was ich hier schreibe,
versteht man so auch noch nicht wirklich. Ich bin aber gerade auch dabei,
meine Ergebnisse abzutexen. Wäre toll, wenn da jemand mal drübergucken
will und kann, nicht, dass ich da Unfug betreibe oder mir das Leben zu
schwer mache.
Aber sobald die Nachfrage da ist, stelle ich das auch gerne hier rein, falls
andere Interesse dran haben sollten...
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:56 Mi 19.11.2014 | Autor: | Marcel |
Hallo nochmal,
einfach zum festhalten möchte ich mal die Auswirkungen, die Zero-Padding
haben kann, demonstrieren. Im Endeffekt hat sich herausgestellt, dass
durch die Veränderung der Frequenzauflösung man bei *unbedachtem*
Zero-Padding sich eine *schlechte Situation* bauen kann. Das demonstriere
ich an folgendem Beispiel:
Nehmen wir an, wir haben ein Signal mit einer Grundfrequenz von 50 Hz
und entsprechenden Oberwellen. Weiter nehmen wir an, dass wir 1024
Punkte haben, um äquidistant abgetastete Signalwerte abzuspeichern.
Unsere Abtastfrequenz betrage 9000 Hz.
Man sieht sofort, dass wir in
$9000/50=180$
Stellen eine Signalperiode abspeichern können, so dass, wenn wir 900
Stellen füllen, die maximale Periodenzahl des Signals erreichen, weil
900+180 > 1024 ist.
Wir sollten hier aber dennoch bei der fft-Berechnung das Zero-Padding
nicht benutzen. Der Grund ist einfach:
Wenn wir einfach nur dft auf 900 Stellen anwenden, so wäre die
Frequenzauflösung durch
[mm] $f_\text{abt}/900=10$ [/mm] Hz
gegeben. D.h. bei den fft-Werten würden wir eine fast perfekte Approximation
an den *wirklichen* zu 50 Hz passenden Fourierkoeffizienten bei dem
6(=5+1)en fft-Wert sehen, wenn wir diesen noch durch 900 teilen.
(Entsprechend sieht man am 11en fft-Wert den Fourierk. passend zu 100 Hz,
etc. pp.)
Betreiben wir nun Zero-Padding auf [mm] $1024=2^{10}$ [/mm] Felder, so ist die
Frequenzauflösung durch
[mm] $\Delta_f=f_\text{abt}/1024=9000/1024=8.7891$ [/mm] Hz
gegeben. (Man verzeihe mir meine teilweise Schlampigkeit bei den Einheiten!)
Dann ist aber
$50 [mm] \text{Hz}/\Delta_f=5.6889$
[/mm]
gegeben. Man würde bei den fft-Werten also etwa den 7en fft-Wert
nehmen (auch hier wieder durch 900 teilen; nicht durch 1024, denn nur
900 sind ja nicht künstliche Nullen - ich erwähne diese Skalierung aber
im Folgenden auch nicht mehr), um eine Approximation für den 50 Hz
Fourierk. zu haben.
(Es ist [mm] $7=\text{round}(50/8.7891)+1$ [/mm] - mal nebenbei erwähnt: Das wir
immer um 1 weiter nach rechts gehen müssen, liegt daran, dass in Matlab
die Nummerierung der Felder mit Index 1 startet).
Nun ist aber
[mm] $\text{round}(5.6889)*\Delta_f=6*\Delta_f=52,734$ [/mm] Hz.
D.h. unsere Approximation *greift* hier um 2,734 Hz daneben. Und das
gerade bei der Grundfrequenz, dessen Fourierkoeffizient ja meist mit
den größten Einfluss für die Signalbeschreibung hat.
Grobgesagt entsteht das Problem, weil wir "einen Großteil einer Periode
beim Zero-Padding auffüllen müssen und keinen großen Spielraum haben".
Denn wenn man weiterguckt: Würde man [mm] $2^{11}=2048$ [/mm] Stellen zur Verfügung
haben, so würde man eine Auflösung von
[mm] $\Delta_f=9000/2048=4.9345$
[/mm]
erhalten, und
$50/4.9345=10.133$
ist schon näher an einem ganzzahligen Wert, als es 5.6889 war.
Im Endeffekt kann man einfach bei solchen Signalen sich für verschiedene n
abs(50-round(50/(f_abt/2^n))*f_abt/2^n)
angucken:
1: | n=7;
| 2: | while(1)
| 3: | n=n+1
| 4: | abs(50-round(50/(f_abt/2^n))*f_abt/2^n)
| 5: | pause;
| 6: | end; |
Wer den Code laufen läßt, sieht: Mit wachsendem n wird der Fehler zur
wirklichen 50 Hz Frequenz immer kleiner. Leider kann man nicht immer
das Feld auf eine beliebige 2er Potenz hochziehen. In obigem Fall denke
ich aber, dass man aus den "Frequenzabweichungen":
n = 7
ans = 20.312
n = 8
ans = 14.844
n = 9
ans = 2.7344
n = 10
ans = 2.7344
n = 11
ans = 1.6602
n = 12
ans = 0.53711
n = 13
ans = 0.53711
n = 14
ans = 0.012207
schon sieht, dass man wohl wenigstens [mm] $2^{12},$ [/mm] sicher ausreichend wären
aber [mm] $2^{14},$ [/mm] Felder für's Zero-Padding haben sollte.
Nebenbei: Am Besten ist es also, wenn man versucht, die Abtastrate mit
der 2er-Potenz-Feldlänge "zu synchronisieren". Dann kann man auf das
Zero-Padding verzichten.
Eine weitere Idee, die ich hatte, wäre: Durch *Kopieren* von Abtastwerten
*verziehen* wir das Signal einfach auf eine 2er-Potenz. (D.h., dass wir versuchen,
das Signal, welches 5 Perioden auf 900 Stellen verteilt hat, so zu manipulieren,
dass es aussieht, als wenn es diese 5 Perioden auf 1024 Stellen verteilt hätte.)
Dann berechnet man bzgl. des verzogenen Signals die fft mit der radix2fft-
Methode - in einem einfachen Beispiel hat das bei mir ziemlich gut funktioniert.
Das hat aber natürlich den Nachteil, dass jemand, der sich dann das so
gefüllte Signalfeld anguckt, wenn er es nicht weiß, sich über die *Stufen*
im Signal wundern wird. Außerdem ist mir noch nicht klar, wann man diese
einfache "manchmal 1 Signalwert direkt 2 Mal Aneinanderkleben"-Methode
schiefgehen kann bzw. wann sie gut funktioniert.
Der Vorteil wäre: Man kann so einfach die radix2fft-Methode anwenden,
ohne überhaupt Zero-Padding betreiben zu müssen.
So: Soviel dann erst mal von meinen Überlegungen dahingehend.
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:26 Mi 19.11.2014 | Autor: | Infinit |
Hallo Marcel,
das Ganze ist sicher etwas salopp ausgedrückt, aber Deine Überlegungen sind schon okay. Wie ich ja bereits weiter oben schrieb, und Du hast es ja an einem Beispiel gezeigt, ändert sich durch das Padding im Zeitbereich die Auflösung im Frequenzbereich, was sicher nicht immer gewünscht ist bzw. verwirren kann. Hinzu kommt durch die Fesnterung noch eine "Verwischung" der wahren Werte durch die Faltung der Spektralwerte mit der si-Funktion (falls es ein Rechteckfenster ist). Diese beiden Effekte überlagern sich und führen, wie Du ja selbst gesehen hast, zu einer Verschlechterung der Gesamtsituation. Man kann sicherlich noch mehr Beispiele dazu finden, dies ändert aber leider nichts an der Gesamtsituation. Alle Manipulationen, die Du Dir eben ausdenkst, führen natürlich zu einer Veränderung der Signalform gegenüber den Originalwerten und insofern ist es verständlich, dass dann auch ein anderer Spektrumsverlauf herauskommt. WWenn Du weißt, welche Vreänderungen du gemacht hast und wie sich diese im Spektrum auswirken, dann kann man versuchen, sie wieder rückgängig zu machen. Das setzt aber voraus, dass Du das eigentliche Spektrum bereits kennst und dies ist ja gerade normalerweise nicht der Fall.
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:46 Mi 26.11.2014 | Autor: | Marcel |
Hallo,
einfach nur zum Festhalten: Man kann sich überlegen (eventuell werde ich
das auch mal zusammentragen), dass das Zero-Padding mindestens zwei
Effekte hat:
1. Man verändert die Frequenzauflösung von "Signal mal Rechteckfenster",
was den Effekt hat, dass man halt im Fourierspektrum an andere Stellen
greift.
Zum Bsp. kann es sein, dass man vor dem Zero-Padding bei der FFT im
Frequenzspektrum alle 5 Hz einen Wert hatte, nach dem Zero-Padding aber
alle 4.
Wenn ich mich nun vor allem für den Wert der Fouriertransformierten des
gefensterten Signals an der Stelle 50 Hz interessiere, hätte mir dieses
Zero-padding diese Information "zertörrt".
Der zweite Effekt ist aber - das kann man sich mal hinschreiben - dass wir
mit dem Zero-Padding die Fouriertrafo der gefensterten Funktion an viel
mehr Zwischenstellen auswerten können.
Durch "Zero-Padding ins Unendliche" würden wir diese quasi stetig zeichnen.
Übrigens ist der Zero-Padding-Effekt ein anderer wie der, den wir sehen,
wenn wir die Funktion "ins Unendliche periodisch fortsetzen".
Nehmen wir an, dass wir ein $0.02$ s periodisches Signal haben. Mach' die
[mm] $fft\,$ [/mm] über 10 Perioden, danach betreibe "wachsendes Zero-Padding", und
man sieht: "Fouriertransformation von Signal mal Rechteckfenster (=Signal-Ausschnitt)"
wird immer feiner gezeichnet.
Nimm' die 10 Perioden, mache fft und teile durch Anzahl der Abtastwerte,
nimm dann 20 Perioden, mache fft und teile durch die (im Vergleich zu vorher
doppelte) Anzahl der Abtastwerte, nimm 30 Perioden etc. pp..
Dann sieht man, dass wir hier wirklich "perfekt" nur bei der zu 50 Hz
zugehörigen Stelle den "wahren" Fourierkoeffizienten bekommen. Mit
wachsender Periodenzunahme werden die Stellen nahe der 50 Hz immer
irgendwann auf 0 gezwungen.
Beim Zero-Padding ist das aber besser, da wir ja damit an der 50 Hz Stelle
ebenfalls den "wahren" Fourierkoeffizienten sehen. Und dort sind wir auch
lokal irgendwann approximativ "sehr nahe an diesem dran", und das Zero-
Padding zerstörrt das nicht, sondern läßt es sogar zu, lokal näher dranzukommen.
Die Frage ist natürlich: "Wann ist man denn eigentlich *nahe genug*
dran?" bzw. gibt es ein Kriterium, das besagt, wie stark die
Frequenzabweichung von einer Stelle, die man im Fourierspektrum
betrachten will, maximal sein darf, wenn man dort den Funktionswert
bis auf einen gewissen Prozentsatz genau haben will.
Falls sich jemand damit auskennt oder Literatur dazu kennt: Bitte einfach
mal mitteilen oder verlinken. Ich schreibe meine Ergebnisse, die sich
eigentlich, wenn man sich mal die Formeln genau anguckt und sich mal
ein wenig visualisieren läßt, was da eigentlich passiert, demnächst auch
mal sauber zusammen.
Bisher ist das alles so halb *erzählt*, also ähnlich wie hier, nur, dass ich
neben Visualisierungstools in Matlab manches auch einfach mit den Formeln,
die benutzt werden, genauer begründe.
Und ich glaube auch, dass meine Überlegungen korrekt sind. Jedenfalls
habe ich heute auch in einem Buch über digitale Signalverarbeitung in
Matlab unter dem Stichwort Zero-Padding in sehr knappen Worten auch
das gelesen, was ich mir nun selbst auf ein paar Seiten zusammengeschrieben
habe.
Allerdings steht da nur drin, was man damit macht bzw. welchen Effekt das
hat und wo man es anwendet. Das "Woher das kommt" wird dort nicht
erwähnt, dabei kann man sich das durchaus auch klarmachen bzw. ich
denke, dass ich mir das selbst klarmachen konnte. Wenngleich das alles
wirklich eher so *larifari* aufgeschrieben ist, und die mathematische
Exaktheit (noch) nicht wirklich gegeben ist.
Aber ich sag's mal so: Ein Ingenieur würde es sicher verstehen und danach
dann auch wissen, was er in welcher Situation warum anwenden kann.
Und das ist eigentlich auch das aktuelle Ziel, da es wirklich um eine schnelle
Anwendung in der Praxis geht.
Gruß,
Marcel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:50 Sa 29.11.2014 | Autor: | Infinit |
Hallo Marcel,
Deine Gedanken und Ideen zu diesem Thema kann ich durchaus nachvollziehen. Als Ingenieur betrachte ich das Ganze jedoch mehr als eine akademische Übung, denn Du gehst in Deinen Überlegungen ja immer davon aus, dass das Signal bekannt ist und damit auch seine Darstellung im Frequenzbreich. Dem ist in der Praxis, wie ich weiter oben schon mal erwähnte, keineswegs so. Das abgetastete Signal ist verrauscht, der Takt jittert, all das sind Größen, die man unmöglich deterministisch erfassen kann. Lasse Dich davon aber bitte nicht abhalten, Dich mit dem Thema weiterzubeschäftigen, als "Sparring-Partner" stehe ich gerne zur Verfügung.
Viele Grüße,
Infinit
|
|
|
|