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

falsche Amplitude DFT

 

patalmqx
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2013, 11:33     Titel: falsche Amplitude DFT
  Antworten mit Zitat      
Hallo Freunde der Mathematik,

ich versuche mich über die DFT an die FFT heranzutasten, und zwar mit der Hilfe von Matlab. Ich habe mir eine einfache Funktion dafür ausgesucht:
http://www.imgbox.de/show/img/M1QKEpvNzG.JPG
http://www.imgbox.de/show/img/loBZH67QaI.png

Per Handrechnung bin ich über die Fourierreihen zu folgendem Amplitudenspektrum gelangt, was für mich jetzt auch erstmal logisch aussieht:
http://www.imgbox.de/show/img/7lvdHxAdCF.png

Mit HöMa 2 von Vachenauer habe ich folgenden DFT Code versucht:
Code:
clear;
n=500;
per=1;
dt=per/n;
%Diskretisierung
for i=1:1:n
    t(i)=dt*i;
    y(i)=2*sin(2*pi*t(i))+sin(6*pi*t(i))+cos(6*pi*t(i));
    xa(i)=i/per;
end
y=y';
%Kontrollplot
%plot(t,y);
ft=dftmtx(n);
%Spektralkoeffizienten c erzeugen
c=(1/n)*ft*y;
%Betrag der Koeffizienten
for i=1:1:n
    cn(i)=abs(c(i));
end
%Plot auf relevanten Frequenzbereich beschränken
xa(50:end)=[];cn(50:end)=[];
plot(xa,cn,'.')


Der Plot des Spektrums liefert jedoch nur 1/2 so hohe Amplituden..ich habe nach langer Suche etwas von einer Multiplikation der Amplitude mit Faktoren zum Erhalten der Energie (?) gefunden. Wirklich schlau bin ich daraus leider noch nicht geworden. Kann mich jemand erhellen?

Danke!

funkt.JPG
 Beschreibung:

Download
 Dateiname:  funkt.JPG
 Dateigröße:  12.8 KB
 Heruntergeladen:  1169 mal
signal.png
 Beschreibung:

Download
 Dateiname:  signal.png
 Dateigröße:  18.01 KB
 Heruntergeladen:  1201 mal
amplitudenspektrum.png
 Beschreibung:

Download
 Dateiname:  amplitudenspektrum.png
 Dateigröße:  7.66 KB
 Heruntergeladen:  1171 mal
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: 10.05.2013, 11:58     Titel:
  Antworten mit Zitat      
Da ich nicht weiß, was die Funktion dftmtx macht, wäre es nur raten. Bei der matlab FFT Version ist es folgendermaßen. Man erhält ein zweiseitges Frequezspektrum von -fs/2...0...+fs/2. Bei einer 2^x Anzahl an Messwerten, was ja für eine FFT erforderlich ist, kommen der Gleichsignal Anteil wie auch die Nyquistfreq. (fs/2) nur einmal in dem Outputvektor der FFT vor. Die restlichen Werte sind konjugiert komplex zueinander und haben eben nur die halbe Amplitude. Will man nur den positiven Freq.bereich darstellen, muss eben anders skaliert werden. Siehe folgende Funktion:

Code:

function [mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa) ;
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% ist nfft keiner 2er Potenz, wird der langsamere DFT Algorithmus verwendet
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2

% un-,gerade Anzahl Messwerte?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum  
Fy_pos0 = abs(Fy(1:k));
 
%   Skalierung  
mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
patalmqx
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2013, 09:06     Titel:
  Antworten mit Zitat      
Die dftmtx(n) erzeugt die Fouriermatrix der Größe nxn, die in der DFT benötigt wird. In HöMa 2 von Vachenauer wird diese auch verwendet. http://www.mathworks.de/de/help/signal/ref/dftmtx.html
Ich versuche mal, Deinen Code zu verstehen.

Im Microcontroller.net Forum meinte jemand, meine DFT Ergebnisse seien korrekt und lediglich meine Handrechnung hat zu zu großen Amplituden geführt. Mit den händisch berechneten Koeffizienten kann ich jedoch die exakte Ausgangsfunktion durch Einsetzen in die Fourierreihe erhalten..

ber2.PNG
 Beschreibung:
Handrechnung 2

Download
 Dateiname:  ber2.PNG
 Dateigröße:  28.49 KB
 Heruntergeladen:  1195 mal
ber1.PNG
 Beschreibung:
Handrechnung 1

Download
 Dateiname:  ber1.PNG
 Dateigröße:  12.73 KB
 Heruntergeladen:  1216 mal
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: 15.05.2013, 11:11     Titel:
  Antworten mit Zitat      
So fern keine Leakage auftritt muss die Amplitude im Betragsspektrum die Amplitude des Testsignals zeigen. Nur bei Leakage wird die Amplitude kleiner sein...

Code:
Fs=1024;
N=1024;
t=0:1/Fs:(N-1)/Fs;
df = Fs/N; % = 1 somit werden alle Frequenzen in y1, die ein ganzes Vielfaches von df sind korrekt wiedergegeben. Hier tritt kein Leakage auf. Besteht kein ganzes vielfaches Verhältnis zu df = Leakage = geringere Amplitude.

f1 = 10 * df;
f2 = 25*df;

y=2*sin(2*pi* f1* t)+sin(2*pi*f2 * t)+cos(2*pi* f2 *t);
% ich verwende hier die zuvor gepostete Funktion
[mag, mag_dB, fv] = FFT_betragsspektrum( y, N, Fs) ;
figure(1)
plot(fv,mag);grid on;
xlabel('Frequenz in Hz');
ylabel('Amplitude');

figure(2)
y1=2*sin(2*pi* f1 * t);
y2=sin(2*pi* f2 * t)+cos(2*pi* f2 * t);
plot(t,y1,t,y2); grid on;
xlabel('Zeit in s');
ylabel('Amplitude');
 


Wie du hier siehst stimmt die Amplitude im Betragsspektrum mit dem Testsignal y1 + y2 überein.
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 - 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.