Softwareentwickler MATLAB/Simulink (w/m) Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLinkdSPACE GmbH - Paderborn
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
% 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 -10020*log10(a/2)+3]) axis([-fn fn -1003]) 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 -10020*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);
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
gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.06.2010, 12:59
Titel:
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);
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.
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
Gunnar
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.04.2011, 12:28
Titel:
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: ---
Verfasst am: 22.08.2011, 15:06
Titel: Fehlermeldung bei der Analyse von WAVE-Dateien
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!
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.
Options and Permissions
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.