2013-05-03 12 views
5

Mam sygnał, że chciałbym, aby skopiować gdy:Znalezienie przejście przez zero, które będą pozytywne i przejście przez zero, które będą negatywne

1) rozpoczyna się od przejścia przez zero będzie dodatni

2) skopiuj ustawioną liczbę punktów (np. 8000)

3) i po skopiowaniu 8000 punktów kontynuuj dodawanie punktów, aż zostanie znaleziona sekcja z przekroczeniem zera.

Mogę znaleźć przejście przez zero, ale mam pewne problemy z wiedzą, jak powiedzieć, kiedy jest przejście przez zero, które będzie dodatnie i/lub przejście przez zero będzie ujemne. Mam też kłopoty z dodaniem następnej sekcji punktów po 8000 punktów na koniec (Więc pytanie # 1 i pytanie # 3pogrubioną mam mieć problemy)

Uwaga: należy pamiętać, że sygnał, którego używam, jest sygnałem dźwiękowym, więc nie będzie tak miły jak proste równanie.

Dołączyłem kod testowy wraz z obrazem. Używam Matlab/oktawę

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

Odpowiedz

14

Spróbuj tego:

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

To da ci punkty przejścia i ich kierunek. W pętli, w której dodajesz próbki, po prostu przetestuj x dla bieżącego punktu i ostatniego punktu. Jeśli wynosi zero, idź dalej. Jeśli jest pozytywna, dodaj 8000 punktów i wróć do testów. Jeśli jest ujemny, przestań.

Edycja: poprawiono literówkę w pierwszej linii kodu.

+1

Będziesz prawdopodobnie chcesz filtrować sygnał, aby usunąć zakłócenia wysokiej częstotliwości przed wykonaniem tego testu do unikaj wielokrotnych przepraw przez zero. – craigim

+0

dziękuję Craigim za pomoc, ale co to znaczy "test x dla bieżącego punktu i ostatniego punktu". O czym powinienem je przetestować? –

+0

Dokładnie to, jak to zrobisz, będzie zależało od szczegółów, jak czytasz dane, ale jeśli twój indeks pętli to 'n', możesz zrobić coś takiego jak' x = znak (t (n-1)) - znak (t (n)); jeśli x> 0; dodaj 8000 pkt; elseif x == 0; dołącz punkt; elseif x <0; przestań dodawać punkty; koniec'. – craigim

0

Można zrobić tak, aby znaleźć "going up" lub "going-down" przejścia przez zero:

%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

Oto kod testu w sprawie, ktoś inny ma podobne pytanie

%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 
Powiązane problemy