एक शोर साइन वेव की जीरो क्रॉसिंग


9

मैं साइन लहर को वर्ग तरंग में बदलने के लिए एक साइन लहर के शून्य क्रॉसिंग को खोजने की कोशिश कर रहा हूं। एकमात्र समस्या यह है कि साइन लहर शोर है, इसलिए मुझे बहुत सारे घबराने और झूठे शून्य क्रॉसिंग मिल रहे हैं।

किसी को भी किसी भी सरल psuedocode या प्रासंगिक सामग्री की सिफारिश कर सकते हैं? अब तक मेरे पास ऐसा कुछ है:

if (sample[i]>0 && sample[i+1]<0) || (sample[i]<0 && sample[i+1]>0)

क्या कोई अधिक मजबूत विधि की सिफारिश कर सकता है?


आप इसे चौकोर लहर बनाने के लिए क्या प्रयास कर रहे हैं? क्या आप यह पता लगाने की कोशिश कर रहे हैं कि सिग्नल कहाँ से शुरू और समाप्त होता है? यदि आप हैं तो मैं एक विधि सुझा सकता हूं।
Spacey

अगर (नमूना [i] * नमूना [i + 1]) <0) शून्य_क्रॉसिंग ++;
मारियस ह्रीस्का

जवाबों:


8

यदि आप साइन-इन शून्य शून्य-क्रॉसिंग प्राप्त करने के लिए इनपुट सिग्नल को कम-पास फ़िल्टर करने की कोशिश कर सकते हैं (या यदि आप साइन वेव की आवृत्ति स्थान का अच्छा विचार रखते हैं, तो बैंड-पास फ़िल्टरिंग भी)। जोखिम यह है कि यदि आपके आवेदन के लिए नमूना-सटीक चरण की जानकारी आवश्यक है, तो फ़िल्टर से अतिरिक्त अंतराल एक समस्या हो सकती है।

एक अन्य दृष्टिकोण: साइन वेव को एक स्क्वायर वेव में बदलने की कोशिश करने के बजाय, एक स्वतंत्र स्क्वायर वेव थरथरानवाला को अपने आप को साइन वेव के साथ चरण / आवृत्ति में संरेखित करने के बारे में क्या? यह एक चरण-बंद लूप के साथ किया जा सकता है ।


6

आपने जो निश्चित रूप से दिखाया है वह शून्य-क्रॉसिंग डिटेक्टर है। कुछ बातें ध्यान में आती हैं जो आपकी स्थिति में सुधार कर सकती हैं:

  • यदि आपके पास शोर है जो आपके सिग्नल के बैंड के बाहर है (जो लगभग निश्चित रूप से मामला है, चूंकि आपका इनपुट एक शुद्ध टोन है), तो आप ब्याज के सिग्नल के चारों ओर एक बैंडपास फ़िल्टर लगाकर सिग्नल-टू-शोर अनुपात में सुधार कर सकते हैं । फ़िल्टर के पासबैंड की चौड़ाई को इस आधार पर चुना जाना चाहिए कि आप साइनसोइड आवृत्ति को प्राथमिकता से कैसे जानते हैं । साइनसॉइड पर मौजूद शोर की मात्रा को कम करके, सही क्रॉसिंग समय के बारे में झूठी शून्य क्रॉसिंग और उनके घबराने की संख्या कम हो जाएगी।

    • एक साइड नोट के रूप में, यदि आपके पास समय से पहले अच्छी जानकारी नहीं है, तो आप एक अधिक परिष्कृत तकनीक का उपयोग कर सकते हैं जिसे एडाप्टिव लाइन एन्हांसर के रूप में जाना जाता है , जो कि, जैसा कि इसका नाम है, एक अनुकूली फिल्टर है जो एक आवधिक इनपुट संकेत को बढ़ाएगा। हालाँकि, यह कुछ हद तक उन्नत विषय है, और आपके पास आमतौर पर आपके सिग्नल की आवृत्ति का एक अच्छा विचार है कि इस तरह के दृष्टिकोण की आवश्यकता नहीं है।
  • शून्य-क्रॉसिंग डिटेक्टर के संबंध में, आप प्रक्रिया में कुछ हिस्टैरिसीस जोड़ सकते हैं । यह सही क्रॉसिंग इंस्टेंट के आसपास अतिरिक्त सहज मापी क्रॉसिंग की पीढ़ी को रोक देगा। डिटेक्टर को हिस्टैरिसीस जोड़ने से कुछ इस तरह दिख सकता है:

    if ((state == POSITIVE) && (sample[i - 1] > -T) && (sample[i] < -T))
    {
        // handle negative zero-crossing
        state = NEGATIVE;
    }
    else if ((state == NEGATIVE) && (sample[i - 1] < T) && (sample[i] > T))
    {
        // handle positive zero-crossing
        state = POSITIVE;
    }
    

    प्रभावी रूप से, आप अपने शून्य-क्रॉसिंग डिटेक्टर में कुछ राज्य जोड़ते हैं। यदि आप मानते हैं कि इनपुट सिग्नल का सकारात्मक मूल्य है, तो आपको -Tएक वास्तविक शून्य क्रॉसिंग घोषित करने के लिए सिग्नल को एक चुने हुए मूल्य से कम होना चाहिए। इसी तरह, आपको यह संकेत करने की आवश्यकता है कि सिग्नल फिर से थ्रेसहोल्ड से ऊपर उठता Tहै ताकि यह घोषित किया जा सके कि सिग्नल फिर से सकारात्मक हो गया है।

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

जैसा कि उनके जवाब में pichenettes ने सुझाव दिया था, एक चरण-बंद लूप जाने की सबसे अच्छी संभावना होगी, क्योंकि एक PLL बहुत अधिक सटीक रूप से वही करता है जो आप करने की कोशिश कर रहे हैं। संक्षेप में, आप एक वर्ग तरंग जनरेटर चलाते हैं जो इनपुट साइनसॉइड के साथ समानांतर में चलता है। PLL साइनसॉइड पर आवधिक चरण माप करता है, फिर वर्ग तरंग जनरेटर की तात्कालिक आवृत्ति को चलाने के लिए माप की उस धारा को फ़िल्टर करता है। कुछ बिंदु पर, लूप होगा (उम्मीद) ताला, जिस बिंदु पर वर्ग तरंग को आवृत्ति में बंद किया जाना चाहिए और इनपुट के साइनसॉइड के साथ चरण में होना चाहिए (कुछ राशि त्रुटि के साथ, निश्चित रूप से, इंजीनियरिंग में कुछ भी सही नहीं है)।


यह एक Schmitt- ट्रिगर है?
डाइवरिन

वास्तव में, आप कह सकते हैं कि यह एक Schmitt ट्रिगर का सॉफ्टवेयर संस्करण है । श्मिट ट्रिगर की परिभाषित विशेषता यह है कि यह हिस्टैरिसीस के साथ एक तुलनित्र है
जेसन आर

संक्रमण का पता नहीं लगाने से बचने के लिए दोनों में से किसी भी स्थिति में सीमा शामिल है T। इसके बजाय && (sample[i - 1] > -T) && (sample[i] < -T)), का उपयोग करें && (sample[i - 1] >= -T) && (sample[i] < -T))। यह दोनों ifऔर else ifकथनों पर लागू किया जाना चाहिए ।
मार्क

2

मेरे पास बहुत ही सरल विधि के साथ अच्छा अनुभव है जो समय पर संकेत में परिवर्तन को खोजने के लिए है:

  1. a = diff (संकेत (सिग्नल))! = 0 # यह संकेत परिवर्तनों का पता लगाता है
  2. उम्मीदवार = बार [a] # ये सभी उम्मीदवार बिंदु हैं, जिसमें गलत क्रॉसिंग शामिल हैं
  3. उम्मीदवारों में अंकों के समूह खोजें
  4. औसत / मंझला प्रत्येक क्लस्टर, यह आपका संकेत परिवर्तन है

  5. 4 से अनुमानित बिंदु पर कदम समारोह के साथ सहसंबंध

  6. फिट वक्र से सहसंबंध के परिणाम और चोटी पाते हैं

मेरे मामले में 5 और 6 विधि की शुद्धता नहीं बढ़ाते हैं। आप शोर के साथ अपने संकेत को कम कर सकते हैं और देखें कि क्या यह मदद करता है।


2

मुझे पता है कि यह सवाल पुराना है, लेकिन मुझे हाल ही में जीरो क्रॉसिंग लागू करना पड़ा। मैंने जिस तरह से डैन को सुझाव दिया और उसके परिणाम से खुश हूं। अगर कोई दिलचस्पी रखता है, तो मेरे अजगर कोड का उपयोग करता है। मैं वास्तव में एक सुंदर प्रोग्रामर नहीं हूं, pls मेरे साथ रहें।

import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle

fig = plt.figure()
ax = fig.add_subplot(111)

sample_time = 0.01
sample_freq = 1/sample_time

# a-priori knowledge of frequency, in this case 1Hz, make target_voltage variable to use as trigger?
target_freq = 1
target_voltage = 0

time = np.arange(0.0, 5.0, 0.01)
data = np.cos(2*np.pi*time)
noise = np.random.normal(0,0.2, len(data))
data = data + noise


line, = ax.plot(time, data, lw=2)

candidates = [] #indizes of candidates (values better?)
for i in range(0, len(data)-1):
    if data[i] < target_voltage and data[i+1] > target_voltage:
        #positive crossing
        candidates.append(time[i])
    elif data[i] > target_voltage and data[i+1] < target_voltage:
        #negative crossing
        candidates.append(time[i])

ax.plot(candidates, np.ones(len(candidates)) * target_voltage, 'rx')
print('candidates: ' + str(candidates))

#group candidates by threshhold
groups = [[]]
time_thresh = target_freq / 8;
group_idx = 0;

for i in range(0, len(candidates)-1):
    if(candidates[i+1] - candidates[i] < time_thresh):
        groups[group_idx].append(candidates[i])
        if i == (len(candidates) - 2):
            # special case for last candidate
            # in this case last candidate belongs to the present group
            groups[group_idx].append(candidates[i+1])
    else:
        groups[group_idx].append(candidates[i])
        groups.append([])
        group_idx = group_idx + 1
        if i == (len(candidates) - 2):
            # special case for last candidate
            # in this case last candidate belongs to the next group
            groups[group_idx].append(candidates[i+1])



cycol = cycle('bgcmk')
for i in range(0, len(groups)):
    for j in range(0, len(groups[i])):
        print('group' + str(i) + ' candidate nr ' + str(j) + ' value: ' + str(groups[i][j]))
    ax.plot(groups[i], np.ones(len(groups[i])) * target_voltage, color=next(cycol), marker='o',  markersize=4)


#determine zero_crosses from groups
zero_crosses = []

for i in range(0, len(groups)):
    group_median = groups[i][0] + ((groups[i][-1] - groups [i][0])/2)
    print('group median: ' + str(group_median))
    #find index that best matches time-vector
    idx = np.argmin(np.abs(time - group_median))
    print('index of timestamp: ' + str(idx))
    zero_crosses.append(time[idx])


#plot zero crosses
ax.plot(zero_crosses, np.ones(len(zero_crosses)) * target_voltage, 'bx', markersize=10) 
plt.show()

Pls ध्यान दें: मेरा कोड संकेतों का पता नहीं लगाता है और समय-सीमा को निर्धारित करने के लिए लक्ष्य आवृत्ति के एक छोटे से प्राथमिक-ज्ञान का उपयोग करता है। इस दहलीज का उपयोग कई क्रॉसिंग (चित्र में अलग-अलग रंग के डॉट्स) को समूहित करने के लिए किया जाता है, जिसमें से समूह के मध्य वाले के सबसे करीब का चयन किया जाता है (चित्र में नीला क्रॉस)।

चिह्नित शून्य क्रॉस के साथ शोर साइन लहर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.