goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

Mathematik mit MATLAB

Fachkräfte:
Softwareentwickler MATLAB/Simulink (w/m)
Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLink
dSPACE GmbH - Paderborn

Testingenieur (w/m) Testframework für Simulink-basierte Echtzeitanwendungen
Pflege des MATLAB/Simulink-Testframeworks, Spezifizieren von Testkriterien, Testfällen und Testszenarien
dSPACE GmbH - Paderborn

Testingenieur (w/m) Konfigurationswerkzeuge für Echtzeitsysteme
Einbinden von Simulink®-Simulationsmodellen, Verteilung der Simulationsmodelle auf Multicore- und Multiprozessorsysteme
dSPACE GmbH - Paderborn

Senior Systemingenieur/in
Entwicklung von Funktionen im Bereich Antrieb Automotive
ESG Elektroniksystem- und Logistik-GmbH - München

Entwicklungsingenieur/-in Systemengineering - Software - Landmaschinengetriebe
Anforderungsmanagement, Softwareentwicklung, Systemanalysen
ZF Friedrichshafen AG - Friedrichshafen

weitere Angebote

Partner:




Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

FFT: Umfassendes Beispiel

 

Nils
Forum-Newbie
Forum-Newbie

Beiträge: 5
Anmeldedatum: 23.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2008, 13:38     Titel: FFT: Umfassendes Beispiel
  Antworten mit Zitat      
Hallo hier ein Skript zum Verständnis der FFT:
- Abtastfrequenz
- FFT Auflösung
- Fensterung
- FFT Shift
- Logarithmische Darstellung

Code:

% Zeitbereich
% ----------------------------------

fa = 8000; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 1024; % gewünschte FFT-Länge (N=2^x, sonst wird der DFT-Algorithmus verwendet!)
df = fa/N; % Frequenzauflösung
% Erzeugung eines Datensatzes mit N Abtastwerten
% ----------------------------------------------
t = 0 : 1/fa : (N-1)/fa; % x-Vektor
% Frequenzvorgabe in Hz als ganzzahlig Vielfaches der Frequenzauflösung der DFT/FFT:
f1 = df*100; % bei fa = 8000 Hz und N = 1024 beträgt df = 7,8125 Hz und
% f1 damit 781,25 Hz
 f1 = 784;
 f1 = df;
 phase = pi/2;

a1 = 1; % Amplitudenvorgabe
y = a1*sin(2*pi*f1*t); % y-Vektor
y = [y(1:N/2) zeros(1, N/2)];
% Graphische Darstellung
% ----------------------
% max. Amplitude zur Skalierung der graphischen Darstellung feststellen:
max_y = max(abs(y))*1.1;
fig = figure(1);
plot(y)
axis([0 N -max_y max_y])
title('Datensatz')
ylabel('Amplitude')
xlabel('N Stützstellen')
grid


% Frequenzbereich
% ----------------------------------

% Berechnung der FFT
% ------------------
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengang = fftshift(amplH/N);
% Graphische Darstellung
% ----------------------
% Frequenzvektoren (werden bei der graphischen Darstellung benötigt):
x_fn = 0 : df : fn-df;
x_fa = 0 : df : fa-df;
% max. Amplitude zur Skalierung der graphischen Darstellung feststellen:
%a = max([a1, a2, a3, a4, a5]); % wird später benötigt
a = a1;
fig = figure(fig+1);
stem(x_fa-fn, amplitudengang, 'b.-')
axis([-fn fn 0 a/2*1.1])
title('Amplitudengang')
ylabel('Amplitude')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Ausgabe in dB
% ------------------
fig = figure(fig+1);
plot(x_fa-fn, 20*log10(amplitudengang))
%axis([-fn fn -100 20*log10(a/2)+3])
axis([-fn fn -100 3])
title('Amplitudengang')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Darstellung des interessierenden Frequenzbereichs des
% Amplitudengangs (0...fn) und
% daran angepasste Amplitudenskalierung (Normierung auf N/2):
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2)]; % DC-Bin auf N normieren!
fig = figure(fig+1);
stem(x_fn, amplitudengang, 'b.-')
axis([0 fn 0 a*1.1])
title('Amplitudengang')
ylabel('Amplitude')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Ausgabe in dB
% ------------------
fig = figure(fig+1);
plot(x_fn, 20*log10(amplitudengang))
axis([0 fn -100 20*log10(a)+3])
title('Amplitudengang')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid


% Fensterfunktion
% ----------------------

% Anhang an die bereits erfolgte Untersuchung
% -------------------------------------------
win = hann(N)';
%y_win = y.*win; % Fensterung ohne Amplitudenkorrektur
y_win = y.*win*N/sum(win); % Fensterung mit Amplitudenkorrektur
max_y = max(abs(y_win))*1.1;

fig = figure(fig+1);
plot(y_win)
axis([0 N -max_y max_y])
title('Datensatz nach Fensterung mit Hann-Fenster')
ylabel('Amplitude')
xlabel('N Stützstellen')
grid

% Berechnung der FFT
% ------------------
H = fft(y_win, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengang = fftshift(amplH/N);

% Graphische Darstellung
% ----------------------
fig = figure(fig+1);
stem(x_fa-fn, amplitudengang, 'b.-')
axis([-fn fn 0 a/2*1.1])
title('Amplitudengang nach Fensterung')
ylabel('Amplitude')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid

% Ausgabe in dB
% ------------------
fig = figure(fig+1);
plot(x_fa-fn, 20*log10(amplitudengang))
%axis([-fn fn -100 20*log10(a/2)+3])
axis([-fn fn -100 3])
title('Amplitudengang nach Fensterung')
ylabel('Amplitude in dB')
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz'])
grid
 


Viel Spaß
Nils
Private Nachricht senden Benutzer-Profile anzeigen


Holzi
Forum-Anfänger
Forum-Anfänger

Beiträge: 23
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2010, 11:40     Titel:
  Antworten mit Zitat      
danke für die umfassende Doku.. was würde man ändern müssen um eine DFT zu realisieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Forum-Fortgeschrittener
Forum-Fortgeschrittener

Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2010, 15:32     Titel: FFT
  Antworten mit Zitat      
Hallo Zusammen,

bezüglich zum Script "FFT Umfassendes Beispiel" habe ich ein paar Fragen.
Soll 'df' für 'delta f' stehen und die Fensterlänge angeben, also die Länge des Ausschnittes? Oder was soll die Frequenzauflösung sein? Es ist ja der Quotient aus der Abtastfrequenz und der Anzahl der Abtastungen.

Des weiteren möchte ich anstatt des selbst initialisierten Signals eine kurze , ca. 5 s lange Audiodatei mittels 'wavread'einlesen. Wie würde sich diesbezüglich df und f1 verändern?

Lieben Gruß und Dank

Tim
Private Nachricht senden Benutzer-Profile anzeigen
 
gast
Gast

Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2010, 12:59     Titel:
  Antworten mit Zitat      
Hallo,
hab eine kleine Frage zu folgendem Teil:

Code:

H = fft(y_win, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);
% Amplitudenskalierung (Normierung auf N) und verschieben der Elemente des
% Amplitudenvektors, so dass die Darstellung des Amplitudengangs von -fn...0...fn
% erfolgen kann:
amplitudengang = fftshift(amplH/N);
 


Warum muss man hier die Amplitude korrigieren?

Danke
 
Astra
Gast

Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2010, 04:22     Titel: Matlab-Anfänger
  Antworten mit Zitat      
hallo

danke vorerst mal dass du dein code veröffentlichst. Ich bin an meiner diplomarbeit dran. Ich möchte gerne dein code vewenden, jedoch möchte ich es mit dat.-file verknüpfen. Das Programm soll mein dat-file aus der messung verwenden. Mein datfile enthält 2 zeilen und gewisse Anzahl spalten (so kann man die Abtastfrequenz und die anzahl Messwerte ermitteln). Mein dat.file enhält den Verlauf der Zeit-Amplitude meines Beschleunigungssensors.

Hat jemand eine Lösung wie ich diesen code schreiben kann. Als Grundlage dazu dient der Code von Nils.

Vielen Dank
Gruss Astrit
 
Germanus
Forum-Anfänger
Forum-Anfänger

Beiträge: 30
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 27.01.2011, 19:20     Titel: Frage
  Antworten mit Zitat      
Hey Nils und andere Wissende,

ich habe zwei Fragen zur Realisierung der Fensterung.

1.) Frage:
Was steckt hinter der Amplitudenkorrektur? Oder anders gesagt, warum wird (für ein breites Fenster) die Amplitude mit "2" multipliziert?
Anmerkung: sum(Hann(N-> unendlich)) -> N/2

Code:

%y_win = y.*win; % Fensterung ohne Amplitudenkorrektur
y_win = y.*win*N/sum(win); % Fensterung mit Amplitudenkorrektur
 


2.) Frage:
Für die Fast-Fourier muss ja wegen des Algorithmusses im vgl. zur DFT mit N=2^n Elementen (nextpow2) gearbeitet werden. Entspricht die Anzahl der Elemente nicht diesem Kriterium werden die fehlenden Elemente durch Nullen aufgefüllt.
Muss bei Verwendung der FFT die Fensterung nun VOR oder NACH der "Erweiterung" erfolgen?

Vielen Dank für eine Antwort,
Germanus
Private Nachricht senden Benutzer-Profile anzeigen
 
Gunnar
Gast

Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2011, 12:28     Titel:
  Antworten mit Zitat      
Moin,
Fensterung immer vor dem ZeroPadding machen. Du willst ja durch die Fensterung vermeiden, künstliche Sprünge zum Signal hinzuzufügen. Wenn du erste Nullen anhängst, und dann das ganze fensterst, hast du irgendwo mittendrin ja immernoch den Sprung.
 
Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2011, 15:06     Titel: Fehlermeldung bei der Analyse von WAVE-Dateien
  Antworten mit Zitat      
Hallo Leute,
ich habe das Problem, dass wenn ich anstatt von der Sinus-Halbwelle, die im diesem Beispiel verwendet wird, eine Wave-Datei analysieren möchte, dann bekomme ich eine Fehlermeldung:

??? Error using ==> horzcat
CAT arguments dimensions are not consistent.
Error in ==> fft_t at 84
amplitudengang = [amplH(1)/N amplH(2:N/2)/(N/2)]; % DC-Bin auf N normieren!

Hat jemand eine Ahnung, wo das Problem ist? Vielleicht die Datenmenge oder Eingangsvektorlänge?
Für schnelle Hilfe oder Lösungsvorschläge währe ich dankbar!

Gruß
Oleg
 
DSP
Forum-Meister
Forum-Meister

Beiträge: 847
Anmeldedatum: 28.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2011, 16:59     Titel:
  Antworten mit Zitat      
Um dir da helfen zu können, wäre schon mal der Code bis zu dieser Stelle nützlich.

_Peter_: Bitte das Problem aber in einem seperaten Thread in "Programmierung" diskutieren. Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.