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

pwelch Funktion

 

morsch
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 03.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 18:14     Titel: pwelch Funktion
  Antworten mit Zitat      
Hallo liebe Gemeinde,

ich habe eine Frage, die sich an den Forumbeitrag
http://www.gomatlab.de/pwelch-selber-erstellen-t20937.html
anlehnt, jedoch in eine etwas theoretischere Richtung geht. Es geht mir um den Befehl pwelch im Allgemeinen. Ich hoffe Ihr verzeiht mir, dass ich einen neuen Thread für das Thema als sinnvoll erachte.

Zunächst einmal der ganz leicht abgewandelte Code:
Code:

%%  Berechnung des Leistungs-Dichte-Spektrums
Ts=0.001;
fs=1/Ts;
%zwei verschiedene Zeitvektoren t1 und t2 definieren

t1 = 0:Ts:10; % Zeitvektor
% Nur gerade Werte verwenden
if mod(length(t1),2)~=0
    t1=t1(1:length(t1)-1);
    disp('t war ungerade->abgeändert')
end
t2 = 0:Ts:5; % Zeitvektor
% Nur gerade Werte verwenden
if mod(length(t2),2)~=0
    t2=t2(1:length(t2)-1);
    disp('t war ungerade->abgeändert')
end

%% verschiedene Signale
f=10;         %Frequenz
A=3;         %Amplitude
Signal_1=A*sin(2*pi*f*t1);
Signal_2=[zeros(1,length(t1)*0.5*(10/100)) Signal_1(1:length(t1)/100) zeros(1,length(t1)*0.5*(88/100))];
Signal_3=A*sin(2*pi*f*(t2));

x=Signal_2;       % hier Signal auwählen

if length(x)==length(Signal_3)
    subplot(3,1,1); plot(t2,x);
    title('Signal');
else
    subplot(3,1,1); plot(t1,x);
    title('Signal');
end
%%
%
N = length(x); % Anzahl Messwerte
%   Segmenterstellung, Fensterung und Durchführung der FFT
y = x;                                         % Signal
M = 0.1*length(x);                                 % Fensterbreite
win = window(@hamming,M);               % Fensterung
OL = 0.5;                               % Überdeckung der Segmente
numoverlap = M * OL;
k = fix((N-numoverlap)/(M-numoverlap)); % Anzahl der dft Spectren
MY = (M/2)+1;                           % Anzahl der dft Koeffizienten pro dft Spektrum
Sxx = zeros(MY,1);                      % der zu füllende Vektor
AL = win' * win;                        % Normierungskonstante

start=1;
stop=start+M-1;
 
for i=1:k
     YY = (fft(y(start:stop).*win',M))';
     Sxx = Sxx + YY(1:MY) .* conj(YY(1:MY))/AL;
     start = start + M * (1-OL);
     stop = start + M - 1;
end

% weitere Normierung
Sxx = [Sxx(1); 2*Sxx(2:MY-1); Sxx(MY)]; % Gleichanteil und Nyquistfrequenz unverändert
Sxx = Sxx./(fs*k);
Pxx = 10*log10(Sxx+eps); % eps beim logarithmieren nicht vergessen um log10(0) = -Inf zu vermeiden

fx = 0:fs/M:(fs/2);                % Frequenzvektor 0...fs/2 [Hz]

subplot(3,1,2); plot(fx,Pxx,'r');
hold on;
grid on;


%% Pwelch Ansatz
[Pxx1,Fxx1] = pwelch(x,[],[],[],fs);     %hiermit funktioniert es nicht
%[Pxx1,Fxx1] = pwelch(x,win,numoverlap,M,fs);    %hiermit funktioniert es
plot(Fxx1,10*log10(Pxx1+eps),'b--');
title('PSD logarithmisch')
xlabel('Frequenz in [Hz]');
ylabel('PSD [dB/Hz]');
legend('selbsterstelltes PSD(log)','pwelch(log)')
hold off;

%% Zielgröße

subplot(3,1,3); plot(fx,Sxx,'r');
hold on;
plot(Fxx1,Pxx1,'b--');
title('PSD')
xlabel('Frequenz in [Hz]');
ylabel('PSD []');
hold off;
legend('selbsterstelltes PSD','pwelch')
 


Folgende Fragen habe ich:
1. Welche Einheit hat die y-Achse des unteren Plots? Wenn das Signal die Einheit m/s^2 besitzt, müsste das doch (m/s^2)^2 sein oder?
2. Warum gibt der Befehl pwelch nicht genau das aus, was beim händisch errechneten pwelch ausgegeben wird, obwohl die eckigen Klammern eigentlich genau den gewählten Parametern der händischen Version entsprechen (das sind die default Parameter von Matlab)?
3. Wie verhält es sich mit der Fensterung der Signale? Bei einer Änderung der Fensterung, ändern sich die Ergebnisse drastisch. So wird sowohl der Maximalwert des Pxx1 Wertes stark verändert als auch der Verlauf wird beeinflusst. Das macht es natürlich schwierig dieses Ergebnis zur Weiterverarbeitung zu verwenden.
4. Übergreifend zu 3: Generell habe ich festgestellt, dass sich das Ergebnis stark verändert bei Variation aller Parameter. Es stellt sich die Frage, wie die Parameter gewählt werden sollten um plausible Ergebnisse zu bekommen, wobei ich nicht in der Lage bin abzuschätzen was plausibel ist und was nicht. So sollte der Parameter der Abtastung fs vermutlich immer der tatsächlichen Signalabtastung entsprechen (hier fs=1/Ts=1000). Wie verhält es sich mit den anderen Parametern?


Ich bin sehr dankbar für alle Anregungen und Kommentare!
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 09.12.2014, 19:24     Titel:
  Antworten mit Zitat      
Zu 1) Da eine Leistung gemessen wird und bei der Darstelllung in dB -> dBW/Hz. Ich empfehle die Angabe Magnitude [dB/Hz]...dann kann man nichts falsch machen.
Zu 2) Du setzt den Inputparameter window = []. Das bedeutet, dass der Default verwendet wird. Damit wird das Signal in 8 Segmente geteilt. Beim selbst erechneten PSD wird aber die Fensterbreite so festgelegt...

Code:
M = 0.1*length(x); % Fensterbreite


und somit ergeben sich auch mehr als 8 Segmente. Daher wohl der Unterschied-

Zu 3+4) Gegenfrage...was willst du mit dem PSD eigentlich bestimmen? Wenn man solche Funktionen nutzt, sollte man sich immer vorab mit einem Testbeispiel beschäftigen, bei dem man GENAU weiß was herauskommen soll. Man kann hier keine allgemein gültige Aussage machen, welche Einstellungen zu verwenden sind. Das hängt davon was man ermitteln will und wie das verwendete Signal beschaffen ist (Rauschen etc.)
Private Nachricht senden Benutzer-Profile anzeigen
 
morsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 03.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2014, 21:04     Titel:
  Antworten mit Zitat      
Danke für die Antwort!
1. Okay ich dachte mir schon, dass da eine Leistung steht. Ob das nun in dB angegeben wird oder nicht spielt ja eigentlich keine Rolle.
2. Das war blöd von mir. Flüchtigkeitsfehler... danke
3 und 4.
Leider habe ich kein Testbeispiel an dem ich das validieren kann. Aber generell geht es um folgendes: Die spektrale Leistungsdichte P eines Signals wird mit einer Funktion f die im Frequenzbereich vorliegt mulitpliziert und das Produkt wird im Frequenzbereich integriert.

M=\int_0^\infty   \! P(w)*f^2(w) \, dw

Es ergibt sich also am Ende ein skalar M, welches zur Auswertung herangezogen wird.

Das eigentliche Signal (aus dem die Leistungsdichte ermittelt wird), schwingt dabei nach plötzlicher Anregung mit einer Amplitude von ca. plus minus 3 und einer Frequenz von bis zu 10Hz. Nach zwei bis drei Perioden ist die Schwingung wieder abgeklungen. Generell liegt permanent ein Grundrauschen mit einer Amplitude von plus minus 0.3 vor.

Obwohl ich mich schon etwas in das Thema eigelesen habe, habe ich nun Schwierigkeiten in der Funktion pwelch die richtigen Parameter zu setzen. Sobald die Fensterung oder andere Parameter verändert werden, ändert sich das P sehr stark... da bräuchte ich noch ein paar Tipps Rolling Eyes
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.12.2014, 19:46     Titel:
  Antworten mit Zitat      
Ich kann mich da leider nur wiederholen. Allgemein gültige Aussagen zu den richtigen Einstellungen gibt es nicht. Es hängt vom Signal ab und falls ein System untersucht werden soll, ob z.B. ein MA oder AR Prozess vorliegt.

Bei der Schätzung der Leistungsdichte nach Welch wird aber immer ein Hamming Fenster verwendet. Bei einem Rechteck-Fenster (sozusagen der Sonderfall zu Welch) heißt es dann z.B. Bartlett-Methode.

Wählt man die zu mittelnden Periodogramme (Anzahl Fenster) zu hoch, ist die Schätzung gegenüber der tatsächlichen Leistungsdichte zu gering. Außerdem wird dadurch die Frequenzauflösung schlechter. Sind die Fenster dagegen zu lang gewählt, liegt die Schätzung über dem tatsächlichen Wert.

Du wirst bei dem Thema nicht drum herumkommen Lektüre zu lesen. Z.B. Digitale Signalverarbeitung von K.D. Kammeyer mit Matlab Übungen.

Im Übrigen lagst du mit deiner Annahme der Einheit doch richtig. Wird z.B. eine Schwinungungsanlayse eines mechanischen Systems durchgeführt, spricht man von einer spektralen Beschleunigungsdichte.

Die Einheit ist dann (m/s²)² / Hz
Private Nachricht senden Benutzer-Profile anzeigen
 
morsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 03.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2014, 01:03     Titel:
  Antworten mit Zitat      
Okay, ich werde dann versuchen mich noch ein wenig mehr einzulesen.

Danke für die Hilfe!! Smile
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.