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 selber erstellen

 

Atmos_kk
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 12:49     Titel: pwelch selber erstellen
  Antworten mit Zitat      
Hallo zusammen,

kennt sich jemand mit dem Algorithmus von pwelch aus? Ich versuche gerade den nachzuahmen allerdings scheitere ich kläglich. Mir fehlt die Signaprocessing Toolbox und somit kann ich den nicht nutzen.

Was ich bisher herausgefunden habe ist, dass man im Grunde die Zeitsignale in Segmente aufteilt, darüber eine FFT laufen lässt, diese quadriert und normiert und Anschließend alle Segmente wieder aufsummiert. Das ist mein derzeitiges Wisen, allerdings bin ich mir nicht sicher ob das wirklich so geht!

Ich bin für jede Hilfe Dankbar.

Greetz
Private Nachricht senden Benutzer-Profile anzeigen


Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2011, 12:35     Titel:
  Antworten mit Zitat      
Niemand da der auch nur eine Idee hat?
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: 16.11.2011, 14:28     Titel:
  Antworten mit Zitat      
Du hast noch die Fensterung jedes Segments vor der FFT vergessen. Bei pwelch wird standardmäßig ein Hamming window verwendet.

Poste doch bitte mal deinen Code, damit man nicht von Null anfangen muss. Bis zur Skalierung der transform. Segmente sollte ja alles zu dem Code des Spektrogramms identisch sein, den du ja schon hast Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2011, 11:45     Titel:
  Antworten mit Zitat      
Moin,

hätte ich direkt machen können allerdings funktionierte etwas mit firefox nicht so richtig! Nun aber!

Code:


clear all;

%%  Berechnung des Leistungs-Dichte-Spektrums (nach Welch) mit einem Sinus

f = 1000;                                    % Frequenz des zu erzeugenden Sinus
t = 0:1/16383:1;                                          % Zeitvektor
x = sin(2*pi*f*t);                                 % Sinusvektor

%   Segmenterstellung, Fensterung und Durchführung der FFT

fs = length(t);
y=x;                                         % Signal
M=fs/16;                                      % Fensterbreite
w=Fensterung(M,'hamming');              % Fensterung
OL=0.5;                                      % Überdeckung der Segmente
NY=floor(length(y)/(M*(1-OL)));            % Anzahl der dft Spectren
MY=M/2;                                        % Anzahl der dft Koeffizienten pro dft Spektrum
Y=zeros(NY,MY);                          % der zu füllende Vektor

start=1;
stop=start+M-1;
k=0;

while stop<=length(y)
    k=k+1;
    YY = (fft(y(start:stop).*w',M))';
    Y(k,: )=abs(YY(1: (M/2)))./M;
    start=start+M*(1-OL);
    stop=start+M-1;
end

txx1=0:NY-1;
txx1=txx1*(M*(1-OL))/fs;
f=0:1:M/2-1;
f=fs*f/M;

%%  Quadrieren, Normieren und Division mit Samplingrate
[g,h] = size(Y);

Y1 = zeros(g,h);

for i = 1:g;
    YY1 = Y(i,: ).^2/(M/2);
    Y1(i,: ) = YY1(1:h);
end

%%  Leistungsberechnung

Y2 = zeros(g,h);

for i = 1:g;
    YY2 = 10*log10(Y1(i,: ));
    Y2(i,: ) = YY2(1:h);
end

%%  Die durch den log entstandenen -Inf zu 0 machen

Y2(Y2==-Inf) = 0;

%%  Aufsummieren der einzelnen Berechnungen

P1 = sum(Y2);

fx = 0:fs/M: (fs/2)-(fs/M);                % Frequenzvektor

figure;
plot(fx,P1,'r');
hold on;
grid on;

[Pxx1,Fxx1] = pwelch(x,M,M/2,[],fs);
plot(Fxx1,10*log10(Pxx1),'b');
grid on;
hold on;

 


So müsste eigentlich alles dabei sein. Nun verstehe ich aber nicht wodurch der extreme Unterschied der y-Achsen kommt!

Und so ganz sicher bin ich mir da auch nicht wenn ich etwas verändere!

Greetz
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: 17.11.2011, 17:21     Titel:
  Antworten mit Zitat      
So sollte es passen Wink

Code:

clear;

 %%  Berechnung des Leistungs-Dichte-Spektrums (nach Welch) mit einem Sinus

 f = 1000;                                    % Frequenz des zu erzeugenden Sinus
 t = 0:1/16383:1;                                          % Zeitvektor
 x = sin(2*pi*f*t);                                 % Sinusvektor
 N = length(x); % Anzahl Messwerte

%   Segmenterstellung, Fensterung und Durchführung der FFT

 fs = length(t);
 y = x;                                         % Signal
 M = fs/16;                                      % Fensterbreite
 win = Fensterung(M,'hamming');              % 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 + abs(YY(1:MY)).^2/AL; % aufsummieren,quadrieren und normieren der einzelnen Periodogramme
     % weitere Möglichkeit
     %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; % siehe Matlab-Doku zu pwelch
 Sxx = Sxx./k;
 Pxx = 10*log10(Sxx+eps); % eps beim logarithmieren nicht vergessen um log10(0) = -Inf zu vermeiden Wink

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

figure;
plot(fx,Pxx,'r');
hold on;
grid on;

[Pxx1,Fxx1] = pwelch(x,win,numoverlap,M,fs);
plot(Fxx1,10*log10(Pxx1+eps),'b--');
grid on;
hold on;
xlabel('Frequenz in [Hz]');
ylabel('PSD [dB/Hz]');
legend('selberstelltes PSD','pwelch')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2011, 09:54     Titel:
  Antworten mit Zitat      
Moin,

vielen, vielen, vielen Dank. Das ist ja wunderbar.
Jetzt muss ich das noch ein wenig umschreiben, damit ich zu jedem Segment den Schwerpunkt bekomme. Dazu muss ich ja im Grunde den Sxx erweitern, so dass alle FFT´serstmal komplett gespeichert werden ( in einer Matrix ) und da alle Umrechnungen dran vorgenommen werden. Die Aufsummierung müsste ich ja auch zum Schluss erledigen können!
Sollte mal wieder ein Denkfehler vorhanden sein, korrigier mich doch bitte kurz.

Nochmals vielen Dank
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: 18.11.2011, 10:03     Titel:
  Antworten mit Zitat      
Das kann man sicherlich auch alles (aufsummieren, quadrieren etc.) getrennt machen. Was meinst du mit Schwerpunkt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.11.2011, 10:11     Titel:
  Antworten mit Zitat      
Hallo,

solltest du öfter Algorithmen aus der Signal Processing Toolbox brauchen, würde ich mir die Anschaffung dieser Toolbox überlegen. Warum viel Zeit und Energie investieren, um etwas zu schaffen, dass es schon gibt?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Atmos_kk
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 93
Anmeldedatum: 23.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2011, 10:14     Titel:
  Antworten mit Zitat      
Ich probier das mal aus!

Schwerpunkt meine ich die x und y Koordinaten jedes einzelnen Segmentes wo der Schwerpunkt der Amplitude und Frequenz ist!
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: 18.11.2011, 13:46     Titel:
  Antworten mit Zitat      
Ok...du wirst schon wissen was du da machst Wink

Eine Sache hatte ich noch vergessen zu erwähnen. In deinem Code fehlt die Abfrage, ob die Anzahl N von Messwerten gerade oder ungerade ist. Beim Spektrogramm wurde ja immer von gerader Anzahl ausgegangen und wenn nötig sonst der letzte Messwert abgeschnitten. Das solltest du hier auch einbauen. Falls du immer alle Messwerte verwenden möchtest, musst du die Fälle z.B. bei der Normierung getrennt abarbeiten.
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.