সুচিপত্র:

1024 নমুনা FFT বর্ণালী বিশ্লেষক একটি Atmega1284: 9 ধাপ ব্যবহার করে
1024 নমুনা FFT বর্ণালী বিশ্লেষক একটি Atmega1284: 9 ধাপ ব্যবহার করে

ভিডিও: 1024 নমুনা FFT বর্ণালী বিশ্লেষক একটি Atmega1284: 9 ধাপ ব্যবহার করে

ভিডিও: 1024 নমুনা FFT বর্ণালী বিশ্লেষক একটি Atmega1284: 9 ধাপ ব্যবহার করে
ভিডিও: 🔥 ২০২৪ সালের এসএসসি পরীক্ষার্থীদের জন্য বড় দুঃসংবাদ | SSC 2024 updates 2024, জুলাই
Anonim
একটি Atmega1284 ব্যবহার করে 1024 নমুনা FFT বর্ণালী বিশ্লেষক
একটি Atmega1284 ব্যবহার করে 1024 নমুনা FFT বর্ণালী বিশ্লেষক
একটি Atmega1284 ব্যবহার করে 1024 নমুনা FFT বর্ণালী বিশ্লেষক
একটি Atmega1284 ব্যবহার করে 1024 নমুনা FFT বর্ণালী বিশ্লেষক

এই অপেক্ষাকৃত সহজ টিউটোরিয়াল (এই বিষয়ের জটিলতা বিবেচনা করে) আপনাকে দেখাবে কিভাবে আপনি একটি খুব সহজ 1024 নমুনা বর্ণালী বিশ্লেষক তৈরি করতে পারেন একটি Arduino টাইপ বোর্ড (1284 ন্যারো) এবং সিরিয়াল প্লটার ব্যবহার করে। যেকোনো ধরনের Arduino সামঞ্জস্যপূর্ণ বোর্ডই করবে, কিন্তু এতে যত বেশি র‍্যাম থাকবে, ততই সেরা ফ্রিকোয়েন্সি রেজোলিউশন আপনি পাবেন। 1024 টি নমুনার সাথে এফএফটি গণনা করার জন্য এটির 8 কেবি এর বেশি র RAM্যামের প্রয়োজন হবে।

স্পেকট্রাম বিশ্লেষণ একটি সংকেত প্রধান ফ্রিকোয়েন্সি উপাদান নির্ধারণ করতে ব্যবহৃত হয়। অনেক শব্দ (যেমন একটি বাদ্যযন্ত্র দ্বারা উত্পাদিত) একটি মৌলিক ফ্রিকোয়েন্সি এবং কিছু হারমোনিক যা একটি ফ্রিকোয়েন্সি থাকে যা মৌলিক ফ্রিকোয়েন্সি এর একটি পূর্ণসংখ্যা একাধিক। বর্ণালী বিশ্লেষক আপনাকে এই সমস্ত বর্ণালী উপাদান দেখাবে।

আপনি এই সেটআপটি ফ্রিকোয়েন্সি কাউন্টার হিসাবে ব্যবহার করতে চাইতে পারেন বা যে কোনও ধরণের সংকেত পরীক্ষা করতে পারেন যা আপনার সন্দেহ করে যে আপনার ইলেকট্রনিক সার্কিটে কিছু গোলমাল আনছে।

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

ধাপ 1: লাইব্রেরি ইনস্টল করা

আমরা এনরিক কন্ডেসের লেখা ArduinoFFT লাইব্রেরি ব্যবহার করব। যেহেতু আমরা যতটা সম্ভব র RAM্যামকে বাদ দিতে চাই তাই আমরা এই সংগ্রহস্থলের বিকাশ শাখাটি ব্যবহার করব যা নমুনা এবং গণনা করা ডেটা সংরক্ষণের জন্য ফ্লোট ডেটা টাইপ (ডাবল পরিবর্তে) ব্যবহার করার অনুমতি দেয়। সুতরাং আমাদের এটি ম্যানুয়ালি ইনস্টল করতে হবে। চিন্তা করবেন না, শুধু আর্কাইভটি ডাউনলোড করুন এবং এটি আপনার Arduino লাইব্রেরি ফোল্ডারে অসম্পূর্ণ করুন (উদাহরণস্বরূপ উইন্ডোজ 10 ডিফল্ট কনফিগারেশনে: C: ers Users / _your_user_name_ / Documents / Arduino / লাইব্রেরি)

আপনি "FFT_01.ino" এর মতো প্রদত্ত উদাহরণগুলির মধ্যে একটি সংকলন করে লাইব্রেরিটি সঠিকভাবে ইনস্টল করা আছে কিনা তা পরীক্ষা করতে পারেন।

ধাপ 2: ফুরিয়ার ট্রান্সফর্ম এবং এফএফটি ধারণা

সতর্কবাণী: যদি আপনি কোন গাণিতিক স্বরলিপি দেখে দাঁড়াতে না পারেন তবে আপনি 3 য় ধাপ এড়িয়ে যেতে চাইতে পারেন, যাইহোক, যদি আপনি সব কিছু না পান তবে বিভাগের শেষে উপসংহারটি বিবেচনা করুন।

ফ্রিকোয়েন্সি বর্ণালী একটি ফাস্ট ফুরিয়ার ট্রান্সফর্ম অ্যালগরিদমের মাধ্যমে প্রাপ্ত হয়। এফএফটি একটি ডিজিটাল বাস্তবায়ন যা ফুরিয়ার ট্রান্সফর্মের গাণিতিক ধারণাকে অনুমান করে। এই ধারণার অধীনে একবার আপনি একটি সময় অক্ষ অনুসরণ করে একটি সংকেত বিবর্তন পেতে, আপনি জটিল (বাস্তব + কাল্পনিক) মান গঠিত ফ্রিকোয়েন্সি ডোমেইনে তার প্রতিনিধিত্ব জানতে পারেন। ধারণাটি পারস্পরিক, তাই যখন আপনি ফ্রিকোয়েন্সি ডোমেন উপস্থাপনা জানেন তখন আপনি এটিকে টাইম ডোমেইনে রূপান্তর করতে পারেন এবং ট্রান্সফর্মের ঠিক আগের মত সিগন্যাল ফিরে পেতে পারেন।

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

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

একটি নিখুঁত ধারণা, কিন্তু:

  1. যেহেতু এফএফটি ফুরিয়ার ট্রান্সফর্মের একটি ডিজিটালাইজড সংস্করণ, এটি ডিজিটাল সংকেতকে আনুমানিক করে এবং কিছু তথ্য হারিয়ে ফেলে। সুতরাং, কঠোরভাবে বলতে গেলে, এফএফটির ফলাফল যদি উল্টানো এফএফটি অ্যালগরিদম দিয়ে ফিরে আসে তবে আসল সংকেত দেবে না।
  2. এছাড়াও তত্ত্ব একটি সংকেত বিবেচনা করে যা সসীম নয়, কিন্তু এটি একটি চিরস্থায়ী স্থির সংকেত। যেহেতু আমরা এটিকে একটি নির্দিষ্ট সময়ের জন্য (অর্থাৎ নমুনা) ডিজিটালাইজ করব, তাই আরো কিছু ত্রুটি চালু করা হবে।
  3. পরিশেষে এনালগ থেকে ডিজিটাল রূপান্তরের রেজুলেশন গণিত মানগুলির গুণমানকে প্রভাবিত করবে।

প্রস্তুতিতে

1) নমুনা ফ্রিকোয়েন্সি (উল্লেখিত fs)

আমরা একটি সংকেত নমুনা করব, যেমন তার প্রশস্ততা পরিমাপ, প্রতি 1/fs সেকেন্ড। fs হল নমুনা ফ্রিকোয়েন্সি। উদাহরণস্বরূপ যদি আমরা 8 KHz এ নমুনা দেই, ADP (এনালগ টু ডিজিটাল কনভার্টার) যা চিপে থাকে তা প্রতি 1/8000 সেকেন্ডে একটি পরিমাপ প্রদান করবে।

2) নমুনার সংখ্যা (কোডে উল্লেখিত এন বা নমুনা)

যেহেতু এফএফটি চালানোর আগে আমাদের সমস্ত মান পেতে হবে সেগুলি আমাদের সংরক্ষণ করতে হবে এবং তাই আমরা নমুনার সংখ্যা সীমিত করব। এফএফটি অ্যালগরিদমের জন্য অনেকগুলি নমুনার প্রয়োজন যা 2 এর একটি শক্তি। আমাদের কাছে যত বেশি নমুনা আছে তত ভাল কিন্তু এতে প্রচুর মেমরি লাগে, আমাদেরকে রূপান্তরিত ডেটা সংরক্ষণ করতে হবে, যা জটিল মান। Arduino FFT লাইব্রেরি ব্যবহার করে কিছু স্থান বাঁচায়

  • নমুনাযুক্ত ডেটা এবং তারপর রূপান্তরিত ডেটার আসল অংশ সংরক্ষণ করার জন্য "vReal" নামে একটি অ্যারে
  • রূপান্তরিত তথ্যের কাল্পনিক অংশ সংরক্ষণের জন্য "vImag" নামে একটি অ্যারে

RAM এর প্রয়োজনীয় পরিমাণ 2 (অ্যারে) * 32 (বিট) * N (নমুনা) সমান।

তাই আমাদের Atmega1284 তে 16 KB র‍্যাম আছে যার মধ্যে আমরা সর্বোচ্চ N = 16000*8/64 = 2000 মান সংরক্ষণ করব। যেহেতু মান সংখ্যা 2 এর একটি শক্তি হতে হবে, তাই আমরা সর্বাধিক 1024 মান সংরক্ষণ করব।

3) ফ্রিকোয়েন্সি রেজোলিউশন

এফএফটি নমুনার সংখ্যার মতো ফ্রিকোয়েন্সি ব্যান্ডের মান গণনা করবে। এই ব্যান্ডগুলি 0 HZ থেকে স্যাম্পলিং ফ্রিকোয়েন্সি (fs) পর্যন্ত বিস্তৃত হবে। অতএব, ফ্রিকোয়েন্সি রেজোলিউশন হল:

Fresolution = fs / N

রেজোলিউশন কম হলে ভালো হয়। তাই ভাল রেজোলিউশনের জন্য (নিম্ন) আমরা চাই:

  • আরো নমুনা, এবং/অথবা
  • একটি নিম্ন fs

কিন্তু…

4) ন্যূনতম fs

যেহেতু আমরা অনেক ফ্রিকোয়েন্সি দেখতে চাই, তাদের মধ্যে কিছু "মৌলিক ফ্রিকোয়েন্সি" এর চেয়ে অনেক বেশি আমরা fs খুব কম সেট করতে পারি না। প্রকৃতপক্ষে Nyquist -Shannon স্যাম্পলিং থিওরেম আছে যা আমাদের পরীক্ষা করার জন্য সর্বোচ্চ ফ্রিকোয়েন্সি এর দ্বিগুণ উপরে একটি নমুনা ফ্রিকোয়েন্সি আছে।

উদাহরণস্বরূপ, যদি আমরা 0 Hz থেকে সমস্ত বর্ণালী বিশ্লেষণ করতে চাই 15 KHz বলতে চাই, যা প্রায় সর্বাধিক ফ্রিকোয়েন্সি যা অধিকাংশ মানুষ স্পষ্টভাবে শুনতে পারে, আমাদের নমুনা ফ্রিকোয়েন্সি 30 KHz এ সেট করতে হবে। প্রকৃতপক্ষে ইলেক্ট্রনিক্সরা এটি প্রায় 2.5 (অথবা এমনকি 2.52) * সর্বোচ্চ ফ্রিকোয়েন্সি সেট করে। এই উদাহরণে এটি 2.5 * 15 KHz = 37.5 KHz হবে। পেশাদার অডিওতে সাধারণ নমুনা ফ্রিকোয়েন্সি হল 44.1 KHz (অডিও সিডি রেকর্ডিং), 48 KHz এবং আরও অনেক কিছু।

উপসংহার:

পয়েন্ট 1 থেকে 4 এর দিকে নিয়ে যায়: আমরা যতটা সম্ভব নমুনা ব্যবহার করতে চাই। আমাদের ক্ষেত্রে 16 কেবি র RAM্যাম ডিভাইসের সাথে আমরা 1024 টি নমুনা বিবেচনা করব। আমরা যতটা সম্ভব সর্বনিম্ন নমুনা ফ্রিকোয়েন্সি নমুনা করতে চাই, যতক্ষণ পর্যন্ত এটি আমাদের সিগন্যালে প্রত্যাশিত সর্বোচ্চ ফ্রিকোয়েন্সি বিশ্লেষণ করার জন্য যথেষ্ট উচ্চ (2.5 * এই ফ্রিকোয়েন্সি, কমপক্ষে)।

ধাপ 3: একটি সংকেত অনুকরণ

একটি সংকেত অনুকরণ
একটি সংকেত অনুকরণ

আমাদের প্রথম প্রচেষ্টার জন্য, আমরা লাইব্রেরিতে দেওয়া TFT_01.ino উদাহরণটি সামান্য পরিবর্তন করব, যাতে গঠিত সংকেত বিশ্লেষণ করা যায়

  • মৌলিক ফ্রিকোয়েন্সি, 440 Hz (বাদ্যযন্ত্র A)
  • মৌলিক ("-3 ডিবি") অর্ধেক শক্তিতে তৃতীয় সুরেলা
  • মৌলিক শক্তি ("-6 ডিবি) এর 1/4 ভাগে 5 ম সুরেলা

আপনি ফলাফল সংকেত উপরে ছবিতে দেখতে পারেন। সাইনোসয়েডাল সিগন্যালের ক্লিপিং হলে এটা সত্যিই অনেকটা বাস্তব সংকেতের মতো দেখা যায় যা কখনও কখনও অসিলোস্কোপে (আমি একে "ব্যাটম্যান" বলব) দেখতে পাই।

ধাপ 4: একটি সিমুলেটেড সিগন্যালের বিশ্লেষণ - কোডিং

0) লাইব্রেরি অন্তর্ভুক্ত করুন

#অন্তর্ভুক্ত "arduinoFFT.h"

1) সংজ্ঞা

ঘোষণাপত্র বিভাগে, আমাদের আছে

const বাইট adcPin = 0; // A0

const uint16_t নমুনা = 1024; // এই মান সর্বদা 2 const uint16_t samplingFrequency = 8000 এর শক্তি হতে হবে; // টাইমার_ সেটআপ () SYSCLOCK/8/স্যাম্পলিংয়ে টাইমারের সর্বোচ্চ মানকে প্রভাবিত করবে ফ্রিকোয়েন্সি একটি পূর্ণসংখ্যা হওয়া উচিত

যেহেতু সংকেতটিতে 5 ম হারমোনিক আছে (এই হারমোনিকের ফ্রিকোয়েন্সি = 5 * 440 = 2200 Hz) আমাদের 2.5 * 2200 = 5500 Hz এর উপরে নমুনা ফ্রিকোয়েন্সি সেট করতে হবে। এখানে আমি 8000 Hz বেছে নিয়েছি।

আমরা অ্যারেগুলিও ঘোষণা করি যেখানে আমরা কাঁচা এবং গণনা করা ডেটা সংরক্ষণ করব

ভাসা vReal [নমুনা];

ভাসা vimag [নমুনা];

2) তাত্ক্ষণিকতা

আমরা একটি ArduinoFFT অবজেক্ট তৈরি করি। ArduinoFFT এর dev সংস্করণটি একটি টেমপ্লেট ব্যবহার করে যাতে আমরা ফ্লোট বা ডাবল ডেটা টাইপ ব্যবহার করতে পারি। আমাদের প্রোগ্রামের সামগ্রিক নির্ভুলতার জন্য ফ্লোট (32 বিট) যথেষ্ট।

ArduinoFFT FFT = ArduinoFFT (vReal, vImag, নমুনা, স্যাম্পলিং ফ্রিকোয়েন্সি);

3) vReal অ্যারে পপুলেট করে সিগন্যাল সিমুলেট করার পরিবর্তে এটি ADC ভ্যালুর সাথে পপুলেটেড।

লুপের শুরুতে আমরা vReal অ্যারে দিয়ে পপুলেট করি:

ভাসমান চক্র = (((নমুনা) * সংকেত ফ্রিকোয়েন্সি) / নমুনা ফ্রিকোয়েন্সি); // সংকেত চক্রের সংখ্যা যা নমুনা পড়বে

জন্য নেতিবাচক মান */ vReal += float ((amplitude * (sin ((3 * i * (TWO_PI * cycles))/ sample))/ 2.0); += ভাসা; // ভুল হিসাব এবং অতিরিক্ত প্রবাহ এড়াতে লুপিংয়ের ক্ষেত্রে কাল্পনিক অংশ অবশ্যই শূন্য করা উচিত}

আমরা মৌলিক তরঙ্গের ডিজিটালাইজেশন এবং কম প্রশস্ততার সাথে দুটি সুরেলা যুক্ত করি। আমরা শূন্য দিয়ে কাল্পনিক অ্যারে আরম্ভ করি। যেহেতু এই অ্যারেটি এফএফটি অ্যালগরিদম দ্বারা পপুলেটেড তাই আমাদের প্রতিটি নতুন গণনার আগে এটি আবার পরিষ্কার করতে হবে।

4) এফএফটি কম্পিউটিং

তারপর আমরা FFT এবং বর্ণালী ঘনত্ব গণনা করি

FFT.windowing (FFTWindow:: Hamming, FFTDirection:: Forward);

FFT.compute (FFTDirection:: Forward); / * গণনা FFT */ FFT.complexToMagnitude (); / * গণনা পরিমাপ */

FFT.windowing (…) অপারেশন কাঁচা তথ্য পরিবর্তন করে কারণ আমরা সীমিত সংখ্যক নমুনায় FFT চালাই। প্রথম এবং শেষ নমুনাগুলি একটি বিচ্ছিন্নতা উপস্থাপন করে (তাদের একটিতে "কিছুই নেই")। এটি ত্রুটির উৎস। "উইন্ডো" অপারেশন এই ত্রুটি কমাতে থাকে।

FFT.compute (…) দিক দিয়ে "ফরওয়ার্ড" টাইম ডোমেইন থেকে ফ্রিকোয়েন্সি ডোমেনে রূপান্তর গণনা করে।

তারপরে আমরা প্রতিটি ফ্রিকোয়েন্সি ব্যান্ডের জন্য পরিমাপ (যেমন তীব্রতা) মান গণনা করি। VReal অ্যারে এখন মাত্রার মান দিয়ে পূর্ণ।

5) সিরিয়াল প্লটার অঙ্কন

ফাংশন printVector (…) কল করে সিরিয়াল প্লটারে মানগুলি মুদ্রণ করা যাক

প্রিন্টভেক্টর (vReal, (নমুনা >> 1), SCL_FREQUENCY);

এটি একটি জেনেরিক ফাংশন যা একটি সময় অক্ষ বা ফ্রিকোয়েন্সি অক্ষ দিয়ে ডেটা প্রিন্ট করতে দেয়।

আমরা ব্যান্ডের ফ্রিকোয়েন্সি মুদ্রণ করি যার সর্বোচ্চ মাত্রা মান রয়েছে

float x = FFT.majorPeak ();

সিরিয়াল.প্রিন্ট ("f0 ="); সিরিয়াল.প্রিন্ট (x, 6); Serial.println ("Hz");

ধাপ 5: একটি সিমুলেটেড সিগন্যালের বিশ্লেষণ - ফলাফল

একটি সিমুলেটেড সিগন্যালের বিশ্লেষণ - ফলাফল
একটি সিমুলেটেড সিগন্যালের বিশ্লেষণ - ফলাফল

আমরা মৌলিক ফ্রিকোয়েন্সি (f0), 3 য় এবং 5 ম হারমোনিকের সাথে সংশ্লিষ্ট 3 টি স্পাইক দেখতে পাচ্ছি, যা f0 মাত্রার অর্ধেক এবং 1/4 ভাগের সাথে। আমরা জানালার শীর্ষে f0 = 440.430114 Hz পড়তে পারি। এই মানটি ঠিক 440 Hz নয়, উপরে বর্ণিত সমস্ত কারণের কারণে, কিন্তু এটি প্রকৃত মূল্যের খুব কাছাকাছি। এত তুচ্ছ দশমিক দেখানোর সত্যিই দরকার ছিল না।

ধাপ 6: একটি বাস্তব সংকেত বিশ্লেষণ - ADC তারের

একটি বাস্তব সংকেত বিশ্লেষণ - ADC তারের
একটি বাস্তব সংকেত বিশ্লেষণ - ADC তারের

যেহেতু আমরা জানি কিভাবে তত্ত্বে এগিয়ে যেতে হয়, তাই আমরা একটি বাস্তব সংকেত বিশ্লেষণ করতে চাই।

ওয়্যারিং খুব সহজ। 1 KOhm থেকে 10 KOhm এর মান সহ একটি সিরিজ রোধকের মাধ্যমে আপনার বোর্ডের A0 পিনের সাথে মাঠ এবং সিগন্যাল লাইন সংযুক্ত করুন।

এই সিরিজ প্রতিরোধক এনালগ ইনপুট রক্ষা করবে এবং রিং করা এড়াবে। রিংিং এড়ানোর জন্য এটি যথাসম্ভব উঁচু হওয়া উচিত এবং এডিসিকে দ্রুত চার্জ দেওয়ার জন্য পর্যাপ্ত কারেন্ট সরবরাহ করা সম্ভব। ADC ইনপুটে সংযুক্ত সংকেতের প্রত্যাশিত প্রতিবন্ধকতা জানতে MCU ডেটশীট পড়ুন।

এই ডেমোর জন্য আমি একটি ফাংশন জেনারেটর ব্যবহার করেছি ফ্রিকোয়েন্সি 440 Hz এর একটি সাইনোসয়েডাল সিগন্যাল এবং 5 ভোল্টের প্রশস্ততা (যদি প্রশস্ততা 3 থেকে 5 ভোল্টের মধ্যে থাকে তবে এডিসি সম্পূর্ণ স্কেলের কাছাকাছি ব্যবহার করা হয়), 1.2 KOhm রোধের মাধ্যমে ।

ধাপ 7: একটি বাস্তব সংকেত বিশ্লেষণ - কোডিং

0) লাইব্রেরি অন্তর্ভুক্ত করুন

#অন্তর্ভুক্ত "arduinoFFT.h"

1) ঘোষণা এবং প্রবৃত্তি

ঘোষণা বিভাগে আমরা ADC ইনপুট (A0), নমুনার সংখ্যা এবং নমুনা ফ্রিকোয়েন্সি সংজ্ঞায়িত করি, যেমন আগের উদাহরণ।

const বাইট adcPin = 0; // A0

const uint16_t নমুনা = 1024; // এই মান সর্বদা 2 const uint16_t samplingFrequency = 8000 এর শক্তি হতে হবে; // টাইমার_ সেটআপ () SYSCLOCK/8/স্যাম্পলিংয়ে টাইমারের সর্বোচ্চ মানকে প্রভাবিত করবে ফ্রিকোয়েন্সি একটি পূর্ণসংখ্যা হওয়া উচিত

আমরা ArduinoFFT অবজেক্ট তৈরি করি

ArduinoFFT FFT = ArduinoFFT (vReal, vImag, নমুনা, স্যাম্পলিং ফ্রিকোয়েন্সি);

2) টাইমার এবং এডিসি সেটআপ

আমরা টাইমার 1 সেট করি তাই এটি স্যাম্পলিং ফ্রিকোয়েন্সি (8 KHz) এ সাইকেল চালায় এবং আউটপুট তুলনাতে বাধা সৃষ্টি করে।

অকার্যকর টাইমার_সেটআপ () {

// রিসেট টাইমার 1 TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TCCR1B = bit (CS11) | বিট (WGM12); // সিটিসি, 8 টিআইএমএসকে 1 = বিট (OCIE1B) এর প্রেসকেলার; OCR1A = ((16000000 /8) / স্যাম্পলিং ফ্রিকোয়েন্সি) -1; }

এবং এডিসি সেট করুন তাই

  • ইনপুট হিসেবে A0 ব্যবহার করে
  • প্রতিটি টাইমার 1 আউটপুটে স্বয়ংক্রিয়ভাবে ট্রিগার ম্যাচ B এর সাথে তুলনা করে
  • রূপান্তর সম্পূর্ণ হলে একটি বাধা তৈরি করে

এডিসি ঘড়িটি 1 মেগাহার্টজ এ সেট করা হয়েছে, সিস্টেম ক্লক (16 মেগাহার্টজ) 16 দ্বারা প্রিসকল করে। যেহেতু প্রতিটি রূপান্তর পূর্ণ স্কেলে আনুমানিক 13 টি ঘড়ি নেয়, তাই 1/13 = 0.076 মেগাহার্টজ = 76 কেএইচজের ফ্রিকোয়েন্সি তে রূপান্তর অর্জন করা যায়। ADC কে ডেটা নমুনার সময় দেওয়ার জন্য নমুনা ফ্রিকোয়েন্সি 76 KHz এর চেয়ে উল্লেখযোগ্যভাবে কম হওয়া উচিত। (আমরা fs = 8 KHz বেছে নিয়েছি)।

অকার্যকর adc_setup () {

ADCSRA = bit (ADEN) | বিট (ADIE) | বিট (ADIF); // ADC চালু করুন, ADCSRA সমাপ্তিতে বাধা চাই | = bit (ADPS2); // 16 ADMUX = বিট (REFS0) এর Prescaler | (adcPin & 7); // ADC ইনপুট ADCSRB = bit (ADTS0) | সেট করা বিট (ADTS2); // টাইমার/কাউন্টার 1 তুলনা করুন ম্যাচ বি ট্রিগার উৎস ADCSRA | = বিট (ADATE); // স্বয়ংক্রিয় ট্রিগার চালু করুন}

আমরা প্রতিবন্ধক হ্যান্ডলার ঘোষণা করি যা প্রতি ADC রূপান্তরের পরে vReal অ্যারেতে রূপান্তরিত ডেটা সংরক্ষণ করার জন্য বলা হবে, এবং বিঘ্ন সাফ করা

// এডিসি সম্পূর্ণ আইএসআর

ISR (ADC_vect) {vReal [resultNumber ++] = ADC; যদি (resultNumber == নমুনা) {ADCSRA = 0; // ADC}} EMPTY_INTERRUPT (TIMER1_COMPB_vect) বন্ধ করুন;

আপনি Arduino (analogRead) এ ADC রূপান্তর সম্পর্কে একটি সম্পূর্ণ ব্যাখ্যা পেতে পারেন।

3) সেটআপ

সেটআপ ফাংশনে আমরা কাল্পনিক ডেটা টেবিল সাফ করি এবং টাইমার এবং এডিসি সেটআপ ফাংশনগুলিকে কল করি

শূন্য আমি (); // একটি ফাংশন যা 0 সব কাল্পনিক তথ্য সেট করে - পূর্ববর্তী বিভাগে ব্যাখ্যা করা হয়েছে

timer_setup (); adc_setup ();

3) লুপ

FFT.dcRemoval (); // এই সিগন্যালের ডিসি কম্পোনেন্টটি সরিয়ে দিন যেহেতু এডিসি গ্রাউন্ডে উল্লেখ করা হয়েছে

FFT.windowing (FFTWindow:: Hamming, FFTDirection:: Forward); // ডাটা FFT.compute (FFTDirection:: Forward); // গণনা FFT FFT.complexToMagnitude (); // গণনা পরিমাপ // বর্ণালী মুদ্রণ এবং মৌলিক ফ্রিকোয়েন্সি f0 PrintVector (vReal, (নমুনা >> 1), SCL_FREQUENCY); float x = FFT.majorPeak (); সিরিয়াল.প্রিন্ট ("f0 ="); সিরিয়াল.প্রিন্ট (x, 6); Serial.println ("Hz");

আমরা ডিসি কম্পোনেন্টটি অপসারণ করি কারণ এডিসিকে গ্রাউন্ডে রেফারেন্স করা হয় এবং সিগন্যাল প্রায় 2.5 ভোল্টকে কেন্দ্র করে থাকে।

তারপরে আমরা আগের উদাহরণে ব্যাখ্যা করা ডেটা গণনা করি।

ধাপ 8: একটি বাস্তব সংকেত বিশ্লেষণ - ফলাফল

একটি বাস্তব সংকেত বিশ্লেষণ - ফলাফল
একটি বাস্তব সংকেত বিশ্লেষণ - ফলাফল

প্রকৃতপক্ষে আমরা এই সাধারণ সংকেতে শুধুমাত্র একটি ফ্রিকোয়েন্সি দেখি। গণিত মৌলিক ফ্রিকোয়েন্সি হল 440.118194 Hz। এখানে আবার মান হল আসল ফ্রিকোয়েন্সি এর খুব কাছাকাছি আনুমানিকতা।

ধাপ 9: ক্লিপড সাইনোসয়েডাল সিগন্যাল সম্পর্কে কী?

ক্লিপড সাইনোসয়েডাল সিগন্যাল সম্পর্কে কী?
ক্লিপড সাইনোসয়েডাল সিগন্যাল সম্পর্কে কী?

এখন 5 ভোল্টের উপরে সিগন্যালের প্রশস্ততা বাড়িয়ে একটু ADC ওভারড্রাইভ করা যাক, তাই এটি ক্লিপ করা হয়। এডিসির ইনপুট ধ্বংস করতে খুব বেশি চাপ দেবেন না!

আমরা দেখতে পাচ্ছি কিছু হারমোনিক দেখা যাচ্ছে। সংকেত ক্লিপিং উচ্চ ফ্রিকোয়েন্সি উপাদান তৈরি করে।

আপনি একটি Arduino বোর্ডে FFT বিশ্লেষণের মৌলিক বিষয়গুলি দেখেছেন। এখন আপনি নমুনা ফ্রিকোয়েন্সি, নমুনার সংখ্যা এবং উইন্ডো প্যারামিটার পরিবর্তন করার চেষ্টা করতে পারেন। কম নির্ভুলতার সাথে দ্রুত FFT গণনার জন্য লাইব্রেরি কিছু প্যারামিটার যোগ করে। আপনি লক্ষ্য করবেন যে আপনি যদি নমুনা ফ্রিকোয়েন্সি খুব কম সেট করেন, বর্ণিত ভাঁজের কারণে গণনা করা পরিমাপগুলি সম্পূর্ণ ভুল দেখাবে।

প্রস্তাবিত: