একটি গোলমাল সাইন ওয়েভের জিরো ক্রসিং


9

সাইন ওয়েভকে বর্গাকার তরঙ্গে রূপান্তর করতে আমি সাইন ওয়েভের শূন্য ক্রসিংগুলি সন্ধান করার চেষ্টা করছি। একমাত্র সমস্যা হ'ল সাইন ওয়েভ গোলমাল করছে, তাই আমি প্রচুর পরিমাণে জিটার এবং মিথ্যা শূন্য ক্রসিংস পাচ্ছি।

যে কেউ কোনও সাধারণ psuedocode বা প্রাসঙ্গিক উপকরণ প্রস্তাব করতে পারেন? এখন পর্যন্ত আমার কাছে এরকম কিছু রয়েছে:

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

কেউ আরও শক্তিশালী পদ্ধতির সুপারিশ করতে পারেন?


এটিকে বর্গাকার তরঙ্গ করার চেষ্টা করার উদ্দেশ্য কী? আপনি কি সিগন্যালটি শুরু এবং শেষ হয় তা সন্ধান করার চেষ্টা করছেন? আপনি যদি হন তবে আমি একটি পদ্ধতির সুপারিশ করতে পারি।
স্পেসি

যদি ((নমুনা [i] * নমুনা [i + 1]) <0) শূন্য_ক্রসিং ++;
মারিয়াস হৃষ্কা

উত্তর:


8

মসৃণ শূন্য-ক্রসিংগুলি পেতে (বা আপনার সাইন ওয়েভের ফ্রিকোয়েন্সি অবস্থান সম্পর্কে ভাল ধারণা থাকলে এমনকি ব্যান্ড-পাস ফিল্টারিং) পেতে আপনি নিম্ন-পাস ফিল্টার করে ইনপুট সিগন্যাল চেষ্টা করতে পারেন। ঝুঁকিটি হ'ল যদি আপনার আবেদনের জন্য নমুনা-সঠিক পর্বের তথ্য প্রয়োজনীয় হয় তবে ফিল্টার থেকে অতিরিক্ত পিছিয়ে পড়া সমস্যা হতে পারে।

আরেকটি পদ্ধতি: সাইন ওয়েভকে বর্গাকার তরঙ্গে রূপান্তরের চেষ্টা করার পরিবর্তে, সাইন ওয়েভের সাথে পর্যায় / ফ্রিকোয়েন্সিতে নিজেকে সারিবদ্ধ করার জন্য একটি স্বাধীন বর্গাকার তরঙ্গ দোলক পাওয়ার কী হবে? এটি একটি পর্যায়-লক লুপ দিয়ে করা যেতে পারে ।


6

আপনি অবশ্যই যা দেখিয়েছেন তা শূন্য-ক্রসিং ডিটেক্টর। কয়েকটি বিষয় মাথায় আসে যা আপনার পরিস্থিতির উন্নতি করতে পারে:

  • যদি আপনার শব্দটি আপনার সিগন্যালের ব্যান্ডের বাইরে থাকে (যা প্রায় নিশ্চিতভাবেই ঘটে থাকে যেহেতু আপনার ইনপুটটি খাঁটি সুর) তবে আপনি আগ্রহের সিগন্যালের চারপাশে একটি ব্যান্ডপাস ফিল্টার প্রয়োগ করে সংকেত-থেকে-শয়েজ অনুপাত উন্নত করতে পারেন । ফিল্টারের passband প্রস্থ মনোনীত কিভাবে অবিকল sinusoid ফ্রিকোয়েন্সি জানি উপর ভিত্তি করে করা উচিত অবরোহমার্গী । সাইনোসয়েডে উপস্থিত শব্দের পরিমাণ হ্রাস করার মাধ্যমে, সঠিক ক্রসিংয়ের সময় সম্পর্কে মিথ্যা শূন্য ক্রসিংয়ের সংখ্যা এবং তাদের জিটক হ্রাস হবে।

    • পার্শ্ব নোট হিসাবে, যদি আপনার আগে সময়ের ভাল তথ্য না থাকে তবে আপনি একটি অভিযোজিত লাইন বর্ধক হিসাবে পরিচিত আরও পরিশীলিত কৌশলটি ব্যবহার করতে পারেন , যা এর নাম থেকেই বোঝা যায় এটি একটি অভিযোজিত ফিল্টার যা পর্যায়ক্রমিক ইনপুট সংকেতকে বাড়িয়ে তুলবে। তবে এটি কিছুটা উন্নত বিষয়, এবং আপনার সিগন্যালের ফ্রিকোয়েন্সি সম্পর্কে সাধারণত আপনার কাছে যথেষ্ট ধারণা রয়েছে যে এই ধরণের পদ্ধতির প্রয়োজন নেই।
  • শূন্য-ক্রসিং ডিটেক্টর নিজেই সম্মানের সাথে, আপনি প্রক্রিয়াটিতে কিছু হিস্টেরিসিস যুক্ত করতে পারেন । এটি সঠিক ক্রসিং তাত্ক্ষণিকের চারপাশে অতিরিক্ত মজাদার পরিমাপের ক্রসিংয়ের প্রজন্মকে আটকাবে। ডিটেক্টরটিতে হিস্টেরিসিস যুক্ত করা এর মতো দেখতে পারে:

    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আবার ইতিবাচক দিকে ফিরে গেছে তা ঘোষণা করার জন্য আপনাকে সিগন্যালটি প্রান্তিকের উপরে উঠতে হবে ।

    আপনি যা চান তা থ্রেশহোল্ডগুলি বেছে নিতে পারেন তবে সাইনোসয়েডের মতো ভারসাম্যপূর্ণ সংকেতের জন্য এগুলি শূন্যের প্রতিসাম্যপূর্ণ হওয়া বোঝা যায়। এই পদ্ধতির সাহায্যে আপনাকে পরিষ্কার-পরিচ্ছন্ন আউটপুট দিতে সাহায্য করতে পারে তবে আপনি শূন্য ক্রসিংয়ের পরিবর্তে অ-শূন্য প্রান্তিক ক্রসিংগুলি পরিমাপ করছেন বলে এই কারণে কিছুটা বিলম্ব যুক্ত হবে।

পিচেনেটস তার উত্তরে যেমন পরামর্শ দিয়েছে, একটি পর্যায়-লক করা লুপটি সম্ভবত সবচেয়ে ভাল উপায় হ'ল, যেমন একটি পিএলএল আপনি যা করতে চেষ্টা করছেন ঠিক তেমন করে। সংক্ষেপে, আপনি একটি বর্গাকার তরঙ্গ জেনারেটর চালান যা ইনপুট সাইনোসয়েডের সমান্তরালে চলে। পিএলএল সাইনোসয়েডের উপর পর্যায়ক্রমিক পর্যায়ে পরিমাপ করে, বর্গাকার তরঙ্গ জেনারেটরের তাত্ক্ষণিক ফ্রিকোয়েন্সি চালানোর জন্য পরিমাপের সেই ধারাটিকে ফিল্টার করে। এক পর্যায়ে লুপটি (আশাবাদী) লক হয়ে যাবে, যার বিন্দুতে বর্গাকার তরঙ্গটি ইনপুটটির সাইনোসয়েডের সাথে ফ্রিকোয়েন্সি এবং পর্যায়ে লক করা উচিত (কিছুটা ত্রুটির সাথে অবশ্যই; ইঞ্জিনিয়ারিংয়ের কোনও কিছুই নিখুঁত নয়)।


এটি কি শিমিট-ট্রিগার?
ডেভোরইন

প্রকৃতপক্ষে, আপনি বলতে পারেন যে এটি একটি স্মিট ট্রিগারটির একটি সফ্টওয়্যার সংস্করণ । শিমিট ট্রিগারটির সংজ্ঞাযুক্ত বৈশিষ্ট্যটি হিস্ট্রেসিসের সাথে তুলনামূলক
জেসন আর

উভয় অবস্থার যে কোনও প্রান্তিকের মধ্যে অন্তর্ভুক্ত করে ট্রানজিশনটি সনাক্ত না করা এড়াতে T। পরিবর্তে অর্থ && (sample[i - 1] > -T) && (sample[i] < -T)), ব্যবহার && (sample[i - 1] >= -T) && (sample[i] < -T))। এটি উভয় ifএবং else ifবিবৃতি প্রয়োগ করা প্রয়োজন ।
মার্চ

2

মাঝে মাঝে সিগন্যালে সাইন পরিবর্তনগুলি খুঁজে পেতে খুব সহজ পদ্ধতির সাথে আমার ভাল অভিজ্ঞতা রয়েছে:

  1. a = फरक (চিহ্ন (সংকেত))! = 0 # এটি সাইন পরিবর্তনগুলি সনাক্ত করে
  2. প্রার্থী = বার [ক] # এগুলি মিথ্যা ক্রসিং সহ সমস্ত প্রার্থী পয়েন্ট
  3. প্রার্থীদের মধ্যে পয়েন্ট ক্লাস্টার সন্ধান করুন
  4. প্রতিটি ক্লাস্টার গড় / মিডিয়ান, এটি আপনার চিহ্ন পরিবর্তন

  5. 4 দ্বারা পূর্বাভাস পয়েন্টে পদক্ষেপ ফাংশনের সাথে সম্পর্ক স্থাপন করুন

  6. পারস্পরিক সম্পর্ক ফলাফলের জন্য উপযুক্ত বক্ররেখা এবং শীর্ষগুলি সন্ধান করুন

আমার ক্ষেত্রে 5 এবং 6 পদ্ধতিটির যথার্থতা বাড়ায় না। আপনি শোনার সাথে আপনার সিগন্যালটি সরিয়ে ফেলতে পারেন এবং দেখুন এটি সাহায্য করে কিনা see


2

আমি জানি এই প্রশ্নটি বরং পুরানো, তবে সম্প্রতি আমাকে জিরো ক্রসিং বাস্তবায়ন করতে হয়েছিল। আমি ড্যানের পরামর্শ মতো করে প্রয়োগ করেছি এবং ফলটিতে সন্তুষ্ট। আমার পাইথন কোডটি এখানে রাখুন, যদি কেউ আগ্রহী হন। আমি প্রকৃতপক্ষে একটি মার্জিত প্রোগ্রামার নই, প্লিজ আমার সাথে বহন করবে।

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()

পিএলএস দ্রষ্টব্য: আমার কোড চিহ্নগুলি সনাক্ত করে না এবং সময়-প্রান্তিকতা নির্ধারণ করতে লক্ষ্য ফ্রিকোয়েন্সিটির সামান্য পূর্ব-পূর্ব জ্ঞান ব্যবহার করে। এই থ্রেশহোল্ডটি একাধিক ক্রসিং (ছবিতে বিভিন্ন বর্ণের বিন্দু) গোষ্ঠী হিসাবে ব্যবহার করা হয় যা থেকে মধ্যবর্তী দলের মধ্যবর্তীতমটি বেছে নেওয়া হয়েছে (ছবিতে নীল ক্রস))

চিহ্নিত শূন্য ক্রস সহ গোলমাল সাইন ওয়েভ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.