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

Analyse-FFT-/Fenster Programm

 

elcachon
Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 10:45     Titel: Analyse-FFT-/Fenster Programm
  Antworten mit Zitat      
Hallo Leute,
hab hier in einem Buch('Digitale Signalverarbeitung mit Matlab') ein Programm zur Kurzzeitspektralanalyse mit Fensterung gefunden, weiß jedoch nicht genau was es bedeutet!!
Code:

_Peter_: Code gelöscht wegen Copyright.
 

Ok ich hoffe das war nicht zu viel auf einmal! Würde es halt gern verstehen!!
Danke schon mal

speech.zip
 Beschreibung:

Download
 Dateiname:  speech.zip
 Dateigröße:  55.17 KB
 Heruntergeladen:  617 mal
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: 12.10.2011, 12:15     Titel:
  Antworten mit Zitat      
Kommt mir irgendwie bekannt vor...es gibt eine Funktion in Matlab Namens spectrogram. Sie macht die gleiche Berechnung Wink

Aber bevor ich hier etwas erkläre...verstößt du hier evtl. gegen das Copyright? Ich weiß ja nicht, ob der Autor es gerne sieht, wenn du seine Sachen veröffentlichst.
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 13:08     Titel:
  Antworten mit Zitat      
hey DSP,

nein nein, das ist ein Buch, ausgeliehen von der Fh. Und es wird explizit erwähnt, das man sich die Daten downloaden darf. Man muss sich nicht einmal registrieren, nur Buchtitel eingeben und dann Paket downloaden!!

www.vieweg.de
dann Buch suchen: Digitale Signalverarbeitung mit Matlab, und dann auf Online Plus| Zusatzmaterialien

--> Nur falls du dich selbst überzeugen möchtest!! Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 13:17     Titel:
  Antworten mit Zitat      
Vielleicht kurze Erklärung warum ich mich mit diesem Programm auseinander setze:

Ich möchte eine graphische oberfläche erstellen und mit dieser soll es möglich sein, dass Ursprungssignal und das frequenzspektrum darzustellen.
Das Spektrum soll mit Hilfe verschiedener Fenster darstellbar sein!!

Das Signal muss schritt für schritt gefenstert werden und bei jedem gefensterten Block wird die FFT gemacht, ABER ich möchte die FFT Werte von Fensterblock1 mit Fensterblock2 vergleichen und immer die größten werte übernehmen und speichern(z.B als maxVol), dann die Werte in maxVol mit Fensterblock3 vergleichen, größten werte in maxVol, usw. bis zum Signalende!

Dachte dieses Programm könnte mir da behilflich sein, da die Blockweise Fensterung mit FFT schon vorhanden ist und auch der Überlappungsfaktor schon integriert 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: 12.10.2011, 13:21     Titel:
  Antworten mit Zitat      
Das stimmt nicht was du hier schreibst. Es mag sein, dass diese Daten frei zugänglich sind, eine Nutzung ausserhalb des persönlichen/privaten Gebrauchs ist aber NICHT zulässig. Du hast mit der Veröffentlichung gegen die allg. Geschäftsbedingungen verstoßen...

Zitat:

3. Urheberrecht, Nutzungsrechte Inhalte
Wenn im Einzelfall nichts anderes bestimmt ist, haben Sie lediglich das gesetzliche Recht, einige wenige Kopien von Teilen der Inhalte zu erstellen, vorausgesetzt, dass diese Kopien ausschließlich zum persönlichen Gebrauch erstellt und genutzt werden und dass sichergestellt wird, dass alle Hinweise auf die Schutzrechte und deren Inhalte bestehen bleiben.
Das Verbreiten in jeglicher Form der auf den Webseiten von viewegteubner.de enthaltenen Inhalte und Daten sowie die Implementierung dieser Inhalte und Daten auf den Webseiten Dritter ist nicht zulässig.


Ich würde an deiner Stelle den Code löschen...

Edit: Das verstehe ich nicht...

Zitat:
Ich möchte eine graphische oberfläche erstellen und mit dieser soll es möglich sein, dass Ursprungssignal und das frequenzspektrum darzustellen.


Hast du dir mal angeschaut, was genau ein Spektrogramm/Wasserfalldiagramm ist?! Hier wird der Bezug der Amplitude von Zeit und Frequenz dargestellt. Daran kann man erkennen, welche Frequenzen und Amplituden zu welchem Zeitpunkt in dem Signal auftreten. Ein Frequenzspektrum zeigt ja nur die auftretenden Frequenzen und die Amplitude.
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 13:50     Titel:
  Antworten mit Zitat      
ok

wie lösche ich das!!

Und wie kannst du mir dann helfen, würd es doch gern verstehen?
Wenn du ihn dir herunterlädst und mir dann nur hier die fragen beantwortest??

Zitat:
Hast du dir mal angeschaut, was genau ein Spektrogramm/Wasserfalldiagramm ist?! Hier wird der Bezug der Amplitude von Zeit und Frequenz dargestellt. Daran kann man erkennen, welche Frequenzen und Amplituden zu welchem Zeitpunkt in dem Signal auftreten. Ein Frequenzspektrum zeigt ja nur die auftretenden Frequenzen und die Amplitude.


Ja hab ich, aber das ist nich was ich brauche!

Möchte ein Frequenzspektrum mit logarithmischer x-achsenskalierung und der Angabe der Amplitude in dBµV, nix so spektakuläres Smile
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: 12.10.2011, 13:58     Titel:
  Antworten mit Zitat      
Schreibe einem Moderator z.B. Peter eine PN, dass er es löschen soll.
-> _Peter_: Bereits gelöscht.

Hier kannst du dir einen öffentlich zugänglichen Code des Spektrogramms anschauen...Seite 2

http://www.gomatlab.de/spektrogramm-t19055,start,15.html

Den kannst auch hierher kopieren und explizit zu einzelnen Codsezeilen Fragen stellen. Ich habe aber immer noch nicht verstanden, warum du dein Signal in Segmente zerlegen willst. Was erhoffst du dir davon?

Edit: In dem Code war noch ein kleiner Fehler...

Code:

[signal,fs,bits] =wavread('speech');
% Anzahl Messwerte
N = length(signal);  
% Ist Signallänge gerade?
if mod(N,2)
    n = N-1;
else
    n = N;
end;
clear H_pos0;
% FFT Segmentlänge und Fensterlänge
% kleine Sgementlänge nfft -> feinere Frequenz- aber schlechte
% Zeitauflösung
nfft = N/8;
% Overlap = window_size/2
numoverlap = nfft/2;
% Hann Fenster erstellen
win = hann(nfft); % falls Signal Processing Toolbox in Matlab nicht vorhanden ist, untere Funtkion nutzen. Die Funktion ist in der Skriptecke zu finden.
%win = Fenster(nfft,'hann');
 
k = fix((n-numoverlap)/(length(win)-numoverlap)) ;
H = zeros(nfft,1);
% k. Segmente der Länge nfft transformieren
m = 1;
for i=1:k
    % Fensterung mit Hann window
    signal_win = signal(m:nfft+m-1) .* win;
    H(1:nfft) = fft(signal_win, nfft);
    % Betrag bilden
    H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
    % nächstes Segement
    m = m + nfft - numoverlap;
end
 

% Auflösung des Spektrum
df=fs/nfft;
% Frequenzvektor
f = [0:nfft/2]*df;
% Zeitvektor
t = [0:k-1]*numoverlap/fs;
% Spektrogramm darstellen
figure(1);
surf(t,f,20*log10(H_pos0+eps));
colorbar;
axis xy
colormap(jet);
zlabel('Magnitude [dB]')
ylabel('Frequenz [Hz]');
xlabel('Zeit [s]');
figure(2);
imagesc(t,f,20*log10(H_pos0+eps))
axis xy, colormap(jet);
colorbar;
ylabel('Frequenz [Hz]');
xlabel('Zeit [s]');
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 14:27     Titel:
  Antworten mit Zitat      
Code:

k = fix((n-numoverlap)/(length(win)-numoverlap)) ;
H = zeros(nfft,1);
% k. Segmente der Länge nfft transformieren
m = 1;
for i=1:k
    % Fensterung mit Hann window
    signal_win = signal(m:nfft+m-1) .* win;
    H(1:nfft) = fft(signal_win, nfft);
    % Betrag bilden
    H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
    % nächstes Segement
    m = m + nfft - numoverlap;
end

Die schleife würde ich gerne verstehen, hab da so meine probleme!
So wie ich es mir denke, wird hier ein signal schritt für schritt mit 50%iger Fensterüberlappung gefenstert und eine fft davon gemacht, jedoch sind mir die Programmierschritte dazu nicht klar!!
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 14:36     Titel:
  Antworten mit Zitat      
Zitat:
Ich habe aber immer noch nicht verstanden, warum du dein Signal in Segmente zerlegen willst. Was erhoffst du dir davon?

Ich will es einfach block für block fenstern, da meine signale wahrscheinlich nie periodisch sein werden--> weniger leakage!!

FFT Werte 2er Fenster miteinander vergleichen und jeweils die max. Werte in einen extra Vektro!

Ziel:
Da ich die Fensterblöcke immer nach max Werten vergleiche, bekomme ich ja logischer Weise immer die peak werte des jeweiligen Fensterblocks!

Und nur diese Peak werte werden am Ende der FFT/Fensterung in einem Diagramm dargestellt!!

soll eigentlich die FFT -Länge immer gleich der Fensterlänge sein, oder wovon ist die Fensterlänge abhängig
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: 12.10.2011, 15:27     Titel:
  Antworten mit Zitat      
Bsp. signal mit 4096 Messwerten, einer Segmentlänge von 512 Messwerten und einen Overlap von 256 Werten.
Code:

n= 4096;
nfft=512;
numoverlap=256;
% k = Anzahl der Segmente
k = fix((n-numoverlap)/(length(win)-numoverlap)) ;
% mit den oberen Festlegungen: k = 15
H = zeros(nfft,1);
% k. Segmente der Länge nfft transformieren
m = 1; % Indexstartwert für das Segment
for i=1:k
     % Fensterung mit Hann window
     % entnehme aus Signal das Segment der Länge nfft = 512 und multipliziere mit dem Hann-Fenster
     % Index von...bis
     % Segment 1: Werte 1...512
     % Segment 2: Werte 257...768
     % Segment 3: Werte 513...1024
     % ...
     % Segment 15: Werte 3585...4096
     signal_win = signal(m:nfft+m-1) .* win;
     % Segment transformieren
     H(1:nfft) = fft(signal_win, nfft);
     % Betrag bilden
     % fft() berechnet ein beidseitiges Spektrum -fn...0...+fn
     % es interessiert aber nur der positive Frequenzbereich 0...fn [Hz]
     % fn = Nyquistfreq. = fs/2
     % Deshalb werden aus H nur die Werte 1...257 = (nfft/2) + 1 entnommen
     H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
     % Indexstartwert für nächstes Segement bestimmen    
     m = m + nfft - numoverlap;
end
 


Du solltest dich unbedingt mal mit dem Debugger in Matlab vertraut machen. Damit kann man im Schrittbetrieb sehr einfach die einzelnen Zeilen nachvollziehen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 15:48     Titel:
  Antworten mit Zitat      
ok DSP danke das ist verständlich fürs erste! Wink

Nach welchen Kriterien such ich den Überlappungsfaktor aus??
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: 12.10.2011, 15:56     Titel:
  Antworten mit Zitat      
Bei einem Spektrogramm stellt man damit neben der Segmentlänge die Auflösung der Zeit- und Frequenzachse ein. Da du ja aber gar kein Spektrogramm erstellen willst, weiß ich das auch nicht.

Edit:

Zitat:
Ich will es einfach block für block fenstern, da meine signale wahrscheinlich nie periodisch sein werden--> weniger leakage!!


Wie kommst du denn darauf? Wie sieht denn dein Signal aus? Je mehr Messwerte man im Messfenster hat, desto besser wird die Frequzauflösung und der Leakage-Effekt ist dann ebenfalls in einem kleineren Frequenzbereich zu sehen. Das Segmentieren bringt dir in diesem Punkt keine Vorteile...oder steht das so in dem Buch?
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 16:25     Titel:
  Antworten mit Zitat      
Ja da hast du Recht, hab mich bissal blöd ausgdrückt, leakage ist nicht unbedingt mein hauptproblem.

Beispiel:
Fenster1-->FFT(Fenster1)
Fenster2-->FFT(Fenster2)

ist erster Wert von FFt(Fenster1) > erster Wert FFT(Fenster2) -->Übernehme Wert aus Fenster 1 in GesamtMax

ist zweiter Wert von FFT(Fenster1) <zweiter Wert FFt(Fenster2)--> Übernehme Wert aus Fenster2 in GesamtMax.......uswer

dann erster Wert FFT(Fenster3) > erster Wert GesamtMax--> übernimm größten wert...usw

bis zum Ende des Signals!!

Das ist so im großen und ganzen das was ich machen will!!
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 12.10.2011, 18:33     Titel:
  Antworten mit Zitat      
Hab mal kurz ein bissal mit fft herumexperimentiert. Könntest du bitte dir mal kurz mein progrämmchen ansehen und mir sagen was ich besser machen könnte??
Code:
%% Generation eines einfachen Sinus Signal zu Testzwecken
close all;
clear
clc

f0 = 10;                         % signal frequency
fs = 200;                        % sampling frequency
Ts = 1/fs;                       % time interval
t = 0:Ts:1-Ts;                   % time vector
y = 1*sin(2*pi*f0*t);
figure('Name','Simple Sine Wave','NumberTitle','off');
plot(t,y,'r');

%% Prüfung der Periodizität des Sinus Signals
% plot(t,y,'r-*');   mit diskreten Abtastpunkten
% testfigure = figure;
% t2 = (0:length(t)*2-1)/fs;
% plot(t2,[y y]);

%% FFT des Sinus Signals - Lineares Spektrum

NFFT = 2^nextpow2(length(y));    % FFT - Länge, Vielfaches von 2
Y    = fft(y,NFFT);              % FFT
f    = fs/NFFT*(0:NFFT-1);       % Skalierung der Frequenzachse
simpleFFTplot = figure;
plot(f,abs(Y));        % plot absolut von Y
grid on;


%% FFt Sinus Signal - Logarithmisches Spektrum

spec    = 20*log10(abs(Y));      % Logarithmisierung der Amplitude
logplot = figure;
semilogx(f, spec);
grid on;
title('logPlot');
xlabel('f[Hz]');
ylabel('Amlitude in dB');

%% Fensterung des Sinus Signals - Hanning Window

N   = 200;                        % aktive Fensterlänge
win = hann(N,'periodic')';        % Hanning Fenster der Länge 128
win_sig = win.*y(1:N);            % Fenster multipliziert mit Fenster
win_sig_plot = figure;
plot(t(1:N),win_sig);
grid on;
title('Gefenstertes Sinus Signal');

testwindow = figure;
plot((0:length(win_sig)*2-1)/fs, [win_sig win_sig]);
grid on;

%% FFT des gefensterten Sinus Signals
nx = length(win_sig);           % Länge des gefensterten Signals
freq = (fs/nx)*(0:nx-1);        % Frequenzvektor
fftwin = fft(win_sig);
fftwinPlot = figure;
semilogx(freq,20*log10(abs(fftwin)));
grid on


 

Warum ist der Peak im linearen Spektrum nicht exakt bei 10??
Was sind das für peaks nach unten im logarithmischen Spektrum
Wenn ich die fenstlänge gleich der signallänge setze ist der peak genau bei 10.
Setzte ich sie auf ein 2erpotenz, z.B 128 dann ist das Spektrum verzerrt, d.h der Peak nicht genau bei 10??

Ich kenn mich nicht mehr aus, was hab ich falsch gemacht??
Ich hoffe du bist es nich leid mir ständig zu helfen Shocked
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: 12.10.2011, 19:18     Titel:
  Antworten mit Zitat      
Weil deine Frequenzauflösung df kein vielfaches der Signalfrequenz f0 ist.

Code:

N = length(y) % hier 200 Messwerte
df= fs/N; % df = 1 Hz
% durch das Zeropadding ändert sich jedoch df, da N = 256 Messwerte
df= 200/256 = 0.78 Hz
% Damit kann keine Spektrallinie bei 10 Hz dargestellt werden
 



Schau dir einfach mal das umfassende FFT Bsp. in der Skriptecke an...da findest du alles notwendige zur Darstellung des Frequenzspektrums.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.