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

Zusammenhang zwischen Resultat aus fft() und fft2()

 

PhreakShow
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 18:01     Titel: Zusammenhang zwischen Resultat aus fft() und fft2()
  Antworten mit Zitat      
Servus zusammen,

ich versuche mich an der Bild- bzw Signalverarbeitung mit der aktuellen R2016b Studentenversion von MATLAB. Mein Ziel ist zu verstehen, warum die Ergebnisse einer einfachen fft bzw einer fft2 so sind, wie sie ausgespuckt werden, um dann ein Maß für Frequenzen und Amplituden zu finden.

Eigentlich will ich beliebige Bilder durch die fft2 schicken und dann schauen, was an Frequenzen drin ist, und sie mit Filtern im Frequenzbereich so modifizieren, dass das rücktransformierte Bild bestimmte Eigenschaften hat.

Deshalb fange ich mit einer Summe von Sinusschwingungen an.

Code:

f_sample = 1000;             % Sampling frequency
T_sample = 1/f_sample;       % Sampling period
nLength = 1000;              % Length of signal
t = (0:nLength-1)*T_sample;  % Time vector
f = 5;

s = sin(2*pi*1*f*t) + sin(2*pi*3*f*t)/3 + sin(2*pi*5*f*t)/5 + sin(2*pi*7*f*t)/7 + sin(2*pi*9*f*t)/9;
 


Soweit klar, das ergibt eine grobe angenäherte Rechteckschwingung.
Wenn ich davon die fft() erzeuge und danach noch mit fftshift() ausrichte und die Amplituden verdoppel, habe ich peaks mit 1; 0,33; 0,20; 0,14; 0,11.
So wie es sein soll, die habe ich ja selbst in das Signal s reinaddiert. Dazu passt auch die Position der Peaks mit 6, 16, 26, 36, 46, weil MATLAB die Adressierung bei 1 starten lässt.
Das sind also meine Grundfrequenz und die ersten Harmonischen.

Danach bau ich aus dem Verlauf von s ein Graustufenbild:

Code:
i = repmat(s, [256 1]);


Und jetzt kommen wir zu meinem Problem: Wenn ich darauf fft2() und fftshift() anwende und wieder die Amplituden verdoppel, bekomme ich einen einzigen Peak mitten im Bild.
Was fehlt mir da, um auf die gleichen Frequenzen zu kommen wie in der eindimensionalen fft()? Andere Frequenzen können ja nicht auftauchen, ich habe keine hinzugefügt.

Der Einfachheit halber mein kompletter Code für einfaches copy/paste:

Code:

clear;
close all;
clc;

f_sample = 1000;             % Sampling frequency
T_sample = 1/f_sample;       % Sampling period
nLength = 1000;              % Length of signal
t = (0:nLength-1)*T_sample;  % Time vector
f = 5;
N = 5;

s = sin(2*pi*1*f*t) + sin(2*pi*3*f*t)/3 + sin(2*pi*5*f*t)/5 + sin(2*pi*7*f*t)/7 + sin(2*pi*9*f*t)/9;

fig1 = figure;
set(fig1,'Position',[1960, 620, 800, 400]);
plot(t, s);

S = fft(s);

P2 = abs(S/nLength);
P1 = P2(1:nLength/2+1);
P1(2:end-1) = 2*P1(2:end-1);

fig2 = figure;
set(fig2,'Position',[1960+900, 620, 800, 400]);
stem(P1);

[sortedX,sortingIndices] = sort(P1,'descend');

maxValues = sortedX(1:N)
maxValueIndices = sortingIndices(1:N)

%***************************************

i = repmat(s, [256 1]);
%i = repmat((-cos(2*t) + 1)/2, [256 1]);

fig3 = figure;
set(fig3,'Position',[1960+000, 60, 800, 400]);
imagesc(i);
colormap(gray);

I = fftshift(fft2(i));

fig4 = figure;
set(fig4,'Position',[1960+900, 60, 800, 400]);
plot(abs(I));
 


Danke für eure Hilfe, Gruß Phreak
Private Nachricht senden Benutzer-Profile anzeigen


PhreakShow
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 22.09.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2016, 01:30     Titel:
  Antworten mit Zitat      
Ein Problem habe ich gefunden: Obwohl MATLAB das mit repmat erzeugte Bild so anzeigt wie ich das will, ist es intern noch keines.

Code:
i = repmat(s, [256 1]);
imagesc(i);
colormap(gray);
imwrite(i, 'sinus.png');


Erst das erzeugt ein echtes Bild, und damit kommt aus der fft2 und dem fftshift tatsächlich etwas heraus was korrekt sein könnte.

Code:
s = 1 + sin(2*pi*1*f*t) + sin(2*pi*3*f*t)/3 + sin(2*pi*5*f*t)/5 + sin(2*pi*7*f*t)/7 + sin(2*pi*9*f*t)/9;


Das Eingangssignal habe ich nun mit Gleichanteil, in der 1D fft taucht nun ein Peak bei Frequenz 0 auf.

Wenn ich davon wieder das erzeugte Bild durch die fft2 schicke, kriege ich das Bild im Anhang als Ausgabe.

Der gelbe Peak in der Mitte wird vmtl meine nullte Frequenz sein, der Gleichanteil. Symmetrisch daneben die erste, dritte, fünfte und siebte Harmonische. Andere sind anscheinend auch mit geringen Anteilen dabei.

Das Bild hat 200x256 Pixel. Die FFT2 erzeuge ich mit:

Code:
I = fft2(i);
I = abs(I/(nLength*256));
I = fftshift(I);


Laut der Farbenlegende soll also die Grundfrequenz eine Amplitude von 150 haben, und die erste Harmonische irgendwas um 75? Das würde in Relation stimmen, 2x 75 wäre 150 und in der 1D FFT sind die Amplituden von Gleichanteil und erster Harmonischen gleich groß.

Aber irgendwie ist das nur das Fischen im Trüben. Wie komme ich auf die tatsächlichen Amplituden, oder vielmehr wo steht wie ich da hin komm.

FFT2.png
 Beschreibung:

Download
 Dateiname:  FFT2.png
 Dateigröße:  8.71 KB
 Heruntergeladen:  278 mal
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.