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

DFT Berechnung

 

Hoize
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 21.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2011, 15:24     Titel: DFT Berechnung
  Antworten mit Zitat      
hallo,

kann mir irgendwer diese Aufgabe lösen?
muss es für die fh machen,komm jedoch gar nicht klar damit...:

Aufgabe:
Bestimmen Sie aus dem verrauschten Signal die DFT ohne Verwendung der vordefinierten FFT-Funktion in Matlab.

Erzeugung des verrauschten Signals:
X=0:0.01:2*pi*10;
Y=10*sin(x)+5*sin(3.*x)+3sin(5.*x)+sin(7.*x)+sin(11.*x)

Mathematische Beschreibung:
siehe Bild...
(e hoch 2*pi*i*j*k/N)

mfg und danke

2011-12-21 14.20.55.jpg
 Beschreibung:

Download
 Dateiname:  2011-12-21 14.20.55.jpg
 Dateigröße:  1.46 MB
 Heruntergeladen:  2137 mal
Private Nachricht senden Benutzer-Profile anzeigen


sepp123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2011, 15:40     Titel:
  Antworten mit Zitat      
tut mir leid ich kann dir nicht helfen ich glaube diese aufgabe ist generell unlösbar!
 
Noy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2011, 16:53     Titel:
  Antworten mit Zitat      
Code:
k=Anzahl;
 Y = zeros(k,1);
 
 for m=1:k
     for n=1:(Anzahl-1)
         Y(m)=(Y(m)+(AbtWe(n)*exp(-1i*((2*pi)/Anzahl)*m*n)));
     end
 end



Das ist die DFT wobei AbtWe() ein Array ist wo diene abgetasteten Werte deines Signals drin stehen k ist die Anzahl deiner Abtastwerte. Y() ist dein Array wo die Komplexen DFT Ergebnisse drin stehen.
Mit Y=zeros(k,1); wird einfach ein leerer Vektor mit 0 en erstellt.



Für die X Achse musst du
Code:
F=zeros(k,1);
 for m=1:k
   F(m)=m*Delta_F;
end


Delta_F ist eine Abtasttzeit (1/Abtastfrequenz).

Zum Plotten dann einfach

Code:


schrieben.

Bitte code-Umgebung verwenden - Danke, Jan S
 
Grave

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2012, 14:32     Titel:
  Antworten mit Zitat      
Hallo,
ich müsste mich hier auch mal einmischen. hab das jetzt mal so versucht zu "programmieren", wie es oben beschrieben ist, aber irgendwie komm ich da auf keinen grünen zweig. bekomme vollkommen unrealistische werte und das unten stehende diagramm.
Könnte mir da jemand vllt bissl auf die Sprünge helfen, ist wahrscheinlich nur wieder nen dummer fehler....

Code:
function [  ] = aa( input_args )
%AA Summary of this function goes here
%   Detailed explanation goes here


%Funktion erstellen
x=0:0.01:2*pi*10;  
y= 10*sin(x)+5*sin(3.*x)+3*sin(5.*x)+sin(7.*x)+sin(11.*x);


Anzahl= length(x);
k=Anzahl;
Y = zeros(Anzahl,1);
AbtWe=y;
Delta_F= (1/0.01);
 

 
 for m=1:Anzahl
     for n=1:(Anzahl-1)
          Y(m)=(Y(m)+(AbtWe(n)*exp(-1i*((2*pi)/Anzahl)*m*n)));
     end
 end



F=zeros(k,1);
 for m=1:k
  F(m)=m*Delta_F;
 end


plot(abs(Y),F);
end
 


Unbenannt.jpg
 Beschreibung:

Download
 Dateiname:  Unbenannt.jpg
 Dateigröße:  153.68 KB
 Heruntergeladen:  2018 mal
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.01.2012, 15:11     Titel:
  Antworten mit Zitat      
Es muss ja auch heißen...

Code:


Du solltest dir auch bewusst machen, dass hier ein beidseitiges Spektrum berechnet wird (negative und positive Frequenzen). Daher muss man auch vor der Darstellung noch fftshift(Y) verwenden, oder sich die Funktion selber schreiben. Da aber i.d.R. nur der positive Frequenzbereich interessiert, können in Y alle Werte nach k/2+1 abgeschnitten werden. Dann wird nur von 0...Fa/2 [Hz] dargestellt. Ob das andere richtig ist, habe ich allerdings nicht kontrolliert.
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: 06.01.2012, 15:14     Titel:
  Antworten mit Zitat      
Leider kann man nicht mehr editieren Question

Es fehlt auch noch die Skalierung von Y...ansonsten wird ein Sinus mit 10V Amplitude falsch dargestellt.

Ich kann euch nur das umfassende FFT Bsp. hier aus der Skriptecke empfehlen. Die DFT ist ohnehin viel zu langsam...
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: 06.01.2012, 15:20     Titel:
  Antworten mit Zitat      
Das man nicht editieren kann, nervt... Rolling Eyes

Es geht auch mit dem Frequenzvektor F nicht, ein beidseitiges Spektrum darzustellen. Dazu müsste er auch die negativen Freq. entahlten und nur bis zur halben Abtastfrequenz gehen.

Versuch mal folgendes...

Code:

N = k/2+1; % nur positiven Freq.-Bereich nutzen
ampl = abs(Y(1:N)); % Betrag bilden
ampl = [ampl(1)/k; ampl(2:N-1)/(k/2); ampl(N)/k]; % Skalieren
plot(F(1:N),20*log10(ampl + eps)); % Darstellung der Magnitude in dB
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Grave

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2012, 16:43     Titel:
  Antworten mit Zitat      
Erstmal vielen Dank für deien Hilfe.

Für ein Projekt müssen wir in Matlab das DFT mit der mathematischen Formel berechnen ohne einer vorgefertigten Matlab Funktion. Nur leider komme ich da nicht wirklich weiter.
Habe jetzt mal deine Lösung in das Programm eingefügt, aber leider kommt noch nicht das raus, was raus kommen müsste. Habe mal ein Bild mit dem Graphen, ebenso das was raus kommen müsste angehängt.

Ich hoffe und freue mich auf weitere Hilfe.

Unbenannt.jpg
 Beschreibung:

Download
 Dateiname:  Unbenannt.jpg
 Dateigröße:  68.91 KB
 Heruntergeladen:  2067 mal
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.01.2012, 17:23     Titel:
  Antworten mit Zitat      
In der Skizze ist wohl keine dB Skalierung verwendet worden und nur der niederfreq. Bereich dargestellt. Versuch es mal so...

Code:

fa = 2048; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 3000; % 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
y= 10*sin(t)+5*sin(3.*t)+3*sin(5.*t)+sin(7.*t)+sin(11.*t);

% Frequenzvektor 0...fn [Hz]
x_fn = 0 : df : fn;

Anzahl = N;
Y = zeros(Anzahl,1);

% DFT  
for m=1:Anzahl
  for n=1:(Anzahl-1)
       Y(m)=(Y(m)+(AbtWe(n)*exp(-1i*((2*pi)/Anzahl)*m*n)));
  end
end

k = N/2+1;
ampl = abs(Y(1:k));
ampl = [ampl(1)/N; ampl(2:k-1)/(N/2); ampl(k)/N];
plot(x_fn,ampl);
axis([0 50 0 10]);
xlabel('Frequenz in Hz')
ylabel('Magnitude')
grid on;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Grave

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2012, 18:18     Titel:
  Antworten mit Zitat      
Also einen kleinen Ausschlag hab ich jetzt, aber leider noch immer nicht, wie auf der skizze....
ich krieg noch die kriese....... Sad
Ich mein, ich will doch keine doktor arbeit schreiben, noch studier ich informatik. ^^
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.01.2012, 19:02     Titel:
  Antworten mit Zitat      
Sorry...so ist das, wenn man Sachen ändert und löscht und alte Werte noch im Workspace hat und nicht merkt, dass sie dennoch verwendet werden.

Es fehlt außerdem bei dem Testsignal y das 2*pi...es heißt nämlich
sin(2*pi*f * t)


Code:

fa = 100; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 3000; % Anzahl Abtastwerte
df = fa/N;
% Erzeugung eines Datensatzes mit N Abtastwerten
% ----------------------------------------------
t = 0 : 1/fa : (N-1)/fa; % x-Vektor
y = 10*sin(2*pi*t)+5*sin(2*pi*3.*t)+3*sin(2*pi*5.*t)+sin(2*pi*7.*t)+sin(2*pi*11.*t);

% Frequenzvektor 0...fn [Hz]
x_fn = 0 : df : fn;

Anzahl = N;
AbtWe = y;
Y = zeros(Anzahl,1);

% DFT  
for m=1:Anzahl
  for n=1:(Anzahl-1)
       Y(m)=(Y(m)+(AbtWe(n)*exp(-1i*((2*pi)/Anzahl)*m*n)));
  end
end


k = N/2+1;
ampl = abs(Y(1:k));
ampl = [ampl(1)/N; ampl(2:k-1)/(N/2); ampl(k)/N];
plot(x_fn,ampl);
axis([0 20 0 10]);
xlabel('Frequenz in Hz')
ylabel('Magnitude')
grid on;
 


Hier ist nun aber kein Leckage-Effekt aufgetreten, da die Frequenzauflösung df der DFT ein ganzzahliges Verhältnis zu den einzelnen Frequenzen des Testsignals (1,3,5,7 und 11 Hz) hat. In dem Bild sieht das etwas anders aus. In deinem Bsp. mit N = 6284 Werten hat df kein vielfaches Verhältnis zu y.
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2012, 20:23     Titel:
  Antworten mit Zitat      
Servus!!

Code:
fa = 100; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = 3000; % Anzahl Abtastwerte
df = fa/N;
% Erzeugung eines Datensatzes mit N Abtastwerten
% ----------------------------------------------
t = 0 : 1/fa : (N-1)/fa; % x-Vektor
y = 10*sin(2*pi*t)+5*sin(2*pi*3.*t)+3*sin(2*pi*5.*t)+sin(2*pi*7.*t)+sin(2*pi*11.*t);

% Frequenzvektor 0...fn [Hz]
x_fn = 0 : df : fn;

Anzahl = N;
AbtWe = y;
% Y = zeros(Anzahl,1);

% DFT  
Y = (AbtWe*exp(2i*pi*t.'*x_fn)).';
% for m=1:Anzahl
%   for n=1:(Anzahl-1)
%        Y(m)=(Y(m)+(AbtWe(n)*exp(-1i*((2*pi)/Anzahl)*m*n)));
%   end
% end


k = N/2+1;
ampl = abs(Y(1:k));
ampl = [ampl(1)/N; ampl(2:k-1)/(N/2); ampl(k)/N];
plot(x_fn,ampl);
axis([0 20 0 10]);
xlabel('Frequenz in Hz')
ylabel('Magnitude')
grid on;


Dürfte ein wenig schneller gehen.

Grüße!
Private Nachricht senden Benutzer-Profile anzeigen
 
Grave

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2012, 21:50     Titel:
  Antworten mit Zitat      
Vielen Dank!
ihr seids die größten Smile
 
FloG
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 11:52     Titel:
  Antworten mit Zitat      
Hallo zusammen

Ich habe eine Frage zu folgender Code-Zeile:
Code:
ampl = [ampl(1)/N; ampl(2:k-1)/(N/2); ampl(k)/N];


Dass der Eintrag amp(1) nur durch N geteilt wird und der Rest durch 2/N ist mir klar. Warum wird aber hier der letzte Wert amp(k) wieder nur durch N geteilt? welcher Frequenz entspricht der wert amp(k)? 0Hz oder fa/2?

Damit nur das Einseitige (positive) Amplitudenspektrum angezeigt wird nutzt man:
Code:
abs(Y(1:N/2+1));


Das habe ich verstanden. Nur wie ist es wenn ich eine ungerade Anzahl von N habe? (Ja ich weiss es wird der langsamere DFT Algorithmus verwendet wenn N keine Zweierpotenz ist)
N=1000 -> Frequenzachse von 1:1000/2+1 = 501
N=1001 -> Frequenzachse von 1:abs(1001/2) = 501 ??? oder abs(1001/2+1) = 502 ??? (=points)

Ich möchte ja meine Frequenzachse erstellen und normieren:
Code:
f_achse = fa/2*linspace(0,1,points);


Warum habe ich überhaupt ungerade Werte von N? -> Anpassung an Signalfrequenz um Leck-Effekt zu minimieren.
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: 14.06.2012, 12:20     Titel:
  Antworten mit Zitat      
Wenn k = N/2+1 dann ist amp(k) die Amplitude bei der Nyquistfreq. = fa/2. Wenn N = gerade, dann ist der Gleichsignalanteil, wie auch die Nyquistfreq. nur einmal in Y = fft(signal) enthalten. Alle Freq.-anteile dazwischen kommen doppelt vor, für den positiven und negativen Freq.-bereich. Die Energie ist hier auf beide verteilt. Daher darf man zur Darstellung des pos. Spektrums diese Freq.teile auch nur mit N/2 skalieren. Ist N ungerade, liegt die Nyquistfreq. jedoch zwei mal vor und darf deshlab nicht mit N skaliert werden. Da der Wert bei der Nyquistfreq. ohnehin oft fehlerbehaftet ist, wird er in der Darstellung oft weggelassen...also nur bis N/2.

Für die Erstellung der Freq.achse würde ich dir folgende Art empfehlen. Das df ist nämlich entscheidend, da ja hieraus erschlossen werden kann, ob Leakage vorliegt (ist ja hier auch weiter oben beschrieben).

Code:

fa = ...; % Abtastfrequenz
fn = fa/2; % Nyquistfrequenz
N = ....; % Anzahl Abtastwerte
df = fa/N; % Frequenzauflösung

% Frequenzvektor 0...fn [Hz]
x_fn = 0 : df : fn;
% oder Nyqistfreq. weglassen
x_fn = 0 : df : fn - df;
 


Warum N gerade oder ungerade ist, hängt doch mal in erster Linie mit der Aufnahmezeit zusammen Wink. Für die FFT/DFT ist das erstmal nicht relevant. Du kannst dann, um die FFT nutzen zu können, durch Zeropadding auf die nächste 2er Potenz verlängern oder aber etwas vom Signal abschneiden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2025 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.