2013-05-03 12 views
5

ho un segnale che desidero copiare quando:Trovare zero crossing che stanno positivo e zero crossing che stanno negativo

1) inizia da zero crossing andamento positivo

2) copia un numero prestabilito di punti (come 8000)

3) e dopo aver copiato gli 8000 punti, continuare ad aggiungere punti finché non viene trovata una sezione di passaggio a zero in basso.

Sono in grado di trovare lo zero crossing ma sto riscontrando alcuni problemi con il sapere come dire quando c'è un passaggio a zero che diventa positivo e/o un passaggio a zero negativo. Sto anche avendo problemi con l'aggiunta la sezione successiva di punti dopo i 8000 punti alla fine (domanda SO # 1 e mettere in discussione # 3in grassetto sto ho problemi con)

Nota: per favore tenete a mente che il segnale che sto usando è un segnale audio, quindi non sarà bello come una semplice equazione.

Ho allegato il codice di prova insieme a un'immagine. Sto usando Matlab/ottava

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

risposta

14

Prova questa:

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

Questo vi darà i punti di attraversamento e la loro direzione. Nel tuo loop in cui aggiungi campioni, prova solo x per il punto corrente e l'ultimo punto. Se è zero, continua. Se è positivo, aggiungi i tuoi 8000 punti e torna ai test. Se è negativo, fermati.

Modifica: errore corretto nella prima riga di codice.

+1

Si avrà probabilmente anche voler filtrare il segnale per rimuovere il rumore ad alta frequenza prima di fare questo test per evitare incroci multipli man mano che si passa da zero. – craigim

+0

grazie Craigim per l'aiuto, ma cosa intendi con "test x per il punto corrente e l'ultimo punto". Cosa dovrei testarli contro? –

+0

Esattamente come lo fai dipenderà dai dettagli di come stai leggendo nei dati, ma se il tuo indice di ciclo è 'n', allora potresti fare qualcosa come' x = segno (t (n-1)) - segno (t (n)); se x> 0; aggiungi 8000 punti; elseif x == 0; aggiungere un punto; elseif x <0; smettere di aggiungere punti, fine'. – craigim

0

Si può fare in questo modo di trovare "going-up" o "andare verso il basso" zero crossing:

%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

Ecco il codice di prova in caso qualcuno altro ha una domanda simile

%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 
Problemi correlati