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

Einfluss der Fensterfunktion bei cpsd

 

laupl
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2013, 16:37     Titel: Einfluss der Fensterfunktion bei cpsd
  Antworten mit Zitat      
Hallo,
ich berechne mit cpsd Leistungsdichtespektren.

Mal abgesehen von einem Rechteckfenster wird ja hierbei durch die Verwendung einer Fensterfunktion Leakage vermieden, wenn ich das richtig verstehe.

Nun schmeiße ich durch die Verwendung eines Fensters aber zwangsweise Daten weg.
Das bedeutet doch, dass ich nie ein 100%ig richtiges Ergebnis erhalte, oder?

Es geht im Grunde um genau dieses Problem hier:
http://www.mathworks.com/matlabcent.....reader/view_thread/238683
Von was für einem Skalierungsfaktor wird hier gesprochen? Dazu kann ich nichts finden.


Danke, Grüße
Private Nachricht senden Benutzer-Profile anzeigen


laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2013, 14:55     Titel:
  Antworten mit Zitat      
Hallo Signalverarbeitungsprofis,

ich denke, das ursprüngliche Problem ist gelöst.

Durch die Fensterung schmeiße ich zwar tatsächlich Werte weg, aber wenn man oft genug mittelt, verschwindet dieser Fehler. D.h. die Schätzung des Leistungsdichtespektrums eines stationären stochastischen Signals wird "besser/genauer" wenn man die Signallänge erhöht.
Vergrößert man in diesem Beispiel die Signallänge, verkleinert sich der Abstand zwischen den cpsd's mit Bartlett- bzw. Hann-Fenster.
Code:
x=randn(1000,1); % Zufalssignal; hier die Länge verändern

nfft =2^7;

pxx1 = cpsd(x,x,hanning(nfft),0,nfft,10); % Leistungsdichtespektrum mit Hann-Fenster

pxx2 = cpsd(x,x,bartlett(nfft),0,nfft,10); % Leistungsdichtespektrum mit Bartlett-Fenster

figure
semilogy(pxx1)
hold on
semilogy(pxx2,'r-');

max(abs(pxx1-pxx2))


Kann mir jemand bestätigen, was ich mir hier zusammengereimt habe?


Weitere Frage:
Ich möchte das Leistungsdichtespektrum gerne in dB SPL angeben. Je nach verwendetem Fenster und Fensterlänge ändern sich die Werte. Im Beispiel hier würde ich 94 dB SPL bei 100 Hz erwarten. Oder zumindest dass pxx_ges diesen Wert hat.
Code:
fs=1000;
t = 0:1/fs:10;
x = sin(2*pi*100*t);
nfft =2^8;

[pxx,f]=cpsd(x,x,hanning(nfft),nfft/2,nfft,fs);
pxx_ges=20*log10(sum(pxx)/(2*10^-5));
pxx=20*log10(pxx/(2*10^-5));

figure
stem(f,pxx)
max(pxx)

Wie muss ich vorgehen, damit ich die korrekten Werte erhalte?

Danke, Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Napomleb
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 27.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2013, 08:52     Titel:
  Antworten mit Zitat      
Hallo,

Ja du hast Prinzipiell Recht mit der Aussage, das durch die Verlängerung der Beobachtungsdauer der Fehler geringer wird. Wenn du dir die Formeln der Berechnung anschaust, dann wirst du auch sehen das das Integral immer über einen bestimmten Zeitraum berechnet werden muss, da man aber keinen unendlichen langen Zeitraum betrachten kann, hat man Fenster eingeführt. Und diese Fenster überlappen sich auch noch, da innerhalb eines Fensters die Mitte stärker bewertet wird als der Rand.
Bei der Welchmethode wird außerdem noch der Zeitliche Mittelwert genommen was den Fehler nochmals geringer macht.

Wenn du nur ein Eingangssignal hast, dann kannst du auch anstatt der cpsd einfach die pwelch nehmen.


Deine Signalfrequenz ist kein ganzes Vielfaches der Abtastfrequenz -> Leackage.
Und du musst die Skalierung beachten, probiers mal mit dem Zusatz 'power', dann skaliert er automatisch auf die Bandbreite.
Falls du dir mit den Amplitduenwerten noch unklar bist, dann solltest du auch immer mit dem rectwin und einer ganzen vielfachen Signalfrequenz anfangen.

Warum würdest du 94dB SPL erwarten? (hab keine Ahnung von Schalldruck)

Du kannst dir die Fenster mal mit dem wintool anschauen, dann siehst du auch wie die Zeitfunktionen bewertet werden.

Auch interessant:
http://www.mathworks.com/matlabcentral/answers/18617


Code:
fs=1024;
t = 0:1/fs:10;
x = sin(2*pi*100*t);
nfft =2^12;
noverlap = nfft/2;

[pxx,f]=pwelch(x,rectwin(nfft),noverlap,nfft,fs, 'power');
pxx_ges=20*log10(sum(pxx)/(2*10^-5));
pxx=20*log10(pxx/(2*10^-5));

figure
plot(f,pxx)
max(pxx)
grid minor
Private Nachricht senden Benutzer-Profile anzeigen
 
laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2013, 16:27     Titel:
  Antworten mit Zitat      
Hi,
danke für die Antwort.

1.
Code:
scheint es nicht zu geben:
Ambiguous or invalid string option specified.

2. In dem Beispiel kann ich auch pwelch benutzen, das ist natürlich richtig. Ich brauche später zwar cpsd, aber für das Problem spielt das keine Rolle. Bleiben wir also bei pwelch.

3. Dass es Leakage gibt ist mir klar. Deswegen ja auch die Fensterung. Da ich später keine reinen Töne als Signal habe, komme ich um die Fenserung auch nicht drumrum.

4. Das mit den 94 dB SPL war nicht ganz richtig. Die erhalte ich nur dann, wenn ich als Effektivwert einen Schalldruck von 1 Pa habe. In meinem Beispiel war aber der Spitzenwert 1 Pa.
20\cdot lg(p_{eff}/p_0))=20\cdot lg(1 Pa/(2\cdot 10^{-5} Pa))\approx 94 dB SPL

5. Nachdem was ich bis jetzt rausgefunden habe, muss es für jedes Fenster tatsächlich einen Skalierungsfaktor geben. Nur leider weiß ich noch immer nicht, welcher der richtige ist bzw. wie ich ihn korrekt anwende.
Nach diversen Versuchen behaupte ich mal, dass er auf jeden Fall von nfft abhängen muss, da dieser Wert die Amplitude verändert.

Das hier sind zwei der Seiten, die ich zu dem Thema gefunden habe.

http://www.mathworks.de/support/sol.....t=SG&solution=1-17M0Q

http://www.mathworks.de/matlabcentr.....reader/view_thread/278831

Bin über jede weitere Hilfe dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Napomleb
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 27.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2013, 08:11     Titel:
  Antworten mit Zitat      
1. Hmmm, scheint es so als würdest du eine alte Matlab version benutzen Wink
Ok dann ohne 'power'.

5. Ich versuch mal das mit dem Amplitudenfehler allgemein mit einem einfachen Bsp zu erklären.
Nehmen wir an du hast fa = 1024 Hz, und Nfft = 2^8=256, dh du hast später ein frequenzybin von 1024/256 = 4 Hz.
Deine Signalfrequenz sollte nun idealerweise ein vielfaches von 4 Hz sein, zb 100 oder 104 Hz.
Wenn deine fs nun 102 Hz hat, hast du maximalen Amplitudenfehler (siehe Wiki) 3,92dB bei Rechteck bzw Faktor 2,46.

http://de.wikipedia.org/wiki/Fensterfunktion

Code:
fs=1024;
t = 0:1/fs:10;
x = sin(2*pi*102*t);
x2 = sin(2*pi*102*t);

nfft =2^8;   % df = 4 Hz -> 102 genau zwischen zwei Auswertefrequenzen
nfft2 = 2^10;   % df = 1 Hz -> genau auf Auswertefrequenz
noverlap = nfft/2;

[pxx,f]=pwelch(x,rectwin(nfft),noverlap,nfft,fs);
pxx = pxx/nfft;

[pxx2,f2]=pwelch(x2,rectwin(nfft2),noverlap,nfft2,fs);
pxx2=pxx2/nfft2;

figure
stem(f,pxx); hold on
stem(f2,pxx2, 'r');grid minor



Diesen Amplitudenfehler kannst du nicht pauschaul einrechnen sondern nur verringern, indem du die Nfft erhöhst.
In dem Beispiel hab ich auch noch den Skalierungsfaktor der FFT miteingerechnet.
Aber jetzt kommt noch der Skalierungsfaktor des Fensters hinzu, beim Hann Fenster ist das zb 2.

Sehr hilfreich das .pdf:
http://www.mikrocontroller.net/topic/50568
Private Nachricht senden Benutzer-Profile anzeigen
 
laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2013, 11:46     Titel:
  Antworten mit Zitat      
Hallo,
nochmals danke für die Hilfe.

In meinem letzten Beitrag war noch ein Fehler. Da hat noch ein ^2 bei dem Referenzschalldruck gefehlt.

Ich habe noch eine sehr gute Veröffentlichung zu dem Thema gefunden:
http://www.fhnw.ch/technik/ime/publ.....ulations-and-measurements

Damit habe ich mir nun folgendes gebaut und bin voll zufrieden:
Code:

% Signal x generieren
freq=2^9;
fs=4*freq;
t=0:1/fs:10;
x=sqrt(2)*sin(2*pi*freq*t);     % Ampl. sqrt(2) = Eff. 1

% fft-Länge festlegen
nfft =2^12;

% Überlappung der Fenster festlegen
noverlap = nfft/2;

% Fenster auswählen
w = hanning(nfft);

% Leistungsdichtespektrum berechnen
[pxx,f]=pwelch(x,w,noverlap,nfft,fs);

% coherent gain, noise gain und Skalierungsfaktor nach den Gleichungen 1,
% 2 und 8 aus dem verklinkten Paper berechnen
CG=1/nfft*sum(w);
NG=1/nfft*sum(w.^2);
s=NG*(f(2)-f(1))/CG^2;

% Werte des Leistungsdichtespektrums mit Skalierungsfaktor multiplizieren
pxx=pxx*s;

% Werte in dB SPL umrechnen
pxx=10*log10(pxx/(2*10^-5)^2);

% tadaaaa
figure
stem(f,pxx)
max(pxx)
 


Ich hoffe das hilft auch anderen weiter.
Danke an alle, die sich Gedanken gemacht haben!

Grüße
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.