সুচিপত্র:

Arduino সঙ্গীত নোট ডিটেক্টর: 3 ধাপ
Arduino সঙ্গীত নোট ডিটেক্টর: 3 ধাপ

ভিডিও: Arduino সঙ্গীত নোট ডিটেক্টর: 3 ধাপ

ভিডিও: Arduino সঙ্গীত নোট ডিটেক্টর: 3 ধাপ
ভিডিও: ELF/EMBARC Bronchiectasis conference 2023 with subtitles 2024, নভেম্বর
Anonim
Image
Image

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

এই কোডটি ইজিএফএফটি নামে পূর্বে উন্নত এফএফটি কোড ব্যবহার করে।

উপরের ভিডিওতে বিভিন্ন ধরনের যন্ত্র সাউন্ডের পাশাপাশি ভোকাল সহ কোডের প্রদর্শনী দেখানো হয়েছে।

সরবরাহ

- Arduino Nano/Uno বা তার উপরে

- Arduino এর জন্য মাইক্রোফোন মডিউল

ধাপ 1: নোট সনাক্তকরণের জন্য অ্যালগরিদম

আগের ধাপে উল্লেখ করা হয়েছে, অডিও নমুনায় একাধিক ফ্রিকোয়েন্সি থাকার কারণে সনাক্তকরণ কঠিন।

প্রোগ্রামটি নিম্নলিখিত প্রবাহে কাজ করে:

1. ডেটা অর্জন:

- এই বিভাগটি অডিও ডেটা থেকে 128 টি নমুনা নেয়, আগ্রহের ফ্রিকোয়েন্সি অনুসারে দুটি নমুনার (নমুনা ফ্রিকোয়েন্সি) মধ্যে বিচ্ছেদ। এই ক্ষেত্রে, আমরা দুটি নমুনার মধ্যে ব্যবধান ব্যবহার করছি হ্যান উইন্ডো ফাংশনের পাশাপাশি প্রশস্ততা/আরএমএস গণনা প্রয়োগ করতে। এই কোডটি এনালগ্রেড মান থেকে 500 বিয়োগ করে মোটামুটি শূন্যকরণ করে। প্রয়োজনে এই মান পরিবর্তন করা যেতে পারে। একটি সাধারণ ক্ষেত্রে, এই মানগুলি ভালভাবে কাজ করে। আরও, প্রায় 1200Hz এর নমুনা ফ্রিকোয়েন্সি থাকতে কিছু বিলম্ব যোগ করতে হবে। 1200Hz স্যাম্পলিং ফ্রিকোয়েন্সি ক্ষেত্রে সর্বাধিক 600 HZ ফ্রিকোয়েন্সি সনাক্ত করা যেতে পারে।

জন্য (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // মোটামুটি শূন্য শিফট sum1 = sum1+a; // গড় মান sum2 = sum2+a*a; // থেকে RMS মান a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // হ্যান জানালা = 4*a; // ফ্লোট থেকে int রূপান্তর বিলম্বের জন্য স্কেলিং মাইক্রোসেকেন্ড (195); // অপারেশন ফ্রিকোয়েন্সি পরিসরের উপর ভিত্তি করে}

2. FFT:

ডেটা প্রস্তুত হয়ে গেলে, এফএফটি ইজিএফএফটি ব্যবহার করে সঞ্চালিত হয়। 128 টি নমুনার জন্য FFT ঠিক করার জন্য এই EasyFFT ফাংশনটি সংশোধন করা হয়েছে। মেমরির খরচ কমানোর জন্য কোডটিও পরিবর্তন করা হয়েছে। মূল EasyFFT ফাংশনটি 1028 টি নমুনা (সামঞ্জস্যপূর্ণ বোর্ড সহ) করার জন্য ডিজাইন করা হয়েছে, যখন আমাদের কেবল 128 টি নমুনা দরকার। এই কোডটি মূল EasyFFT ফাংশনের তুলনায় প্রায় 20% মেমরি খরচ হ্রাস করে।

একবার এফএফটি হয়ে গেলে, কোডটি বিশ্লেষণের জন্য শীর্ষ 5 সর্বাধিক প্রভাবশালী ফ্রিকোয়েন্সি শিখরগুলি ফেরত দেয়। এই ফ্রিকোয়েন্সি প্রশস্ততার ক্রমবর্ধমান ক্রমে সাজানো।

3. প্রতিটি শিখরের জন্য, কোডটি এর সাথে যুক্ত সম্ভাব্য নোট সনাক্ত করে। এই কোডটি শুধুমাত্র 1200 Hz পর্যন্ত স্ক্যান করে। সর্বাধিক প্রশস্ততার সাথে ফ্রিকোয়েন্সি সমান নোট করার প্রয়োজন নেই।

সমস্ত ফ্রিকোয়েন্সি 0 থেকে 255 এর মধ্যে ম্যাপ করা হয়, এখানে প্রথম অষ্টভটি সনাক্ত করা হয়েছে, উদাহরণস্বরূপ, 65.4 Hz থেকে 130.8 একটি অষ্টভকে প্রতিনিধিত্ব করে, 130.8 Hz থেকে 261.6 Hz অন্যটিকে উপস্থাপন করে। প্রতিটি অষ্টভের জন্য, ফ্রিকোয়েন্সি 0 থেকে 255 পর্যন্ত ম্যাপ করা হয়। এখানে C থেকে C থেকে শুরু করে ম্যাপিং করা হয়।

যদি (f_peaks > 1040) {f_peaks = 0;} if (f_peaks > = 65.4 && f_peaks = 130.8 && f_peaks = 261.6 && f_peaks = 523.25 && f_peaks = 1046 && f_peaks <= 2093) {f_peaks = 255*((f_peaks /1046) -1);}

সনাক্ত করা ফ্রিকোয়েন্সিগুলিতে নোট বরাদ্দ করতে নোটভি অ্যারে মান ব্যবহার করা হয়।

বাইট NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};

4. প্রতিটি ফ্রিকোয়েন্সি জন্য নোট গণনা করার পর এটি হতে পারে যে একাধিক ফ্রিকোয়েন্সি আছে যা একই নোট প্রস্তাব করে। একটি সঠিক আউটপুট কোড পুনরাবৃত্তি বিবেচনা করে। কোড প্রশস্ততা ক্রম এবং পুনরাবৃত্তির উপর ভিত্তি করে সমস্ত ফ্রিকোয়েন্সি মান যোগ করে এবং সর্বাধিক প্রশস্ততার সাথে নোটটি শীর্ষে রাখে।

ধাপ 2: আবেদন

কোডটি ব্যবহার করা সরাসরি এগিয়ে, তবে, একাধিক সীমাবদ্ধতা রয়েছে যা এটি মনে রাখার সময় প্রয়োজন। কোডটি অনুলিপি করা যেতে পারে কারণ এটি নোট সনাক্তকরণের জন্য ব্যবহৃত হয়। এটি ব্যবহার করার সময় নিচের বিষয়গুলো বিবেচনা করা প্রয়োজন।

1. পিন অ্যাসাইনমেন্ট:

সংযুক্ত পিন নিয়োগের উপর ভিত্তি করে সংশোধন করা প্রয়োজন। আমার পরীক্ষার জন্য, আমি এটি এনালগ পিন 7 এ রেখেছি, অকার্যকর সেটআপ () {Serial.begin (250000); Mic_pin = A7; }

2. মাইক্রোফোন সংবেদনশীলতা:

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

3. প্রশস্ততা সীমা:

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

যদি (sum2-sum1> 5) {

..

উপরের কোডে, sum2 RMS মান দেয় যখন যোগফল 1 গড় মান দেয়। সুতরাং এই দুটি মানের মধ্যে পার্থক্য শব্দ সংকেতের প্রশস্ততা দেয়। আমার ক্ষেত্রে, এটি প্রায় 5 এর প্রশস্ততা মানের সাথে সঠিকভাবে কাজ করে।

4. ডিফল্টরূপে, এই কোড সনাক্ত করা নোট মুদ্রণ করবে। যাইহোক, যদি আপনি অন্য কোন উদ্দেশ্যে নোটটি ব্যবহার করার পরিকল্পনা করছেন, তাহলে সরাসরি নির্ধারিত নম্বরটি ব্যবহার করা উচিত। উদাহরণস্বরূপ C = 0; C#= 1, D = 2, D#= 3 এবং তারপরে।

5. যন্ত্রের উচ্চতর ফ্রিকোয়েন্সি থাকলে, কোডটি মিথ্যা আউটপুট দিতে পারে। সর্বাধিক ফ্রিকোয়েন্সি নমুনা ফ্রিকোয়েন্সি দ্বারা সীমাবদ্ধ। তাই আপনি সর্বোত্তম আউটপুট পেতে বিলম্বের নীচে খেলতে পারেন। নীচের কোডে 195 মাইক্রোসেকেন্ডের বিলম্ব। যা সর্বোত্তম আউটপুট পেতে tweaked হতে পারে। এটি সামগ্রিক বাস্তবায়নের সময়কে প্রভাবিত করবে।

{a = analogRead (Mic_pin) -500; // মোটামুটি শূন্য শিফট

sum1 = sum1+a; // গড় মান sum2 = sum2+a*a; // থেকে RMS মান a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // হ্যান জানালা = 4*a; // ফ্লোট থেকে int রূপান্তর বিলম্বের জন্য স্কেলিং মাইক্রোসেকেন্ড (195); // অপারেশন ফ্রিকোয়েন্সি পরিসরের উপর ভিত্তি করে}

6. এই কোডটি শুধুমাত্র 2000Hz ফ্রিকোয়েন্সি পর্যন্ত কাজ করবে। নমুনা ফ্রিকোয়েন্সি প্রায় 3-4 kHz নমুনা মধ্যে বিলম্ব দূর করে প্রাপ্ত করা যেতে পারে।

সতর্কতা:

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

ধাপ 3: সামারি

নোট সনাক্তকরণ কম্পিউটেশনালভাবে নিবিড় কাজ, রিয়েল-টাইম আউটপুট পাওয়া বিশেষ করে আরডুইনোতে খুব কঠিন। এই কোডটি প্রায় 6.6 নমুনা /সেকেন্ড দিতে পারে (195 মাইক্রোসেকেন্ড বিলম্ব যোগ করার জন্য)। এই কোডটি পিয়ানো এবং অন্যান্য কিছু যন্ত্রের সাথে ভাল কাজ করে।

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

আসন্ন টিউটোরিয়ালে, আমি মিউজিক কর্ড সনাক্তকরণের জন্য এই কোডটি পরিবর্তন করব। সুতরাং সংগেই থাকুন.

প্রস্তাবিত: