Verfasst am: 12.10.2011, 09:45
Titel: Analyse-FFT-/Fenster Programm
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!!
Kommt mir irgendwie bekannt vor...es gibt eine Funktion in Matlab Namens spectrogram. Sie macht die gleiche Berechnung
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.
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!!
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!!
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.
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
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? ifmod(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
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!!
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
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?
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 closeall;
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;
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
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
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
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.