2013-05-03 6 views
5

मैं एक संकेत है कि मैं चाहूँगा जब यह प्रतिलिपि करने के लिए ढूँढना:शून्य पार कि सकारात्मक जा रहे हैं और शून्य पार कि नकारात्मक जा रहे हैं

1) शून्य क्रॉसिंग पर शुरू होता है के लिए जा रहा सकारात्मक

2) (8000) की तरह अंक की एक निर्धारित संख्या

3) कॉपी और बाद 8000 अंक कॉपी कर रहे हैं जब तक एक शून्य क्रॉसिंग खंड नीचे जा पाया जाता है अंक जोड़कर जारी है।

मुझे शून्य क्रॉसिंग मिल सकती है लेकिन मुझे यह जानने के साथ कुछ समस्याएं हैं कि शून्य क्रॉसिंग सकारात्मक होने पर और/या शून्य क्रॉसिंग नकारात्मक हो रहा है। मैं भी अंत में 8000 अंक के बाद अंक के अगले भाग को जोड़ने के साथ समस्या हो रही है (तो सवाल # 1 और सवाल # 3 बोल्ड मैं के साथ समस्या है कर रहा हूँ में )

नोट: कृपया ध्यान रखें कि मैं जिस सिग्नल का उपयोग कर रहा हूं वह एक ऑडियो सिग्नल है, इसलिए यह एक साधारण समीकरण के रूप में उतना अच्छा नहीं होगा।

मैंने एक छवि के साथ परीक्षण कोड संलग्न किया है। मैं matlab/सप्तक

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

उत्तर

14

इस प्रयास करें:

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

इससे आपको क्रॉसिंग पॉइंट और उनकी दिशा मिल जाएगी। अपने लूप में जहां आप नमूने जोड़ते हैं, बस वर्तमान बिंदु और अंतिम बिंदु के लिए एक्स का परीक्षण करें। यदि यह शून्य है, तो चलते रहें। यदि यह सकारात्मक है, तो अपने 8000 अंक जोड़ें और परीक्षण पर वापस जाएं। अगर यह नकारात्मक है, तो रुको।

संपादित करें: पहली कोड लाइन में सही टाइपो।

+1

आप शायद भी अपने संकेत फिल्टर करने के लिए करने के लिए इस परीक्षण करने से पहले उच्च आवृत्ति शोर निकालना चाहते हैं जाएगा है शून्य के माध्यम से आप कई क्रॉसिंग से बचें। – craigim

+0

धन्यवाद क्रेगिम मदद के लिए लेकिन आपका क्या मतलब है "वर्तमान बिंदु और अंतिम बिंदु के लिए परीक्षण x"। मुझे उनके खिलाफ क्या परीक्षण करना चाहिए? –

+0

सटीक रूप से आप यह कैसे करते हैं कि आप डेटा में कैसे पढ़ रहे हैं, इस विवरण पर निर्भर करेंगे, लेकिन यदि आपका लूप इंडेक्स 'n' है, तो आप कुछ ऐसा कर सकते हैं जैसे 'x = sign (t (n-1)) - sign (टी (एन)); यदि एक्स> 0; 8000 अंक जोड़ें; elseif x == 0; एक बिंदु संलग्न करें; elseif x <0; अंक जोड़ना बंद करो; अंत'। – craigim

0

उपयोग कर रहा हूँ आप इस तरह कर सकते हैं खोजने के लिए "जा रहा-अप" या "जा रहा डाउन" शून्य क्रॉसिंग:

%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

यहाँ परीक्षण कोड में दर-मामला किसी और इसी तरह के एक सवाल

%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 
संबंधित मुद्दे