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

Hamming-Fenster anwenden

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.10.2011, 15:41     Titel:
  Antworten mit Zitat      
Die Anzahl für nfft = 4096 waren nur ein Bsp. Wie gesagt hängt die tatsächliche Anzahl an Messwerten innerhalb von 20 sek von der Abtastrate ab. Die kenne ich ja nicht Wink

Ich habe hier noch vergessen...das Fenster darf natürlich nur die Länge von nfft haben.
Code:
...
win = hamming(nfft);
for i=1:k
    % Fensterung mit Hamming window
    signal_win = signal(m:nfft+m-1) .* win;
    H = fft(signal_win, nfft);
    % Betrag bilden und positiven Frequenzbereich speichern
    H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
    % nächstes Segement
    m = m + nfft;
end


Der Betrag ist die Länge des komplex. Zeigers...wenn du die Signalamplituden darstellen willst, benötigt man den Betrag. Die fft() Funktion berechnet eine beidseitges Spektrum von -fa/2...0...+fa/2 [Hz] mit fa = Abtastfrequenz. I.d.R. interessiert aber nur der positive Frequenzbereich, weshalb ich den negativen Bereich einfach nicht mit speicher.

H(1) = Amplitude bei f = 0
H((nfft/2)+1) = Amplitude bei f = + fa/2

Du solltest dir mal die Dokumentation des fft() Befehls anschauen und außerdem mal das umfassende FFT Bsp. hier in der Skript-Ecke. Ich habe den Eindruck, dass dir Grundlagen zur Fouriertransformation fehlen.
Private Nachricht senden Benutzer-Profile anzeigen


Mike1221

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 09:43     Titel:
  Antworten mit Zitat      
Guten Morgen DSP,

leider hast Recht, Ich muss die Grundlagen der FFT richtig nachholen Sad
Ich habe eien Abtastrate von 8Hz dh glaube ich 2^8 = 256 Messwerte für 10s
mein code sieht jetzt so aus:

Code:

betragX = IA();

signal = betragX;



% Länge des Gesamtsignals
N = length(signal);

% Bsp.: 10 sek sind 2^8 =256 Messwerte bei 10s
nfft = 256;
% Anzahl der Segmente bestimmen
k = round(N/nfft); % hier muss angepasst werden, was passieren soll, wenn k nicht ganzzahlig ist...was passiert mit den restlichen Werten???
% k Segmente der Länge nfft transformieren
% pre-allocate
H = zeros(nfft,1);
Hpos0 = zeros(nfft,k);
m = 1;
win = hamming(nfft);
for i=1:k
    % Fensterung mit Hamming window
    signal_win = signal(m:nfft+m-1) .* win;
    H = fft(signal_win, nfft);
    % Betrag bilden und positiven Frequenzbereich speichern
    H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
    % nächstes Segment
    m = m + nfft;
    plot(H)
end
 


Ich bekomme aber einen FFT verlauf den nicht klar ist (siehe Anhang).
habe Ich was falsches hier auch gemacht?

Danke für deine Unterstützung

H.fig
 Beschreibung:

Download
 Dateiname:  H.fig
 Dateigröße:  4.5 KB
 Heruntergeladen:  659 mal
 
Mike1221

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 09:58     Titel:
  Antworten mit Zitat      
und noch eine Frage DSP,
kennst du ein gutes Signalverarbeitung buch mit dem ganzen Grundlagen?
Ich würde gerne meine Schwache Kenntnisse verstärken .

Ich danke dir vielmals.
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.10.2011, 10:17     Titel:
  Antworten mit Zitat      
Schau dir doch mal bitte dieses Skript an, in Bezug auf die Darstellung, wie du dir den Frequenzvektor erzeugst etc. Das plotten von H macht hier gar keinen Sinn, da dies komplexe Werte sind. Willst du denn wirklich alle Einzelsegmente darstellen...ich dachte du willst ein Gesamtspektrum haben. Dann musst du die Hpos(:,i) irgendwie zu einem zusammenfassen. Z.B. durch Mittelung.

http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html

Bist du dir sicher, dass du eine Abtastfrequenz von 8 Hz hast? Kennst du denn das Abtasttheorem? Wenn nicht, unbedingt nachlesen. Mit 8 Hz kannst du maximal Signale mit einer Frequenz von 4 Hz richtig rekonstruieren.

Bsp: fa = 100 Hz
Ta = 1/fa = 0.001 sek = 10 ms
Bei einer Messzeit von 20 sek ergeben sich damit 20*100 Messwerte/sek = 2000.

Mit der Lektüre ist das etwas schwierig...es kommt darauf an, was du wissen möchtest. Für den Einstieg gibt es genügend freie Skripte im Netz...suche dir einfach zum Thema Signalverarbeitung, Fouriertransformtion und Frequenzspektrum Skripte von Hochschulen. Das sollte für den Anfang reichen.

Edit: Ist zwar in Englisch, aber dennoch recht leicht verständlich. Vor allem bekommt man ein Grundverständnis der Signaltheorie ohne zunächst mit zu viel Mathematik erschlagen zu werden. Kapitel 8-12

http://www.dspguide.com/ch8.htm
Private Nachricht senden Benutzer-Profile anzeigen
 
Mike1221

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2011, 13:20     Titel:
  Antworten mit Zitat      
Code:
% 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))


Hi DSP,
ich will jetzt die H_pos0 über die Frequenz plotten:

Code:

fs = 8;
df = fs/N; %N=4805000
f = [0:(nfft/2)] * df;
plot(f,H_pos0(1:k)))
 


Ich bekomme aber diese Fehler:

Error using ==> plot
Vectors must be the same lengths.

also die beiden Vektoren müssen gleiche Länge haben

aber :
>> size(f)

ans =

1 41
und:
>>size(H_pos0(1:k))

ans =

1 60100

meien Frage ist:
H_pos0(1:k) gibt Alle beträge der FFT von 1:k
also die x-Achse ist die Frequenz achse und y-achse die Betrag achse oder??
d.h normalerweise wenn ich plot(H_pos0(1:k)) eingebe ohne f wird die Darstellung automatisch über f oder?

Danke
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.10.2011, 17:22     Titel:
  Antworten mit Zitat      
Was soll denn der obere Code? Er gehört zu einer Funktion für ein Spektrogramm. Du willst doch aber das Amplitudenspektrum darstellen und dabei das Zeitsignal segmentieren.

Auf Grund deiner Fragen macht es nicht den Eindruck, dass du meine Zeilen wie auch das FFT-Skript mal nachvollzogen hast. Da macht das Helfen nicht wirklich Spaß, denn ich erkläre ungern alles 3-mal.

Code:

fs = 8; % Was soll denn 8 sein...8 Hz? Ich habe dich dazu schon auf das Abtasttheorem hingewiesen
df = fs/nfft; % Frequenzauflösung: nfft = Segmentlänge
fn = 0.5 * fs % Nyquistfrequenz
x_fn = 0 : df : fn % Frequenzachse für plot in [Hz] von 0...fn
 


Nehmen wir an dein Signal hat 4096 Messwerte und du willst es in 256er Segmente teilen und transformieren. Es gibt dann also 16 Segmente der Länge 256. H_pos0 enthält nur den positiven Frequenzbereich, womit das Amplitudenspektrum eines Segments nur noch die Länge 129 hat (und nicht mehr 256). Da H_pos aber alle 16 Segmente enthält, hat es nach der Transformation (in der for-Schleife berechnet) die Größe H_pos0(129x16).

Hiermit stellst du nun das erste Segment dar.
Code:
plot(x_fn, H_pos0(:,1))


Wenn du nun alle Segmente darstellen willst, musst du alle Segmente in ein Segment zusammenfassen. Ansonsten geht es nicht darzustellen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.