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

Phasenverschiebung bei FFT + anschließender Fouriersynthese

 

Alex_S
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2012, 09:32     Titel: Phasenverschiebung bei FFT + anschließender Fouriersynthese
  Antworten mit Zitat      
Hallo alle zusammen,

Ich möchte ein Zeitsignal mit Hilfe der FFT in eine Sinusreihe überführen und anschließend wieder rekonstruieren. Leider erhalte ich aber für das neue Signal eine negative Phasenverscheibung ( Signal leicht nach rechts verschoben). Woran könnte das liegen?

Danke für eure Hilfe !

Code:

clear;
fc = 500; % Frequenz des Signals: 500 Hz
ftast = 1e3; % Abtastfrequenz 3 khz
N = 2^nextpow2(5000); % Anzahl Abtastpunkte
t = 0:1/(ftast):10;% Zeitvektor mit Abtastfrequenz, bis 1s

y = sin(2*pi*fc*t)+sin(0.1*2*pi*fc*t); % Zeitsignal

Y=fft(y, N);

spec = 2*abs(Y)/N; % Amplitudenspektrum
phase = angle(Y);

f = linspace(0,ftast/2,N/2); % Frequenzachse

plot(f, spec(1:N/2)); % Zeichne einseitiges Spektrum
xlabel('Frequenz in Hz');
ylabel('Amplitude');

figure(2);               % plot phase
plot(f,phase(1:N/2));
 
A0 = 2*abs(Y)/N; % Amplitudenspektrum
om = 2*pi*f';
phase = angle(Y);
phase_0 = phase(1:N/2)';
A = A0(1:N/2)';

%Signal Synthese
for k = 1: length(t)
    y_f(:,k) = A.*sin(om*(t(k)+0)+phase_0);
    y_fg(k) =  sum(y_f(:,k));
end

% Signale plotten
figure(3);
plot(t(1:100),y(1:100),t(1:100),y_fg(1:100),'r');
 
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: 20.07.2012, 10:10     Titel:
  Antworten mit Zitat      
So weit ich mich erinnere, kannst du ein Signal nicht nur mit einem sinus rekonstruieren. Der Zusammenhang zwischen Realteil und Imaginärteil der FFT und Betrag und Phase ist doch folgender...

ReT * cos(x) + ImT * sin(x) = Betrag * cos (x + phase)

Mit einem sinus läßt sich nämlich u.a. der DC-Offset nicht darstellen. In deinem Bsp. fällt es nicht auf, da DC = 0 ist. Da der Cosinus dem Sinus vorraus ist, erklärt das dann auch deine negative Phasenverschiebung.

BTW...die Skalierung deiner Amplitude ist nicht ganz korrekt. Der DC Anteil darf nur durch N/2 geteilt werden. Außerdem vergisst du den Wert der Nyquistfreq. vollkommen. Ein Signal von N Werten ergibt ein Spektrum von N/2 +1 Werten.

An unsere Moderatoren: Verschiebt dieses Thema doch bitte in den Bereich Signalverarbeitung. Dort ist es sicherlich besser aufgehoben
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 20.07.2012, 16:40 Uhr von Martin
Von Script-Ecke nach Signalverarbeitung
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.07.2012, 12:54     Titel:
  Antworten mit Zitat      
Ich habe in deinem Code mal ein paar Dinge verändert...so funktioniert die Synthese. Mit einem Sinus geht es jedenfalls nicht, da der dc_offset nicht dargestellt werden kann.

Code:

clear;

ftast = 1e3; % Abtastfrequenz 3 khz
N = 2^nextpow2(256); % Anzahl Abtastpunkte
df= ftast/N; % Auflösung des Frequenzspektrums
fc = df*100; % Frequenz des Signals
% damit kein Leakage entsteht, muss die Signalfreq. ein ganzzahliges
% Vielfaches von df sein
% zu dem gilt das Abtasttheorem einzuhalten. ftast > 2 * fc
% hier war ursprünglich fc = 500 und ftast = 1000 Hz
% das ist zwar laut dem Theorem ok, ein Faktor von min. 5 wäre aber besser
t = 0:1/(ftast):(N-1)/ftast;% Zeitvektor mit Abtastfrequenz, bis 1s
dc_offset = 1;
y = dc_offset + sin(2*pi*fc*t)+sin(0.1*2*pi*fc*t); % Zeitsignal

y = y(:); % als Spaltenvektor

Y = fft(y, N);
% nur den positiven Freq.bereich darstellen
% damit ergibt sich aus N Werten ein N/2 + 1 langes Spektrum
amplH = abs(Y(1:N/2 + 1)); % Betrag
% richtige Skalierung
spec = [amplH(1)/(N); amplH(2:end-1)/(N/2); amplH(end)/(N)]; % Amplitudenspektrum
phase = angle(Y(1:N/2 + 1));

f = linspace(0,ftast/2,N/2 + 1); % Frequenzachse

plot(f, spec); % Zeichne einseitiges Spektrum
xlabel('Frequenz in Hz');
ylabel('Amplitude');

figure(2);               % plot phase
plot(f,phase);
 
om = 2*pi*f'; % omega in rad/s

y_f = zeros(N/2 + 1,N);
y_fg = zeros(N,1);
%Signal Synthese
for k = 1: length(t)
    y_f(:,k) = spec .* cos(om * (t(k)) + phase);
    y_fg(k) =  sum(y_f(:,k));
end

% Signale plotten
figure(3);
plot(t,y,t,y_fg,'r--');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex_S
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2012, 11:11     Titel:
  Antworten mit Zitat      
Vielen Dank DSP! Das ist mir eine große Hilfe!
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.