ich muss die Verschiebung zweier Signale herausfinden, und da habe ich zuerst einmal an eine Kreuzkorrelation der beiden Signale gedacht. Da das für mich Neuland ist, habe ich versucht mich an einem einfachen Testbeispiel einzuarbeiten, nämlich die Phasenverschiebung zwischen zwei Sinus-Signalen zu finden:
Trotz der sehr einfachen Signale komme ich leider damit nur in die Nähe der tatsächlichen, von mir vorgegebenen Phasenverschiebung. Die Abweichung beträgt zwischen 5 und 15 Grad, dass ist einfach nicht brauchbar (1 Grad wäre mir recht).
Da ich nicht weiß, wie Matlab diese Kreuzkorrelation durchführt, habe ich zum Vergleich ein eigenes kleines Skript dazu verfasst (auf einfachste Art und Weise):
Trotz der paar primitiven Zeilen, sind die Ergebnisse der selbsterstellten Version besser als jene mit Matlab-Funktion xcorr() (ist aber wesentlich langsamer als xcorr()). Hat jemand Vorschläge, wo man da ansetzen könnte?
habe mich leider längere Zeit nicht damit befassen können. Ich habe probiert die Zeitverschiebung zweier einfacher Test- Signale (basierend auf dem Beispiel der Matlab-Hilfe zu fft() ) zu detektieren. Dazu nutzte ich einen Algorithmus, den ich in einem von Winkows Pdfs gefunden habe, hier das Pdf:
Ich habe versucht, den Algorithmus umzusetzen, welcher die Fourier-Transformation nutzt, um die Verschiebung im Zeitbereich zu berechnen. Allerdings bekomme ich nicht die richtigen Werte, nicht einmal die Richtung der Verschiebung stimmt. Ich poste hier mal den Code:
Code:
function sol = timeDelay() closeall;
%
% Generate two signals y1 and y2:
%
Fs = 1024; %Sampling frequency
T = 1/Fs; %Sample time
L = 1024; %Length of signal
t1 = (0:L-1)*T; %Time vector
%
% Signal 1:
%
y1 = 0.7*sin(2*pi*50*t1) + sin(2*pi*120*t1); %Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
% y1 = x1 + 2*randn(size(t1)); %Sinusoids plus noise figure;
plot(Fs*t1(1:50),y1(1:50)) title('Signal Corrupted with Zero-MeanRandom Noise') xlabel('time (milliseconds)')
%
delay = 1/1024*11 %Time delay between signal 1 and 2
%
% Signal 2:
%
y2 = 0.7*sin(2*pi*50*(t1+delay)) + sin(2*pi*120*(t1+delay));
% y2 = x2 + 2*randn(size(t1)); %Sinusoids plus noise figure;
plot(Fs*t1(1:50),y2(1:50)) title('Signal Corrupted with Zero-MeanRandom Noise') xlabel('time (milliseconds)')
%
% Calculate time delay:
%
tP = 1/1024; %Sampling period
%
m = 2^3; %number of data blocks
n = length(y1)/m; %number of values in each data block
%
Y1 = fft(reshape(y1,n,m)); %FFT of y1
Y2 = fft(reshape(y2,n,m)); %FFT of y2
%
Y1k = conj(Y1); %Conjugated complexFFT
Y2k = conj(Y2); %Conjugated complexFFT
%
C11 = mean(Y1.*Y1k,2); %Auto correlation Y1k
C22 = mean(Y2.*Y2k,2); %Auto correlation Y2k
C12 = mean(Y1.*Y2k,2); %Cross correlation Y1k and Y2k
%
Q12 = abs(C12./sqrt(C11.*C22)).^2; %Square of coherence function
%
W12 = Q12./(1-Q12); %Weight function
%
% calculate start value for fminsearch:
%
u = unwrap(angle(C12(1:n/4)));
v = (0:n/4-1)'*2*pi/(n*tP);
tStart = -(n/4*sum(v.*u)-sum(v)*sum(u))/(n/4*sum(v.*v)-sum(v)^2);
%
ts = fminsearch(@(ts) opti(ts,W12(1:n/4),unwrap(angle(C12(1:n/4)))),-2*pi*tStart/(n*tP));
%
% Estimation of time delay:
%
sol = -ts*n*tP/(2*pi); %time delay
%
dT = subTimeDelay(y1,y2,T) %time delay by subfunction subTimeDelay
%
end
%
% Subfunction opti:
%
function y = opti(ts,W,angleC12)
y = -sum(W.*cos(angleC12-(ts*(0:length(W)-1)')));
end
%
% Subfunction: function dT = subTimeDelay(y1,y2,T) % [c l] = xcorr(y1,y2,'coeff'); %Cross correlation (normalized) % figure;plot(l,c); %Plot coefficients and lags
l = length(y1);
nFFT = 2^nextpow2(l); %Next power of 2 from length of y
Y1 = fft(y1,nFFT); %Fast fourier transform of signal 1
Y2 = fft(y2,nFFT); %Fast fourier transform of delayed signal 2
dT = zeros(length(Y1),1);
k = 0:1:l/2-1;
for i=1:length(k)
dT(i) = 1024*T/(2*pi*k(i))*angle(Y1(i)*conj(Y2(i))); %Time delay with respect to equation (3.3.29) from Pdf
end
Die letzte Subfunction ist eine sehr reduzierte Version. Da habe ich versucht über den Verschiebungssatz möglichst einfach die Zeitverschiebung zu berechnen. Hat aber auch nicht geklappt.
Vielleicht hat jemand Erfahrung damit, und weiß was anders gemacht werden muss. Ich wird mich damit auch noch etwas beschäftigen.
Schöne Grüße, Thomas.
Einstellungen und Berechtigungen
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.