আমি কীভাবে স্যাম্পলিং ফ্রিকোয়েন্সি জানি?


16

আমি স্যাম্পলিং হার এবং বাউড্রেটস ইত্যাদি সম্পর্কে কিছুটা বিভ্রান্ত হতে শুরু করছি আমার এই আরডুইনো কোডটি রয়েছে:

#include <eHealth.h>

extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;


byte serialByte;
void setup() {
  Serial.begin(9600);
}

void loop() { 
  while (Serial.available()>0){  
    serialByte=Serial.read();
    if (serialByte=='S'){        
      while(1){
        fanalog0=eHealth.getECG();  
        // Use the timer0 => 1 tick every 4 us
        time=(timer0_overflow_count << 8) + TCNT0;        
        // Microseconds conversion.
        time=(time*4);   
        //Print in a file for simulation
        //Serial.print(time);
        //Serial.print(" ");
        Serial.print(fanalog0,5);
        Serial.print("\n");

        if (Serial.available()>0){
          serialByte=Serial.read();
          if (serialByte=='F')  break;
        }
      }
    }
  }
}

যেহেতু কোনও বিলম্ব বাধা নেই, স্যাম্পলিং হার / ফ্রিকোয়েন্সি কী? এটি কি আরডুইনো এডিসি গতির উপর ভিত্তি করে? আমি যখন বাউড্রেট বাড়িয়ে থাকি আমি কি নমুনা বর্ধন বা ক্রমিক বন্দর দিয়ে ডেটা প্রেরণ করি সে হারটি বাড়িয়ে দিচ্ছি?

উত্তর:


21

আরডুইনো এডিসি ঘড়ির গতি সেট করা আছে ..arduino-1.5.5 \ হার্ডওয়্যার \ আরডুইনো \ এভিআর ores কোরেস \ আরডুইনো \ ওয়্যারিং.সি

এখানে প্রাসঙ্গিক অংশ

#if defined(ADCSRA)
    // Set A/D prescale factor to 128
    // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
    // XXX: this will not work properly for other clock speeds, and
    // this code should use F_CPU to determine the prescale factor.
    sbi(ADCSRA, ADPS2);
    sbi(ADCSRA, ADPS1);
    sbi(ADCSRA, ADPS0);

    // Enable A/D conversions
    sbi(ADCSRA, ADEN);
#endif

16 মেগাহার্টজ আরডুইনোর জন্য এডিসি ঘড়িটি 16 মেগাহার্টজ / 128 = 125 কেএইচজেড সেট করা হয়েছে। এভিআর প্রতিটি রূপান্তর 13 এডিসি ঘড়ি তাই 125 কেএইচজেড / 13 = 9615 হার্জ লাগে।

এটি সর্বাধিক সম্ভব নমুনা হার, তবে আপনার অ্যাপ্লিকেশনটিতে প্রকৃত নমুনা হার ক্রমাগত রূপান্তর কলগুলির মধ্যে ব্যবধানের উপর নির্ভর করে।
আপনি যেহেতু ফলাফলটি পড়েছেন এবং এটি সিরিয়াল বন্দর দিয়ে পাঠিয়েছেন তাই বাডের হার কমার সাথে সাথে আপনি বিলম্ব পাচ্ছেন। একই দৈর্ঘ্যের ডেটা প্রেরণে বাউডের হার যত কম লাগবে এবং পরবর্তী এডিসি রূপান্তর কল করতে তত বেশি সময় লাগবে।

আপনার অ্যাপ্লিকেশনটিতে আসল স্যাম্পলিং হারটি ডিবাগার বা একটি সিমুলেটর ব্যবহারের মাধ্যমে নির্ধারণ করা যেতে পারে তবে আপনি যখনই কোনও রূপান্তর সম্পাদন করেন প্রতিবার ডিজিটাল পিনটি টগল করা এবং ডিজিটাল পিনটি টগল করে এমন ফ্রিকোয়েন্সিটি পরিমাপ করা এর একটি সহজ সমাধান।


এছাড়াও, আমার সময়ের স্ট্যাম্পগুলির মধ্যে সময়টি 1300 ডলার থেকে 16400 ডলার পর্যন্ত বেড়ে যায়, অবশ্যই তাদের কি একই থাকবে? এটি 11500 এ, 9600 এ, তারা অনেক সময় পরে কেবল প্রায় 1500 বৃদ্ধি করে।
ব্যবহারকারী 3284376

আপনার ব্যবহারকারী স্ট্যাম্প কোড সম্পর্কে @ ব্যবহারকারী 3284376, আমি মনে করি এটি সর্বদা কাজ করতে পারে না (ভুল সময়ে কিছু বিঘ্ন ঘটায় পক্ষপাতদুষ্ট হতে পারে)। আমি আপনাকে অর্ডিনোতে কীভাবে উচ্চ নির্ভুলতার সময় পাবেন এবং আপনার কোডের প্রাসঙ্গিক অংশটি এখানে রাখবেন সে সম্পর্কে একটি নির্দিষ্ট প্রশ্ন পোস্ট করার পরামর্শ দিচ্ছি।
jfpoil ব্যাখ্যা

7

আমি একটি প্রকল্পের জন্য একটি উচ্চ স্যাম্পলিং হারও পেতে চেয়েছিলাম। দেখা যাচ্ছে যে ADPSR, ADPS1, ADPS0 রেজিস্ট্রারের ADPS0 বিটগুলি 76923 s / s বা 76.8 ks / s এর নমুনা হার পেতে কনফিগার করা যেতে পারে। তবে, সাবধান থাকুন যে আমি আমার আরডুইনোর এডিসি ফ্রি চলমান মোডে চালাচ্ছি, নিম্নলিখিত লাইনগুলি আমার পক্ষে কাজ করেছে।

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// Set the Prescaler to 16 (16000KHz/16 = 1MHz)
// WARNING: Above 200KHz 10-bit results are not reliable.
//ADCSRA |= B00000100;
sbi(ADCSRA, ADPS2);
cbi(ADCSRA, ADPS1);
cbi(ADCSRA, ADPS0);

// Set ADIE in ADCSRA (0x7A) to enable the ADC interrupt.
// Without this, the internal interrupt will not trigger.
//ADCSRA |= B00001000;
sbi(ADCSRA,ADIE)
}

এই ফ্রিকোয়েন্সিতে সাধারণ 10-বিট ফলাফল নির্ভরযোগ্য নয়। এর অর্থ হল যে নমুনার হার বাড়ানো ফলাফলের যথার্থতা হ্রাস পাবে। সুতরাং আমি কেবল উপরের 8 টি বিট ব্যবহার করি কারণ এই প্রিস্ক্যালারে উপরের 8 বিটগুলি নির্ভরযোগ্য। আপনি এই পৃষ্ঠায় আরও বিশদ যেতে পারেন, এই বোন পাথর! তিনি ইউএনও http://www.instructables.com/id/Girino-Fast-Ardino-Oscilloscope/ ব্যবহার করে একটি উচ্চ নমুনা হারের অসিলোস্কেপ তৈরি করেছেন


3

প্রতিটি লুপ আপনি একটি 9600 বিপিএস সিরিয়াল লিঙ্কের উপরে 8 টি অক্ষর মুদ্রণ করছেন। প্রতিটি অক্ষর 10 টি বিট নেয় (1 শুরু, চরিত্রের জন্য 8 বিট, 1 স্টপ)। এর অর্থ আপনি কেবল এই লুপটি দিয়ে যেতে পারেন ~ 120 বার / সেকেন্ড।

analogRead()ফাংশন তত্ত্ব সম্পর্কে 9600 বার / সেকেন্ড এ নমুনা করতে পারেন বাস্তবানুগভাবে এটা সম্পর্কে 8600 বার / সেকেন্ড হয়।

আপনি সিরিয়াল যোগাযোগ দ্বারা আবদ্ধ হয়।


তাই 115200 এ বৃদ্ধি, 1440 বার / সেকেন্ড দেয়, এটি কি নমুনার হার?
ব্যবহারকারী 3284376

হ্যাঁ, দিন বা নিন। আপনার মনে রাখতে হবে যে সিরিয়ালটির প্রয়োজন অন্য প্রান্তটি সাড়া দেয়, সুতরাং আপনি পিসি সাড়া দেওয়ার উপর নির্ভরশীল। এটি নির্মাতারাবাদী নয় তাই আপনি জিটার পাবেন।
সাইবার্বিবনস

জিনিসগুলির আরডুইনো প্রান্তে আপনি ঠিকই আছেন, এগুলি সব ঠিক আছে, তবে পাইথন বিষয়গুলিতে অনেক ধীর গতিযুক্ত, জিনিসগুলির কম্পিউটারের শেষে পারফরম্যান্স বাড়ানোর জন্য আমার কী ধরণের জিনিসগুলির প্রয়োজন?
ব্যবহারকারী 3284376

পিসিতে সিরিয়াল পারফরম্যান্সের সমস্যা হিসাবে আপনার এটিকে দেখার দরকার নেই, তবে ডেটা প্রেরণ থেকে নমুনাটি কীভাবে ডিকম্পল হয়ে যায়।
সাইবারবিবোনস

1
@ সাইবারিগিবনস - না, এটি এমন একটি ইউনোতে চলছে যেখানে ইউএসবি এবং সিরিয়ালটি ডিউপলড হয়েছে, 'এস' অক্ষর জারি করা এবং 'এফ' জারি না করা ছাড়া পিসির উপর কোনও নির্ভরতা নেই। এখানে পোস্ট করা স্কেচ এবং যে প্ল্যাটফর্মটি এটি চালিত হয় তা ইউএসবি-সিরিয়াল সহচর মাইক্রোতে আনন্দের সাথে সিরিয়াল ডেটা নিক্ষেপ করবে, যদি ইউএসবির অন্য প্রান্তের কিছু বা কিছু চালিয়ে যায় তবে অন্ধভাবে গাফিল।
ক্রিস

3

00৯০০ এর বাডে সিরিয়ালটিতে ১১ টি বিট প্রেরণ করা হচ্ছে, তবে নমুনা দেওয়ার জন্য, আমি এটি যত তাড়াতাড়ি অল্প বিলম্বের সাথে একটি অ্যারেতে রেখেছি, তারপরে এটি শেষ হয়ে গেলে, আমি অজগর স্ক্রিপ্টটি পড়ার জন্য এটি সিরিয়াল বন্দরের মাধ্যমে প্রেরণ করি। আমি ম্যাটপ্ল্লোলিব ব্যবহার করে এফএফটির জন্য এটি করছি। আমি একটি 0-5V সিগন্যাল শুনি, তারপরে দেরি () ফাংশনটি ব্যবহার না করেই আমি অ্যানালগ রিড () মানগুলিকে সেই অ্যারেটিতে সঞ্চয় করি। একটি বিভক্ত সেকেন্ডে পড়া শেষ হয়, তারপরে সিরিয়াল ডেটা ডাম্প শুরু হয়। আমি যখন অন্য সংযুক্ত আরডুইনো থেকে স্বর () ব্যবহার করে ইনপুট ফ্রিকোয়েন্সিটি ক্যালিব্রেট করেছিলাম তখন বুঝতে পারি যে .1 হার্জ-এর মধ্যে নির্ভুলতা পাওয়ার জন্য আমাকে সূচকটি 8915 দ্বারা বিভক্ত করতে হয়েছিল। যেহেতু সঠিক সূচকের অন্তর অন্তর পেতে স্যাম্পলিংয়ের ফ্রিকোয়েন্সি অনুসারে একজনকে ভাগ করতে হবে, আমার ধারণা আর্দুইনো স্যাম্পলিং ফ্রিকোয়েন্সি (আমার কোড সহ কমপক্ষে আমার) 8915Hz।


1

নমুনা হার এবং বাড রেটের মধ্যে পার্থক্য সম্পর্কে অংশ উল্লেখ করে, তারা বিভিন্ন পরিমাপ।

নমুনা হার হ'ল ফ্রিকোয়েন্সি যেখানে ডিভাইস (আরডুইনো) আগত এনালগ মানগুলির একটি ডিজিটাল উপস্থাপনা পুনরায় তৈরি করতে পারে।

বাউড রেট এমন এক হার যা কোনও যোগাযোগের চ্যানেলে তথ্য স্থানান্তরিত হয়। এটি মাইক্রোকন্ট্রোলার এবং বাইরের বিশ্বের (কম্পিউটার) মধ্যে যোগাযোগের হারকে বর্ণনা করে।

আমি এই ইলেক্ট্রনিক্স_স্ট্যাক_ এক্সচেঞ্জ লিঙ্কটি সুপারিশ করব। /electronics/135056/sampling-rate-data-rate-and-bandwidth


0

8915Hz - এটি 125000/14 এর খুব কাছাকাছি 89 = 8928.6 আমার প্রাথমিক অনুমান যে স্যাম্পলিংয়ের জন্য একটি এডিসি ঘড়ি এবং নিজেই রূপান্তরকরণের জন্য 13 এডিসি ঘড়িগুলির সংলগ্ন রূপান্তরগুলির মধ্যে ঠিক একটি ফাঁক প্রয়োজন। ছোট ত্রুটি আরডুইনোর নিখুঁত ক্লক উত্সের প্রভাব হতে পারে। আমি এখনও নিশ্চিত নই. এই বিষয়টি এখন আমার পক্ষে বাস্তব, কারণ নমুনাযুক্ত ডেটা অবশ্যই ডিজিটাল ফিল্টারকে খাওয়ায়।


1
আমি নিশ্চিত না আপনি যখন বলছেন তখন কী বোঝাতে চাইছেন "এই বিষয়টি এখন আমার পক্ষে সত্য কারণ নমুনাযুক্ত ডেটা অবশ্যই ডিজিটাল ফিল্টারকে খাওয়াবে"। আপনারও কি একই রকম সমস্যা হচ্ছে?
VE7JRO

প্রতিটি রূপান্তর এডিসি ঘড়ির উঠতি প্রান্তে শুরু হয় এবং কমপক্ষে একটি এডিসি ঘড়ি চক্র নির্বাহকারী কোডটি হারিয়ে যায়। সুতরাং হ্যাঁ, 8928.6 হার্জেডটি আপনি analogRead()একটি নিবিড় লুপে কল করে ফ্রি-রানিং মোডে খুব সামঞ্জস্যপূর্ণ 9615.4 হার্জেডের সাহায্যে দ্রুততম গতি পেতে পারেন ।
এডগার বোনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.