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

Fast Fourier Transformation so korrekt? Warnung?

 

Richard
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 11:38     Titel: Fast Fourier Transformation so korrekt? Warnung?
  Antworten mit Zitat      
Hallo Leute,

ich muss nun öfter mit der FFT arbeiten. Könnte sich jmd mal meinen Code anschauen und plausibilisieren? Der spuckt mir auch eine gute FFT aus, nur ich erhalte ebenso eine Warnung, warum?

Code:
%% fft
fft_variable = v;                           %fft Variable kennzeichnen
L=length(fft_variable);                     %Länge der Wertereihe kennzeichnen, hier über gesamten Zeitraum
time_range = (0:L-1)/Af;
Y = fft(fft_variable);
Y = Y(1:L/2);                               %Hälfe raus, da fft symmetrisch
Ampl = abs(Y);                              %Amplitude von Y                                                                      
fb=Af*(0:(L/2-1))/L;                        %Frequenzbereich definieren
figure('Name','fft von der Geschwindigkeit','NumberTitle','off');
subplot(2,1,1),plot(t,fft_variable)         %Originaldiagramm
grid on, title('Geschwindigkeit');
xlabel('time'),ylabel('v')
subplot(2,1,2),plot(fb,Ampl)
grid on, title('Amplitudenspektrum der Geschwindigkeit');
xlabel('f(Hz)'),ylabel('Amplitude')
xlim([0,750])



Die Warnung ist:

Warning: Integer operands are required for colon operator when used as index
> In auswertung_shaker (line 99)

Die Warnung betrifft die Zeile: Y = Y(1:L/2);

Wie bekomme ich die weg? Möchte das natürlich sauber haben...

Danke schon mal.
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 11:56     Titel:
  Antworten mit Zitat      
die warnung sagt glaube ich nur das deine anzahl L nicht durch 2 teilbar ist und nur integer werte als index benutzt werden können. es giebt kein 3.5 tes element
in der skript ecke gibt es auch ein sehr umfassendes beispiel zur fft
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 12:18     Titel:
  Antworten mit Zitat      
achso ja,

das umfassende Skript zur FFT habe ich mir bereits angeschaut, konnte die Warnung aber nicht damit entschlüsseln. hm, dann könnte ich doch die länge einfach um -1 reduzieren oder? dann wäre die zahl ja wieder durch 2 teilbar.

aber wie integriere ich das in das script?
Code:
L=length(fft_variable-1);


funktioniert leider nicht
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 12:24     Titel:
  Antworten mit Zitat      
habe es jetzt so gelöst:

Code:
L=length(fft_variable);                     %Länge der Wertereihe kennzeichnen, hier über gesamten Zeitraum
L=L-1;



darf ich das einfach so machen oder hättest du da bedenken? sind immer über 10000 Datenpunkte, also ein Punkt mehr oder weniger macht den Braten nicht fett oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 12:35     Titel:
  Antworten mit Zitat      
Zitat:
sind immer über 10000 Datenpunkte, also ein Punkt mehr oder weniger macht den Braten nicht fett oder?
denke nicht. kenn mich mit fft aber nicht aus. da müssen andere ran Wink ich weis blos was der fehler heist den du hattest. allerding solltest du nicht immer 1 abziehen ^^ wenn es vorher durch 2 teilbar war ist es das ja dann nicht mehr. vieleicht lieber floor benutzen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 13:09     Titel:
  Antworten mit Zitat      
achso stimmt klar, wenn es durch 2 teilbar ist und ich 1 abziehe bewirke ich ja genau das gegenteil.

ich probier mal was mit floor zu schreiben (vorher noch nie genutzt)
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 13:29     Titel:
  Antworten mit Zitat      
habe es jetzt mit:

Code:
if mod(L,2) ~=0                             %Länge durch 2 teilbar prüfen, sonst Warnung
    %ungerade
    L=L-1;
else
    L=L;
end            


hinbekommen!

danke für deine bemerkungen, damit habe ich das problem auch wieder schnell lösen können Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 13:31     Titel:
  Antworten mit Zitat      
oder du benutzt anstatt L/2 einfach floor(L/2) zum abrunden
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 13:58     Titel:
  Antworten mit Zitat      
das verstehe ich nicht, floor ist doch für kommazahlen? ich habe ja nur ganzzahlige zahlen
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 14:09     Titel:
  Antworten mit Zitat      
Code:
ich habe ja nur ganzzahlige zahlen

5/2 ist keine ganze zahl
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Richard
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2016, 15:40     Titel:
  Antworten mit Zitat      
meinst du bei dem ausgangscode einfach statt
Code:
fb=Af*(0:(L/2-1))/L;


Code:
fb=Af*(0:(floor(L/2))/L;  


einsetzen?

und das davor mit der if abfrage weglassen?
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: 23.01.2016, 12:03     Titel:
  Antworten mit Zitat      
Den Frequenzvektor kann man auch anders erstellen, wodurch auch gleich der Zusammenahng zur Frequenzauflösung klar wird.

Code:

N = ... % Anzahl Messwerte
Fs = ...% Abtastfrequenz
Fn = Fs/2; % Nyquistfrequenz
df = Fs/N; % Frequenzauflösung des berechneten Spektrums
fv = 0: df : Fn; % Frequenzvektor für den positiven Frequenzbereich
 


Die Skalierung der Amplitude ist so nicht korrekt. Siehe folgendes FFT Beispiel

Code:

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

% Berechnung der FFT
% ------------------
H = fft(y, N);
% Berechnung des Amplitudengangs aus dem komplexen Frequenzvektor H:
amplH = abs(H);

% 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) amplH((N/2) + 1)/N]; % DC-Bin auf N normieren!

% Darstellung Frequenzspektrum - linear
plot(fv, amplitudengang)
 

edit winkow: url berichtigt
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.