Სარჩევი:

არდუინოს მუსიკალური ნოტების დეტექტორი: 3 ნაბიჯი
არდუინოს მუსიკალური ნოტების დეტექტორი: 3 ნაბიჯი

ვიდეო: არდუინოს მუსიკალური ნოტების დეტექტორი: 3 ნაბიჯი

ვიდეო: არდუინოს მუსიკალური ნოტების დეტექტორი: 3 ნაბიჯი
ვიდეო: ნოტის გრძლიობები 2024, დეკემბერი
Anonim
Image
Image

აუდიო სიგნალიდან მუსიკალური ნოტების გამოვლენა განსაკუთრებით რთულია არდუინოზე მეხსიერების და დამუშავების სიმძლავრის გამო. საერთოდ, შენიშვნა არ არის სუფთა სინუსური ტალღა, რაც ართულებს გამოვლენას. თუ ვიღებთ სხვადასხვა მუსიკალური ინსტრუმენტის სიხშირის გარდაქმნას, ის შეიძლება შეიცავდეს მრავალ ჰარმონიკას დაკრული ნოტის საფუძველზე. თითოეულ ინსტრუმენტს აქვს საკუთარი ჰარმონიის საკუთარი ხელმოწერის კომბინაცია. ამ კოდში მე შევეცადე შემექმნა პროგრამა, რომელიც შეძლებისდაგვარად მოიცავს ბევრ ინსტრუმენტს. თქვენ შეგიძლიათ მიმართოთ თანდართულ ვიდეოს, რომელშიც მე შევეცადე გამომეცადა სხვადასხვა სახის ინსტრუმენტები, კლავიატურის მიერ წარმოქმნილი სხვადასხვა სახის ტონები და ვოკალური ხმაც კი. გამოვლენის სიზუსტე განსხვავდება ინსტრუმენტის მიხედვით. შეზღუდული დიაპაზონის (200-500 ჰც) ზოგიერთი ინსტრუმენტისთვის (ანუ ფორტეპიანოსთვის) ის ზუსტია, ხოლო ზოგიერთ ინსტრუმენტს აქვს დაბალი სიზუსტე (ანუ ჰარმონიკა).

ეს კოდი იყენებს ადრე შემუშავებულ FFT კოდს, სახელწოდებით EasyFFT.

კოდის დემონსტრირება ნაჩვენებია ზემოთ მოცემულ ვიდეოში სხვადასხვა სახის ინსტრუმენტის ხმით, ასევე ვოკალით.

მარაგები

- არდუინო ნანო/უნო ან ზემოთ

- მიკროფონის მოდული არდუინოსთვის

ნაბიჯი 1: შენიშვნის გამოვლენის ალგორითმი

როგორც წინა ნაბიჯში აღვნიშნეთ, გამოვლენა რთულია აუდიო ნიმუშებში მრავალი სიხშირის არსებობის გამო.

პროგრამა მუშაობს შემდეგი დინებით:

1. მონაცემთა მოპოვება:

- ეს ნაწილი იღებს 128 ნიმუშს აუდიო მონაცემებიდან, ორ ნიმუშს შორის გამოყოფა (შერჩევის სიხშირე) ინტერესის სიხშირის მიხედვით. ამ შემთხვევაში, ჩვენ ვიყენებთ მანძილს ორ ნიმუშს შორის, რომელიც გამოიყენება ჰანის ფანჯრის ფუნქციის, ასევე ამპლიტუდის/RMS გამოთვლისთვის. ეს კოდი ასევე უხეშობს ნულოვანებას გამოკლებით 500 ანალოგური წაკითხვის მნიშვნელობიდან. საჭიროების შემთხვევაში, ეს მნიშვნელობა შეიძლება შეიცვალოს. ტიპიური შემთხვევისთვის, ეს ღირებულებები კარგად მუშაობს. გარდა ამისა, გარკვეული შეფერხება უნდა დაემატოს შერჩევის სიხშირეს დაახლოებით 1200 ჰც. 1200 ჰც -ის შემთხვევაში შერჩევის სიხშირის მაქსიმუმ 600 HZ სიხშირის გამოვლენა შესაძლებელია.

for (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*ა; // float to int კონვერტაციის დაგვიანებით მიკროწამები (195); // ოპერაციის სიხშირის დიაპაზონიდან გამომდინარე}

2. FFT:

მას შემდეგ რაც მონაცემები მზად არის, FFT ხორციელდება EasyFFT გამოყენებით. ეს EasyFFT ფუნქცია შეცვლილია FFT– ის დასაფიქსირებლად 128 ნიმუშზე. კოდი ასევე შეცვლილია მეხსიერების მოხმარების შესამცირებლად. ორიგინალური EasyFFT ფუნქცია შექმნილია 1028 -მდე ნიმუშისთვის (თავსებადი დაფით), ხოლო ჩვენ გვჭირდება მხოლოდ 128 ნიმუში. ეს კოდი ამცირებს მეხსიერების მოხმარებას დაახლოებით 20% -ით ორიგინალ EasyFFT ფუნქციასთან შედარებით.

FFT დასრულების შემდეგ, კოდი აბრუნებს ტოპ 5 ყველაზე დომინანტური სიხშირის მწვერვალებს შემდგომი ანალიზისთვის. ეს სიხშირე განლაგებულია ამპლიტუდის კლებადობით.

3. თითოეული მწვერვალისთვის კოდი ამოიცნობს მასთან დაკავშირებულ შესაძლო ჩანაწერებს. ეს კოდი სკანირებს მხოლოდ 1200 ჰერცამდე. არ არის აუცილებელი შენიშვნა იყოს იგივე, რაც სიხშირე მაქსიმალური ამპლიტუდით.

ყველა სიხშირე ასახულია 0 -დან 255 -მდე, აქ აღმოჩენილია პირველი ოქტავა, მაგალითად, 65.4 ჰერციდან 130.8 -მდე წარმოადგენს ერთ ოქტავას, 130.8 ჰერციდან 261.6 ჰერცამდე - მეორეს. თითოეული ოქტავისთვის, სიხშირეები ასახულია 0 -დან 255 -მდე. აქ რუქა იწყება C– დან C– მდე.

თუ (f_peaks > 1040) {f_peaks = 0;} თუ (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 მასივის მნიშვნელობები გამოიყენება გამოვლენილ სიხშირეებზე ნოტის მინიჭების მიზნით.

ბაიტი NoteV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};

4. ყოველი სიხშირისთვის ნოტის გაანგარიშების შემდეგ შეიძლება არსებობდეს რამდენიმე სიხშირე, რაც ერთიდაიგივე ნოტს გვთავაზობს. ზუსტი გამომავალი კოდი ასევე ითვალისწინებს გამეორებებს. კოდი ამატებს სიხშირის ყველა მნიშვნელობას ამპლიტუდის რიგისა და გამეორებების საფუძველზე და აღწევს ნოტს მაქსიმალური ამპლიტუდით.

ნაბიჯი 2: განაცხადი

კოდის გამოყენება პირდაპირ არის, თუმცა, ასევე არსებობს მრავალი შეზღუდვა, რომელიც უნდა იქნას გათვალისწინებული მის დროს. კოდის კოპირება შესაძლებელია, რადგან იგი გამოიყენება შენიშვნების გამოვლენისათვის. მისი გამოყენებისას გასათვალისწინებელია ქვემოთ მოყვანილი პუნქტები.

1. Pin დავალება:

თანდართული Pin დავალების საფუძველზე უნდა შეიცვალოს. ჩემი ექსპერიმენტისთვის, მე შევინახე იგი ანალოგიურ პინ 7 -ზე, void setup () {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 მიკროწამით. რომელიც შეიძლება შესწორდეს ოპტიმალური გამომუშავების მისაღებად. ეს გავლენას მოახდენს შესრულების საერთო დროზე.

{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*ა; // float to int კონვერტაციის დაგვიანებით მიკროწამები (195); // ოპერაციის სიხშირის დიაპაზონიდან გამომდინარე}

6. ეს კოდი იმუშავებს მხოლოდ 2000Hz სიხშირეზე. შერჩევის შეფერხების აღმოფხვრის გზით შესაძლებელია 3-4 კჰც სიხშირის აღება.

Სიფრთხილის ზომები:

  • როგორც ნათქვამია EasyFFT სამეურვეოში, FFT ჭამს არდუინოს უზარმაზარ მეხსიერებას. ასე რომ, თუ თქვენ გაქვთ პროგრამა, რომელსაც სჭირდება გარკვეული მნიშვნელობების შენახვა, რეკომენდირებულია გამოიყენოთ უმაღლესი მეხსიერების დაფა.
  • ეს კოდი შეიძლება კარგად მუშაობდეს ერთ ინსტრუმენტზე/ვოკალისტზე და მეორეზე ცუდი. რეალურ დროში ზუსტი გამოვლენა შეუძლებელია გამოთვლითი შეზღუდვების გამო.

ნაბიჯი 3: ზაფხული

შენიშვნების გამოვლენა გამოთვლითი ინტენსიური სამუშაოა, რეალურ დროში გამოშვება ძალიან რთულია, განსაკუთრებით არდუინოზე. ამ კოდს შეუძლია მისცეს დაახლოებით 6.6 ნიმუში /წამში (დამატებულია 195 მიკროწამით დაგვიანებით). ეს კოდი კარგად მუშაობს ფორტეპიანოსთან და სხვა ინსტრუმენტებთან.

ვიმედოვნებ, რომ ეს კოდი და სახელმძღვანელო დაგეხმარებათ მუსიკაში თქვენს პროექტში. ნებისმიერი ეჭვის ან შემოთავაზების შემთხვევაში მოგერიდებათ კომენტარის გაკეთება ან შეტყობინების გაგზავნა.

მომავალ სამეურვეო პროგრამაში მე შევცვლი ამ კოდს მუსიკალური აკორდის გამოვლენისთვის. ასე რომ დარჩი

გირჩევთ: