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

Phasendifferenz zwischen zweier Signale bestimmen

 

Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2016, 16:25     Titel: Phasendifferenz zwischen zweier Signale bestimmen
  Antworten mit Zitat      
Hi Leute,

in diesen Forum habe ich bereits Hilfe bekommen zur FFT. Vllt kann die FFT in diesem Zusammenhang benutzt werden.

Ich möchte gerne noch die Phasendifferenz zwischen 2 Verläufen bestimmen.
Die Frequenz und die Amplituden sind mir bekannt.
Ich habe 2 CSV Dateien.

Hat jemand eine Idee, wie man den Phasenunterschied zwischen zweier Signale bestimmen kann?


Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2016, 18:18     Titel:
  Antworten mit Zitat      
Beide Kurven haben die gleiche Frequenz, aber unterschiedliche Amplituden

Bei Kurven wurde mit der gleichen Zeitachse aufgezeichnet

Phase muss nicht zwingend mit FFT bestimmt werden.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.12.2016, 19:08     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Beginne zunächst mal mit einer Suche im Forum und dem Internet. Vielleicht habt ihr in Signal-Verarbeitung auch etwas zum Thema Phasenverschiebung durchgenommen?
Dann probiere die dort gefundenen Vorschläge aus und posten den bisherigen Matlab-Code dazu. Wenn Du dann konkrete Fragen dazu stellst, wird Dir hier gerne geholfen, denn das ist ja ein Matlab-Forum.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2016, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

ich habe nachgeschaut. Für einen Matlab amateur ist es schwierig. Ich habe leider sehr wenig ahnung.

Im Prinzip reicht es mir schon, wenn ich den Abstand auf der x-Achse beider Kurven erhalte. Vielleicht gibt es irgendeinen einfachen Befehl.
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 10.12.2016, 21:34     Titel:
  Antworten mit Zitat      
Sanjaa hat Folgendes geschrieben:
Hallo,

ich habe nachgeschaut. Für einen Matlab amateur ist es schwierig. Ich habe leider sehr wenig ahnung.

Dass wir dir auf konkrete Fragen, welche sich um deine Umsetzung in Matlab drehen, antworten und helfen, ist keine Sache. Aber mit persönlich kommt es so vor, als würdest du deutlich zu wenig eigenen Hirnschmalz investieren und zu wenig versuchen es wirklich zu lernen.

Die Ahnung, die du nicht hast, entsteht durch lernen, nachmachen, ausprobieren.

Besonders durch ausprobieren.
Wenn du nicht mindestens 10 Wege herausgefunden hast, wie es NICHT geht, hast du nichts gelernt dabei Wink

Nebenbei ist das Ziel deiner Aufgabe sicherlich nicht, "befrage die Foren und laß dir jeden Schritt auf dem Silbertaplett servieren", sondern bringe dir bei, wie man sowas lößt, finde selber eine Lösung.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.12.2016, 15:53     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Die Antworten in diesem thread drehen sich nicht mehr um Matlab. Eigentlich tauschen wir hier solche Nachrichten nur per PN aus, da sie nicht von allgemeinem Interesse für ein Matlab-Forum sind. Da Du aber als Gast angemeldet bist, kann man keine PNs verschicken und so landen die eigentlich persönlichen Mitteilungen im öffentlichen Forum. Ich belasse sie dort, weil es Dir hoffetnlich besser hilft, als wenn Deine Fragen einfach ignoriert werden.

Zitat:
Vielleicht gibt es irgendeinen einfachen Befehl.

Wenn es den wirklich gibt, wirst Du ihn auch selbst finden können. Weder das Internet, z.B. WikiPedia oder goMatlab, noch die Dokumentation von Matlab neigen zu irgendwelchen Heimlichkeiten. Suche also einfach nach "Phasenverschiebung", lasse Dir von z.B. www.dict.cc den Ausdruck ins Englische übersetzen, nutze docsearch .

Erst wenn das nicht weiterhilft, ist das Forum der nächste Schritt. Stelle dann Deine Fragen präzise. Das ist wichtig, denn sonst verplempern die Antwortenden ihre Zeit. "Ich habe 2 CSV Dateien" hilft z.B. nicht weiter, denn vermutlich kannst Du die Files doch schon importieren, oder? Also hast Du die Daten bereits als Vektoren oder Matrix vorliegen - und hier wäre es notwendig zu wissen, in welcher Form. Dass die Daten aus CSV-Files stammen, ist dagegen nicht von Belang.

Lies doch mal ein paar andere Threads durch um zu sehen, wie andere Leute versuchen effizient an Lösungen zu kommen.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2016, 21:41     Titel:
  Antworten mit Zitat      
Hi,

ist es möglich den Code auf meine vorhandenen Signale zu verändern?

Code:
function PhDiff = phdiffmeasure(x, y)

% function: PhDiff = phdiffmeasure(x, y)
% x - first signal in the time domain
% y - second signal in the time domain
% PhDiff - phase difference Y -> X, rad

% represent x as column-vector if it is not
if size(x, 2) > 1
    x = x';
end

% represent y as column-vector if it is not
if size(y, 2) > 1
    y = y';
end

% remove the DC component
x = x - mean(x);
y = y - mean(y);

% signals length
N = length(x);

% window preparation
win = rectwin(N);

% fft of the first signal
X = fft(x.*win);

% fft of the second signal
Y = fft(y.*win);

% phase difference calculation
[~, indx] = max(abs(X));
[~, indy] = max(abs(Y));
PhDiff = angle(Y(indy)) - angle(X(indx));

end


-Signalparameter kann ich eingeben.
-Bei Signal generieren müsste ich irgendwie meine vektoren einfügen

Aber ich glaube nicht, dass der Code brauchbar ist. Es wären zuviele Sachen zu ändern, sodass es dann wahrscheinlich ein ganz anderer Code wäre?!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.12.2016, 13:01     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Zitat:
-Signalparameter kann ich eingeben.

Was bedeutet das? Von welchen Parametern sprichst Du und wo würdest Du das eingeben?

Zitat:
-Bei Signal generieren müsste ich irgendwie meine vektoren einfügen

Ich finde im Code nichts, was zu "Signale generieren" passt. Die beiden Signale müssen als "x" und "y" übergeben werden. Von "irgendwie einfügen" kann da also nicht die Rede sein.

Was bekommst Du denn, wenn Du einfach beide Signale als Inputs dieser Funktion verwendest?

Hast Du meinen Hinweis bzgl. präsizer Fragen gelesen? Man kann hier nur raten, was Du versucht hast und worauf sich Deine Fragen beziehen könnten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2016, 14:28     Titel:
  Antworten mit Zitat      
Sorry aus unerklärlichen Gründen wurde der falsche Code eingefügt. Hier der richtige.

Code:
% signal parameters
fs = 44100;
f0 = 1000;
T = 0.1;

% preparation of the time vector
N = round(T*fs);
t = (0:N-1)/fs;

% generation of the signal
x = sin(2*pi*f0*t) + 0.02*randn(1, N);
y = 0.5*sign(sin(2*pi*f0*t - pi/6)) + 0.02*randn(1, N);

% phase difference calculation
PhDiff = phdiffmeasure(x, y);
PhDiff = PhDiff*180/pi;

% display the phase difference
PhDiffstr = num2str(PhDiff);
disp(['Phase difference Y->X = ' PhDiffstr ' deg'])

% plot the signals
figure(1)
plot(t, x, 'b', 'LineWidth', 2)
grid on
hold on
plot(t, y, 'r', 'LineWidth', 2)
xlim([0 0.005])
ylim([-1.1 1.1])
set(gca, 'FontName', 'Times New Roman', 'FontSize', 14)
xlabel('Time, s')
ylabel('Amplitude, V')
title('Two signals with phase difference')
legend('First signal', 'Second signal')
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.12.2016, 23:13     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Bist Du sicher, dass das der richtige Code ist? Immerhin macht der vorherige doch ganz genau das, was Du suchst. Müsstest Du nicht einfach nur für x und y Deine beiden Signale nehmen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2016, 09:32     Titel:
  Antworten mit Zitat      
Hallo,

die beiden Codes arbeiten zusammen. Ich rufe nämlich die Funktion vom ersten Code im zweiten Code auf.
Im ersten Code muss ich glaube ich nichts verändern. Den zweiten Code hab ich etwas verändert. Sieht folgendermaßen aus

Code:
fo = 100;                                     %Meine Frequenz

array1 = csvread('datei1.csv');  %Signal importieren

signaltime1 = array1(1:Grenze, 1);                           %x
signaldata1 = array1(1:Grenze, 2);

array2 = csvread('datei2.csv');                       %Signal importieren

signaltime2 = array2(1:Grenze, 1);                           %x
signaldata2 = array2(1:Grenze, 2);
 

% signal parameters
fs = 1/(signaltime1(2)-signaltime1(1));
%f0 = 100;
T = 1/fo;


% generation of the signal
x = signaldata1;
y = signaldata2;

% phase difference calculation
PhDiff = phdiffmeasure1(x, y);
PhDiff = PhDiff*180/pi;

% display the phase difference
PhDiffstr = num2str(PhDiff);
disp(['Phase difference Y->X = ' PhDiffstr ' deg'])

% plot the signals
figure(1)
plot(signaltime1, x, 'b', 'LineWidth', 2)
grid on
hold on
plot(signaltime2, y, 'r', 'LineWidth', 2)
xlim([0 0.005])
ylim([-1.1 1.1])
set(gca, 'FontName', 'Times New Roman', 'FontSize', 14)
xlabel('Time, s')
ylabel('Amplitude, V')
title('Two signals with phase difference')
legend('First signal', 'Second signal')
commandwindow


Es startet, aber es wird mir ein falscher Winkel angezeigt.
Mir wird folgende Meldung angezeigt:

Warning: Integer operands are required for colon operator when used as index

Die Warnung wird an der Zeile, wo ich meine beiden Dateien importiere.

Das könnte der Fehler sein. Weißt du was das ist bzw. wie ich es beheben kann?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.12.2016, 09:46     Titel:
  Antworten mit Zitat      
Hallo Sanjaa,

Bitte poste immer die vollständige Fehlermeldung. Das hilft den Lesern sofort zu erkennen, wo welches Problem auftritt.
Poste zudem den exakten Code, den Du verwendst.

Zitat:
Die Warnung wird an der Zeile, wo ich meine beiden Dateien importiere.

Und in welcher Zeile ist das?

Zitat:
Code:
signaltime1 = array1(1:Grenze, 1);

Was ist "Grenze"?

Zitat:
Es startet, aber es wird mir ein falscher Winkel angezeigt.

Welcher Winkel wird Dir wo angezeigt und welchen erwartest Du? Vielleicht ist ja nur Deine Erwartung falsch oder es werden andere einheiten verwendet.

Die Bearbeitung dieses Threads wird zunehmend mühsam. Bitte lies Deine Fragen nach dem Tippen nochmal durch und überlege, ob sie für einen vollkommen Unbeteiligten nachvollziehbar sind. Du bist weit davon entfernt zu viele Informationen zu geben und trotzdem ist dies schon einer der längsten Threads im Forum.
Mit dem Code-Teil zum Zeichnen gibt es keine Probleme, oder? Dann konzentriere Dich auch beim geposteten Code auf die eigentlichen Zeilen. Diese müssen dann aber wiederum so vollständig sein, dass man das Problem auch reproduzieren kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2016, 10:35     Titel:
  Antworten mit Zitat      
Hallo,

ich habe den fehler gefunden.Falls sich doch kein weiterer fehler eingeschlichen hat
Danke für die Hilfe!
 
Sanjaa

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2016, 11:54     Titel:
  Antworten mit Zitat      
Ich hätte gerne noch das mein Programm mehrere Dateien gleichzeitig bzw. nacheinander bearbeitet.

Dabei will ich es mit Tom_Gast´s Code versuchen(Ist für eine Datei gedacht):

Code:
dateien = {'datei1.csv', 'datei2.csv', 'datei3.csv'}
f_vec = [100 200 300]; %Vektoren mit erwarteten Frequenzen

subplot(1,2,1); hold on; %Damit später alle Plots angezeigt werden
subplot(1,2,2); hold on;
WertPeak = zeros(1,numel(dateien)) %Preallocation
for indx = 1:numel(dateien)
fo = f_vec(indx);
array = csvread(dateien{indx});
%Hier kommt dein bisheriger Code hin
%Also Datei einlesen und FFT durchführen und Plotten
WertPeak(indx) = max(p); %Wert in Vektor abspeichern
end


Der Code ist für eine Datei gedacht. Ich muss allerdings 2 Dateien gleichzeitig in Verbindung setzten(datei1 mit datei3 sowie datei2 mit datei4). Die Frequenzen beider Dateien sind gleich.
Das Ergebnis wird mir von "PhDiff" angezeigt. Wie kann man es nun mit 2 for-Schleifen realisieren? Habe an das hier gedacht:

Code:
dateien1 = {'datei1.csv', 'datei2.csv'}
dateien2 = {'datei3.csv', 'datei4.csv'}
f_vec = [100 200 ]; %Vektoren mit erwarteten Frequenzen

subplot(1,2,1); hold on; %Damit später alle Plots angezeigt werden
subplot(1,2,2); hold on;
phase = zeros(1,numel(dateien)) %Preallocation
for indx1 = 1:numel(dateien1)
    for indx2 = 1:numel(dateien2)
fo = f_vec(indx1);

array1 = csvread(dateien1{indx1});

array2 = csvread(dateien2{indx2});

%Hier kommt dein bisheriger Code hin
%Also Datei einlesen und FFT durchführen und Plotten

phase(indx1) = PhDiff; %Wert in Vektor abspeichern
    end
end


Ich denke dass kann ich so mit den beiden for-Schleifen nicht machen?
Ich hoffe ich habe nichts vergessen zu erwähnen
 
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.