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
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
Verschoben: 20.07.2012, 16:40 Uhr von Martin Von Script-Ecke nach Signalverarbeitung
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.
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));
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
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.