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

FFT eines künstlichen Signals

 

plakstift
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 24.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2014, 16:09     Titel: FFT eines künstlichen Signals
  Antworten mit Zitat      
Hallo,

ich kann mir nicht so wirklich erklären, wie die Form meines Frequenzspektrums zu stande kommt.
Ich habe mir ein künstliches Signal gebastelt, bestehend aus überlagerten Sinusschwingungen mit Frequenzen von 1000 bis 10000 Hz in tausender Schritten.

Code:
abtast = 44100; %abtastrate
zeit =  10; %sekunden
zeitvektor = 0:1/abtast:zeit;
frequenz = 2000; %frequenz des signals
frequenzvektor = [1000 2000 3000 4000 5000 6000 7000 8000 9000 10000];
ywerte = zeros(length(frequenzvektor),length(zeitvektor));

for i = 1:length(frequenzvektor)
ywerte(i,:) = sin(2*pi*zeitvektor*frequenzvektor(i));
end
y = sum(ywerte,1);

ywert2 = sin(2*pi*zeitvektor*frequenz);

 figure
 plot(zeitvektor,y);
 xlim([0 0.01])

wavwrite(y,abtast,'sinussignalvektor');


Meine FFT:

Code:
[data,samplingrate] =  wavread('sinussignalvektor.wav');

laenge = length(data);
dt = 1/samplingrate;
zeit = (0:(laenge-1))*dt;

NFFT=2^nextpow2(laenge); %laenge zweier potenz

win = gausswin(laenge,3.0);
figure
plot(win);

y_win = data.*win;
y=fft(y_win,NFFT)/laenge;

yplot = fftshift(abs(y)/NFFT);

maximum = max(yplot);
minimum = min(yplot);
yplotneu = (yplot - minimum)./(maximum - minimum); %normierung

f=samplingrate*linspace(0,1,NFFT); %frequenzachse %f=samplingrate/2*linspace(0,1,laenge/2+1);
fshift = f - samplingrate/2;

figure;
subplot(2,1,1)
plot(zeit,(data));
axis tight
xlabel('Zeit')
ylabel('Amplitude')
subplot(2,1,2)
plot(fshift,yplotneu);
%xlim([50 20000])
xlabel('f[Hz]');
title('mit')


Ich sehe ja die wichtigen Frequenzen, aber warum habe ich trotz Benutzung des Gausfensters weiterhin Amplituden in Form der Sinc-Funktion, was ja bei einem Rechteckfenster passiert.
Andere Fenster hab ich auch schon probiert, passiert immer das gleiche.

Ist das ein Nebeneffekt (wenn ja, welcher?) den ich so hinnehmen muss, oder ist doch was falsch an meinem Code?

Im Anhang nochmal mein Frequenzspektrum ...

Ich danke schonmal im vorraus für Ideen, Ratschläge und Ähnlichem. Smile

Grüße

frequenzspektrum.PNG
 Beschreibung:

Download
 Dateiname:  frequenzspektrum.PNG
 Dateigröße:  9.44 KB
 Heruntergeladen:  482 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: 24.10.2014, 17:59     Titel:
  Antworten mit Zitat      
Hallo,

ich empfehle dir folgendes Skript: http://www.gomatlab.de/fft-umfassendes-beispiel-t777.html
mal genauer in Bezug auf Skalierung und Fensterung anzusehen.

Außerdem lies dich mal zum Thema Leckage (Leck-) Effekt ein. Genau dieses Phänomen tritt hier auf. Dies hat mit der Auflösung df des Frequenspektrums zu tun.

Code:

fa = % Abtastfreq.
df = fa/Nfft; % Frequenzauflösung
 


Nur Frequenzen in deinem Testsignal, die ein GANZES vielfaches von df sind, können richtig dargestellt werden. Liegt eine Signalfreq. dazwischen, kommt es zu diesem Verschmieren des Spektrums um die Signalfreq. herum/weitere Spektrallinien rechts und links des lokalen Maximums. Das lässt sich auch nicht mit einem Fenster beheben, sondern lediglich verringern.
Private Nachricht senden Benutzer-Profile anzeigen
 
plakstift
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 24.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2014, 22:08     Titel:
  Antworten mit Zitat      
Hallo,

dankeschön erstmal für die Antwort.

Das Skript hatte ich mir schon angeguckt und hab da auch die Codezeilen mit der Fensterung. Ich glaub, dass ein Gaussfenster nicht die beste Wahl ist. Nehme dann doch lieber das Hanningfenster.
Die Skalierung der y-Achse hab ich so gewählt, weil ich für eine spätere Analyse von Signalen keine Aussage über die wirkliche Amplitude der Frequenzen treffen kann. Die Skalierung der x-Achse auf den relevanten Frequenzbereich wurde einfach weggelassen, damit ich einmal alles darstellen kann. Oder meintest du damit was anderes?

Das mit den Leck Effekt hab ich jetzt verstanden. Hab erst gedacht, dass die nur bei nicht periodisch fortgesetzten Signalen auftreten.
Trotzdem sorgen diese ja nur für eine Verschmierung des Signals. Warum jetzt die Amplituden bei den anderen Frequenzen abnehmen und dann wieder ansteigt, ist doch damit nicht erklärt, oder? Obwohl alle Sinusschwingen eine Amplitude von 1 haben, ist diese im Frequenzspektrum viel geringer ...
Hoffe jetzt, dass ich doch nicht falsch skaliere.
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: 25.10.2014, 09:17     Titel:
  Antworten mit Zitat      
Leackage führt nicht nur zu den Nebenmaxima an der eigentlichen Signalfrequenz, sondern auch zu einer Verringerung dessen Amplitude. Der Fehler ist dann am Größten, wenn die Signalfreq. genau in der Mitte von df liegt.

Aber deine Skalierung von Y = fft(...) ist auch nicht korrekt. Du teilst erst durch Länge und dann aber nochmal durch Nfft. Es sollte aber nur durch Nfft sein.

Code:

% 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);
 



Ebenfalls aus dem verlinkten Skript noch etwas zur Verwendung eines Fensters...
Code:

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

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


Die Wahl des Fenster hängt davon ab, was man damit erreichen will. Es gibt Fenster wie Hann, welche die Nebenmaxima minimieren, aber den Fehler der Amplitude nur wenig beheben. Das Flattop Window wäre hingegen sinnvoll, wenn man Wert auf Amplitudengenauigkeit legt. Hier sind dann aber die Nebenmaxima stärker als bei Hann etc.
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.