2013-05-03 6 views
5

Ich habe ein Signal, das ich kopieren möchte, wenn es:Finding Nulldurchgang, die positive und Nulldurchgang werden die negativ werden

1) beginnt bei Nulldurchgang gehen positive

2) Kopiere eine bestimmte Anzahl von Punkten (wie 8000)

3) und nachdem die 8000 Punkte kopiert wurden, setze die Punkte so lange fort, bis ein Nulldurchgangsbereich gefunden wird.

Ich kann den Nulldurchgang finden, aber ich habe einige Probleme damit zu wissen, wie man weiß, wenn ein Nulldurchgang positiv und/oder ein Nulldurchgang negativ wird. Ich bin auch Probleme, am Ende des nächsten Abschnitts der Punkte nach den 8000 Punkten mit dem Hinzufügen (So # 1 hinterfragt und in Frage # 3in fett Ich habe Probleme mit)

Hinweis: Bitte beachten Sie, dass das Signal, das ich verwende, ein Audiosignal ist, so dass es nicht so schön ist wie eine einfache Gleichung.

Ich habe den Testcode zusammen mit einem Bild beigefügt. Ich bin mit Matlab/Oktave

clear all, clc, tic, clf; 
n=16000 
t=linspace(0,2*pi,n); 
y=cos(6*t)+sin(4*t); 

%find zero crossings 
t1=y(1:n-1); 
t2=y(2:n); 
tt=t1.*t2; 
indx=find(tt<0) 

%1) start at first zero crossing going positive 
%2) get 8000 pts 
%3) and after the 8000 points continue appending points until a zero crossing going down section is found 
new_y=y(indx(1,1):8000); %start at zero section found get 8000 pts 
subplot(2,1,1);plot(y);title('Original Signal') 
subplot(2,1,2);plot(new_y);title('New signal') 

enter image description here

Antwort

14

Versuchen Sie folgendes:

x = diff(sign(y)); 
indx_up = find(x>0); 
indx_down = find(x<0); 

Das wird Ihnen die Kreuzungspunkte und ihre Richtung geben. In Ihrer Schleife, in der Sie Samples hinzufügen, testen Sie einfach x für den aktuellen Punkt und den letzten Punkt. Wenn es Null ist, mach weiter. Wenn es positiv ist, füge deine 8000 Punkte hinzu und gehe zurück zum Testen. Wenn es negativ ist, hör auf.

Bearbeiten: Tippfehler in der ersten Codezeile korrigiert.

+1

hat, werden Sie wollen wahrscheinlich auch das Signal filtern Hochfrequenzrauschen zu entfernen, bevor Sie diesen Test zu tun Vermeiden Sie mehrere Übergänge, wenn Sie durch Null gehen. – craigim

+0

danke Craigim für die Hilfe aber was meinst du "Test x für den aktuellen Punkt und den letzten Punkt". Was sollte ich gegen sie testen? –

+0

Genau wie Sie es tun, hängt von den Details ab, wie Sie in den Daten lesen, aber wenn Ihr Schleifenindex "n" ist, dann könnten Sie etwas tun wie "x = sign (t (n-1)) - sign (t (n)); wenn x> 0; addiere 8000 Punkte; elseif x == 0; füge einen Punkt hinzu; elseif x <0; hör auf, Punkte hinzuzufügen; end '. – craigim

0

Sie können tun, wie folgt zu finden "going up" oder "going down" Nulldurchgänge:

%find zero crossings 
t1=y(1:n-1); 
t2=y(2:n); 
tt=t1.*t2; 
indx=find(tt<0) 

dt  = t2-t1; 
indx_up = find((tt<0) & (dt>0)) 
indx_down = find((tt<0) & (dt<0)) 
1

Hier ist der Testcode im Fall jemand anderes eine ähnliche Frage

%zero crossing testing (find zero upward, copy fs 4000, find next zero upward. 
clear all, clc, tic, clf; 
n=16000 
t=linspace(0,2*pi,n); 
y=cos (6*t)+sin(4*t); 

find_zero = diff(sign(y)); 
indx_up = find(find_zero>0); %find all upward going zeros 
indx_down = find(find_zero<0); %find all downward going zeros 
new_y=[]; 

fs_range_wanted=indx_up(1,1)+4000; %starts from first zero adds sample size wanted 
new_y=[y(indx_up(1,1):fs_range_wanted)]; %may have to minus 1 
ii=0; 
while (find_zero(1,fs_range_wanted+ii) ~= 2); %do while not going dwn and append 
    ii=ii+1 
    y_pt_loc=fs_range_wanted+ii %what is the location of the point 
    new_y = [new_y, y(1,fs_range_wanted+ii)]; %append points 
end 


subplot(3,1,1);plot(y);title('Original Signal') 
subplot(3,1,2);plot(new_y);title('New signal') 
subplot(3,1,3);plot(find_zero);title('Zeros-Pos-Neg') 

enter image description here

0
function[t,s]=zerocorss(x,m) 
    if nargin<2 
     m='b'; 
    end 

    s=x>0; 

    k=s(2:end)-s(1:end-1) 

    if any(m=='p') 
     f=find(k>0); 
    elseif (m=='n') 
     f=find(k<0); 
    else 
     f=find(k~=0); 
    end 

    s=x(f+1)-x(f); 
    f=f-x(f)./s; 

    if ~nargout 
     n=length(x); 
     subplot(2,1,1),plot(1:n,x,'x',t,zerocorss(length(x)/1),'o'); 
     subplot(2,1,2),stem(t,s); 
    end 
end 
Verwandte Themen