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

Bedeutung fft-Länge in cpsd

 

laupl
Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2013, 08:53     Titel: Bedeutung fft-Länge in cpsd
  Antworten mit Zitat      
Hallo,
ich verwende an einer Stelle in einem Programm die Kreuzleistungsdichte mittels cpsd.

Kann mir jemand erklären, was genau die fft-Länge bewirkt?
Wenn ich das richtig verstanden habe, wird die Frequenzauflösung besser, wenn ich sie größer mache.

Aber wenn ich über alle Frequenzen summiere, müsste doch unabhängig von der fft-Länge immer der gleiche Wert rauskommen, oder?
Das ist aber nicht der Fall. Kann mir das jemand erklären?

Hier ein Beispiel:
Code:
data=rand(10,10000);
fs=100;

nfft1=2^8;
nfft2=2^12;

Pxx1=zeros(10,10,nfft1/2+1);
Pxx2=zeros(10,10,nfft2/2+1);
for cc=1:10
    for dd=1:10
        [Pxx1(cc,dd,:),~]=cpsd(data(cc,:),data(dd,:),[],[],nfft1);
        [Pxx2(cc,dd,:),~]=cpsd(data(cc,:),data(dd,:),[],[],nfft2);
    end
end

Pxx1=real(10*log10(sum(sum(sum(Pxx1)))));
Pxx2=real(10*log10(sum(sum(sum(Pxx2)))));
% Pxx1 und Pxx2 sind nicht gleich groß; warum?
Private Nachricht senden Benutzer-Profile anzeigen


laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2013, 07:30     Titel:
  Antworten mit Zitat      
Hallo,
ich habe die Antwort mittlerweile selbst gefunden.

In dem Buch "Signalverarbeitung mit Matlab und Simulink" von Josef Hoffmann und Franz Quint steht:
Zitat:
Es ist zu beachten, dass im Unterschied zu den Blöcken Spectrum Scope und Periodogram aus dem Signal Processing Blockset von Simulink, die das Power Spectrum eines Signals liefern, die MATLAB-Funktionen periodogram und pwelch aus der Signal Processing Toolbox
die spektrale Leistungsdichte eines Signals berechnen, also auf die Abtastfrequenz normieren. Will man aus den Ergebnissen dieser Funktionen die Leistung des Signals berechnen, so muss man die Summe der Werte der spektralen Leistungsdichte mit dem Abstand fs/N der Frequenzstützstellen multiplizieren. Weiterhin ist bei den MATLAB-Funktionen die Besonderheit zu beachten, dass sie bei reellwertigen Signalen, die ja ein gerades Betragsspektrum besitzen, nur die Werte der spektralen Leistungsdichte zwischen [0, fs/2] liefern, also nur N/2+1 Werte. Allerdings haben diese Werte dann den doppelten Betrag gegenüber der spektralen Leistungsdichte und werden in MATLAB mit
”einseitiger spektraler Leistungsdichte“ bezeichnet. Zur Berechnung der Leistung ist die Summe der Werte der einseitigen spektralen Leistungsdichte nur mit fs/(2 · N) zu multiplizieren.


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: 14.07.2015, 19:05     Titel:
  Antworten mit Zitat      
Hallo,
leider muss ich die Frage doch nochmal aufwärmen. Der Hinweis aus dem genannten Buch hilft mir aktuell nicht weiter. Ich habe nochmal ein kleines Beispiel erstellt. Könnte mir bitte jemand erklären, warum die verschiedenen fft-Längen zu unterschiedlichen Leistungsdichten führen? Ich steh echt auf dem Schlauch. Embarassed Danke.
Code:

% Abtastfrequenz
fs=10000;

% zwei Rauschsignale
sigA=rand(1,1000000);
sigB=rand(1,1000000);

% fft-Parameter
nfft1=2^10;
win1=hann(nfft1);
overlap1=nfft1/2;

nfft2=2^14;
win2=hann(nfft2);
overlap2=nfft2/2;

% Berechnung der Kreuzleistungsdichte
[Pxy1,F1]=cpsd(sigA,sigB,win1,overlap1,nfft1,fs);
[Pxy2,F2]=cpsd(sigA,sigB,win2,overlap2,nfft2,fs);

% Logarithmieren der Ergebnisse
Pxy1=10*log10(abs(Pxy1));
Pxy2=10*log10(abs(Pxy2));

% beide Ergebnisse in einem Plot
figure
semilogx(F1,Pxy1)
hold on
semilogx(F2,Pxy2,'r:')
grid on
legend('nfft=2^{10}','nfft=2^{14}')
axis([100 5e3 -80 -50])

% erneute Berechnung und direkte Ausgabe mittels cpsd
figure
cpsd(sigA,sigB,win1,overlap1,nfft1,fs)
figure
cpsd(sigA,sigB,win2,overlap2,nfft2,fs)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2015, 13:28     Titel:
  Antworten mit Zitat      
Hi,
habe noch weiter herumprobiert. Bei der Berechnung der Kreuzleistungsdichte führt eine Normierung mit \sqrt{nfft} dazu, dass der Einfluss der fft-Länge verschwindet. Bei der Autoleistung darf man diese Normierung allerdings nicht benutzen. Kann mir jemand erklären warum das so ist/sein muss? Danke.

Code:

% Abtastfrequenz
fs=10000;

% zwei Rauschsignale
sigA=rand(1,1000000);
sigB=rand(1,1000000);

% fft-Parameter
nfft1=2^10;
win1=hann(nfft1);
overlap1=nfft1/2;

nfft2=2^14;
win2=hann(nfft2);
overlap2=nfft2/2;

% Berechnung der Autoleistungsdichte
[Paa1,F1]=cpsd(sigA,sigA,win1,overlap1,nfft1,fs);
[Paa2,F2]=cpsd(sigA,sigA,win2,overlap2,nfft2,fs);
[Pbb1,~]=cpsd(sigB,sigB,win1,overlap1,nfft1,fs);
[Pbb2,~]=cpsd(sigB,sigB,win2,overlap2,nfft2,fs);

% Berechnung der Kreuzleistungsdichte
[Pab1,~]=cpsd(sigA,sigB,win1,overlap1,nfft1,fs);
[Pab2,~]=cpsd(sigA,sigB,win2,overlap2,nfft2,fs);

% Normierung mit sqrt(nfft)
% Paa1=Paa1/sqrt(nfft1);  % führt zu "falschem" Ergebnis
% Paa2=Paa2/sqrt(nfft2);  % führt zu "falschem" Ergebnis
% Pbb1=Pbb1/sqrt(nfft1);  % führt zu "falschem" Ergebnis
% Pbb2=Pbb2/sqrt(nfft2);  % führt zu "falschem" Ergebnis
Pab1=Pab1/sqrt(nfft1);
Pab2=Pab2/sqrt(nfft2);

% % Logarithmieren der Ergebnisse
Paa1=10*log10(abs(Paa1));
Paa2=10*log10(abs(Paa2));
Pbb1=10*log10(abs(Pbb1));
Pbb2=10*log10(abs(Pbb2));
Pab1=10*log10(abs(Pab1));
Pab2=10*log10(abs(Pab2));

% beide Ergebnisse in einem Plot
figure
semilogx(F1,abs(Paa1),'linewidth',1)
hold on
semilogx(F2,abs(Paa2),'r:','linewidth',1)
semilogx(F1,abs(Pbb1),'c','linewidth',1)
semilogx(F2,abs(Pbb2),'m:','linewidth',1)
semilogx(F1,abs(Pab1),'k','linewidth',1)
semilogx(F2,abs(Pab2),'g:','linewidth',1)
grid on
legend('Paa1','Paa2','Pbb1','Pbb2','Pab1','Pab2')
xlim([100 5000])
 
Private Nachricht senden Benutzer-Profile anzeigen
 
laupl
Themenstarter

Forum-Century

Forum-Century


Beiträge: 106
Anmeldedatum: 15.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2015, 08:47     Titel:
  Antworten mit Zitat      
Hi,
ich denke ich habe die Lösung: Bei einer größeren FFT-Länge sinkt die Anzahl der Mittelungen, da es ja weniger Fenster gibt, über die gemittelt werden kann. Durch die geringere Anzahl an Mittelungen "verschwinden" die unkorrelierten Anteile der beiden Signale demnach nicht vollständig. Also liefert cpsd mit einer größeren FFT-Länge höhere Werten, da sich die unkorrelierten Anteile noch nicht (vollständig) "rausgemittelt" haben. Gibt man für beide FFT-Längen die selbe Anzahl an Fenstern vor, erhält man (im Mittel) die selbe Leistungsdichte.
Wäre schön, wenn das so noch jemand bestätigen könnte. Danke.
Code:

% Abtastfrequenz
fs=10000;

% Länge des Rauschsignals in Samples
len=1000000;

% Gesamtrauschsignale
sigA=rand(1,len);
sigB=rand(1,len);

% Anzahl der Fenster
anz_fenster=200;

% fft-Parameter
nfft1=2^8;
win1=hann(nfft1);
overlap1=nfft1/2;

nfft2=2^12;
win2=hann(nfft2);
overlap2=nfft2/2;


% gekürzte Rauschsignale
sigA1=sigA(1:nfft1*anz_fenster);
sigB1=sigB(1:nfft1*anz_fenster);
sigA2=sigA(1:nfft2*anz_fenster);
sigB2=sigB(1:nfft2*anz_fenster);


% Berechnung der Kreuzleistungsdichte
[Pxy1,F1]=cpsd(sigA1,sigB1,win1,overlap1,nfft1,fs);
[Pxy2,F2]=cpsd(sigA2,sigB2,win2,overlap2,nfft2,fs);

% Logarithmieren der Ergebnisse
Pxy1=10*log10(abs(Pxy1));
Pxy2=10*log10(abs(Pxy2));

% beide Ergebnisse in einem Plot
figure
semilogx(F1,Pxy1)
hold on
semilogx(F2,Pxy2,'r:')
grid on
legend('nfft=2^{8}','nfft=2^{12}')
axis([100 5e3 -80 -50])
 
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.