قياس التناغم - محلل طيف الصوت عند اكتشاف STM32L4

في منشور سابق ، قمنا بتوصيل شاشة LCD صينية رخيصة بلوحة STM32L4 Discovery . سنحاول الآن تنفيذ شيء في هذا المزيج يتجاوز الوميض التقليدي لمصباح LED ، أي محلل طيف الصوت الذي يستخدم الميكروفون على اللوحة. في الوقت نفسه ، سأخبرك بكيفية استخدام نظام تشغيل FreeRTOS ، ولماذا هناك حاجة إليه ، وأيضًا لماذا هناك 12 نوتة موسيقية في اوكتاف موسيقي ، وأكثر من 53 نوتة أفضل من 12 نوتة.





رقمنة الصوت


نريد استقبال الإشارة من الميكروفون وحساب طيفها باستخدام تحويل فورييه السريع (FPU لمساعدتنا) وإظهار النتيجة على شاشة LCD في شكل "شلال ملون". سيتم ترميز قوة الصوت بالألوان. سوف نرسم خطًا من وحدات البكسل من حافة الشاشة حيث تتوافق البكسل الموجودة في أقصى اليسار مع الحد الأدنى للتردد وستتطابق واحدة من أقصى اليمين مع الحد الأقصى ، بينما ستتحول الصورة السابقة بخط واحد ، مما يوفر مساحة لخط جديد. إن وحدة التحكم الدقيقة الخاصة بنا معقدة للغاية بحيث لا يمكن البدء من الصفر ، لذا فلنبدأ بمثال من مجموعة أدوات STM32Cube التي تسمى DFSDM_AudioRecord. ما هو DFSDM؟ هذا هو المرشح الرقمي لتعديل سيغما دلتا. والحقيقة هي أنه على عكس الميكروفونات التناظرية القديمة الجيدة ، فإن تلك الموجودة على لوحة Discovery لا تعطي إشارة في شكل جهد يتناسب مع ضغط الصوت ،وكسلسلة من الأصفار والأخرى بتردد ساعة عدة ميجاهيرتز. إذا مررت هذا التسلسل عبر مرشح تمرير منخفض ، فستحصل على نفس الإشارة التناظرية. في النماذج السابقة من المتحكمات الدقيقة ، كان من الضروري عمل مرشح رقمي من أجل استقبال إشارة صوتية في شكل رقمي. الآن لدى وحدة التحكم الدقيقة وحدة خاصة لهذا الغرض ، وكل ما هو مطلوب هو تكوينه في بداية البرنامج. للقيام بذلك ، يمكنك إما الخوض في قراءة الوثائق ، أو استخدام مثال جاهز. ذهبت في الطريق الثاني. توضح الصورة التالية البنية الداخلية لبرنامج DFSDM_AudioRecord.في النماذج السابقة من المتحكمات الدقيقة ، كان من الضروري عمل مرشح رقمي من أجل استقبال إشارة صوتية في شكل رقمي. الآن لدى وحدة التحكم الدقيقة وحدة خاصة لهذا الغرض ، وكل ما هو مطلوب هو تكوينه في بداية البرنامج. للقيام بذلك ، يمكنك إما الخوض في قراءة الوثائق ، أو استخدام مثال جاهز. ذهبت في الطريق الثاني. توضح الصورة التالية البنية الداخلية لبرنامج DFSDM_AudioRecord.في النماذج السابقة من المتحكمات الدقيقة ، كان من الضروري عمل مرشح رقمي من أجل استقبال إشارة صوتية في شكل رقمي. الآن لدى وحدة التحكم الدقيقة وحدة خاصة لهذا الغرض ، وكل ما هو مطلوب هو تكوينه في بداية البرنامج. للقيام بذلك ، يمكنك إما الخوض في قراءة الوثائق ، أو استخدام مثال جاهز. ذهبت في الطريق الثاني. توضح الصورة التالية البنية الداخلية لبرنامج DFSDM_AudioRecord.



يقع الصوت الرقمي باستخدام DMA في المخزن المؤقت الحلقي. يتسبب DMA في مقاطعة مرتين: مرة واحدة - عندما يكون المخزن المؤقت نصف ممتلئ ، والمرة الثانية - عندما يكون ممتلئًا. يقوم روتين المقاطعة ببساطة بتعيين العلامة المناسبة. الوظيفة الرئيسية () بعد التهيئة تنفذ حلقة لا نهائية حيث يتم التحقق من هذه العلامات ، وإذا تم تعيين العلم ، يتم نسخ النصف المقابل من المخزن المؤقت. يقوم مثال بنسخ البيانات إلى مخزن مؤقت آخر ، حيث يتم إرسال DMA إلى مضخم صوت السماعة. تركت هذه الوظيفة ، مضيفا حساب طيف الإشارة الصوتية.

عندما يكون هناك العديد من المهام


الطريقة المباشرة لإضافة وظائف جديدة إلى التعليمات البرمجية الخاصة بنا هي إضافة المزيد من العلامات وكتابة الوظائف التي سيتم استدعاؤها إذا تم تعيين هذه العلامات. والنتيجة هي عادة فوضى من الأعلام ، ووظائف المعالج ، والسياق العالمي ، الذي يضطر إلى أن يكون عالميًا ، حيث يتم تقسيم حل مشكلة واحدة إلى العديد من الخطوات الصغيرة التي تنفذها الوظائف الفردية - معالجات الأحداث. طريقة بديلة هي تكليف إدارة المهام بنظام تشغيل ، مثل FreeRTOS. يتيح لك هذا تبسيط المنطق بشكل كبير نظرًا لحقيقة أن كل مهمة يتم حلها ضمن دورة معالجة الأحداث الخاصة بها التي تتفاعل مع بعضها البعض من خلال وظائف نظام التشغيل. على سبيل المثال ، يمكننا إضافة مهمة معالجة البيانات كدورة منفصلة ،والتي ستنتظر حتى تكون البيانات جاهزة على التزامن البدائي - إشارة الإشارة. الإشارة بسيطة للغاية: يمكنك تمريرها إذا تم تحديد العلم ، وتم حذف العلم تلقائيًا. في حالتنا ، سيرفع مصدر البيانات علامة عند تحضير البيانات لمهمة أخرى. بطريقة مماثلة ، يمكنك إنشاء سلاسل عشوائية من مهام مصدر البيانات ومهام مستهلك البيانات ، على غرار كيفية حدوث ذلك ، على سبيل المثال ، في نظام التشغيل Linux.في نظام التشغيل Linux.في نظام التشغيل Linux.



بطبيعة الحال ، فإن التنفيذ المتزامن للمهام هو وهم ، خاصة عندما يكون جوهر الحوسبة واحدًا فقط. في هذه الحالة ، يمكننا القول أن لدينا خيط واحد من تنفيذ البرنامج بواسطة المعالج. تلعب الإشارات ، مثل البدائية الأخرى للمزامنة ، دور حفرة أرنب سحرية ، يفشل فيها تدفق التنفيذ في الظهور في مهمة أخرى.

توصيل FreeRTOS بمشروعك أمر بسيط للغاية. من الضروري فقط استبدال الحلقة اللانهائية ، التي تنتهي عادةً بالوظيفة الرئيسية () في وحدة التحكم الدقيقة ، مع استدعاء osKernelStart (). بعد ذلك ، سيشرح لك المترجم بالضبط ما ينقصه من التجميع. يجب نقل جميع الإجراءات التي قمت بها سابقًا في الحلقة إلى مهمة منفصلة وتسجيلها في استدعاء xTaskCreate. بعد ذلك ، يمكنك إضافة العديد من المهام كما تريد. يجب أن يوضع في الاعتبار أنه بين المكالمات إلى xTaskCreate و osKernelStart ، من الأفضل عدم وضع أي رمز يعمل مع الأجهزة ، حيث قد لا يعمل مؤقت النظام هنا بشكل صحيح. يجب إضافة الاستدعاء إلى معالج مؤقت نظام التشغيل osSystickHandler () إلى SysTick_Handler () ، ويجب إزالة الوظيفتين SVC_Handler و PendSV_Handler من التعليمات البرمجية الخاصة بهما ،حيث يتم تنفيذها في كود نظام التشغيل. عند تسجيل المهام ، من المهم عدم ارتكاب خطأ بحجم المكدس. إذا تبين أنها صغيرة جدًا ، فسوف تحصل على أعطال في أكثر الأماكن غير المتوقعة. الأول عندما يتجاوز المكدس هو الهيكل نفسه الذي يصف المهمة. IAR لديه القدرة على عرض قائمة المهام. إذا رأيت مهمة لها اسم تم تغييره ، فأنت بحاجة إلى زيادة حجم المكدس.


لحساب الطيف ، نستخدم تحويل فورييه السريع. الوظيفة المقابلة موجودة بالفعل في المكتبة. تتلقى عازلة مليئة بالبيانات المعقدة ، وتشكل النتيجة هناك. وفقًا لذلك ، عند الإدخال ، تحتاج إلى مخزن مؤقت ، حيث يتناوب الصوت الرقمي مع الأصفار (الجزء المعقد 0). عند الإخراج ، نحصل على أرقام معقدة نقوم بحساب مربع الوحدة فورًا من خلال إضافة مربعات الأجزاء الحقيقية والخيالية. نقوم بذلك لنصف المخزن المؤقت فقط ، لأن الطيف متماثل. سنحتاج إلى النصف الثاني إذا أردنا القيام بالتحويل العكسي ، ولكن من أجل عرض بسيط للطيف ، لا حاجة إليه. بعض الجهود الإضافية ضرورية حتى تتمكن من حساب الطيف في نطاقات طيفية مختلفة. للحصول على الطيف للترددات المنخفضة ،أقوم بتجميع البيانات لعدة دورات من قراءة المخزن المؤقت ، مما يقلل بشكل فعال من تكرار أخذ عينات الصوت ، والذي يبلغ 44.1 كيلو هرتز في البداية. والنتيجة هي 6 نطاقات - 20 كيلو هرتز و 10 كيلو هرتز و 5 كيلو هرتز و 2600 هرتز و 1300 هرتز و 650 هرتز. لتبديل النطاقات ، استخدم عصا التحكم ومهمة منفصلة. يؤدي عصا التحكم أيضًا وظيفة بدء / إيقاف "الشلال" ، بالإضافة إلى ضبط الحساسية. من الملائم أكثر عرض الطيف في الوحدات اللوغاريتمية (الديسيبلات) ، حيث أن نطاقه الديناميكي عادة ما يكون كبيرًا جدًا ، وعلى النطاق الخطي يمكننا التمييز فقط بين أقوى مكونات الطيف. يعتبر اللوغاريتم فترة طويلة جدًا حتى على FPU ، لذلك استبدلت اللوغاريتم الحقيقي بتقريب خطي متقطع ، يسهل الحصول عليه ، مع العلموالنتيجة هي 6 نطاقات - 20 كيلو هرتز و 10 كيلو هرتز و 5 كيلو هرتز و 2600 هرتز و 1300 هرتز و 650 هرتز. لتبديل النطاقات ، استخدم عصا التحكم ومهمة منفصلة. يؤدي عصا التحكم أيضًا وظيفة بدء / إيقاف "الشلال" ، بالإضافة إلى ضبط الحساسية. من الملائم أكثر عرض الطيف في الوحدات اللوغاريتمية (الديسيبلات) ، لأن نطاقه الديناميكي عادة ما يكون كبيرًا جدًا ، وعلى النطاق الخطي ، يمكننا التمييز فقط بين أقوى مكونات الطيف. يعتبر اللوغاريتم فترة طويلة جدًا حتى على FPU ، لذلك استبدلت اللوغاريتم الحقيقي بتقريب خطي متقطع ، يسهل الحصول عليه ، مع العلموالنتيجة هي 6 نطاقات - 20 كيلو هرتز و 10 كيلو هرتز و 5 كيلو هرتز و 2600 هرتز و 1300 هرتز و 650 هرتز. لتبديل النطاقات ، استخدم عصا التحكم ومهمة منفصلة. يؤدي عصا التحكم أيضًا وظيفة بدء / إيقاف "الشلال" ، بالإضافة إلى ضبط الحساسية. من الملائم أكثر عرض الطيف في الوحدات اللوغاريتمية (الديسيبلات) ، حيث أن نطاقه الديناميكي عادة ما يكون كبيرًا جدًا ، وعلى النطاق الخطي يمكننا التمييز فقط بين أقوى مكونات الطيف. يعتبر اللوغاريتم فترة طويلة جدًا حتى على FPU ، لذلك استبدلت اللوغاريتم الحقيقي بتقريب خطي متقطع ، يسهل الحصول عليه ، مع العلممن الملائم أكثر عرض الطيف في الوحدات اللوغاريتمية (الديسيبلات) ، لأن نطاقه الديناميكي عادة ما يكون كبيرًا جدًا ، وعلى النطاق الخطي ، يمكننا التمييز فقط بين أقوى مكونات الطيف. يعتبر اللوغاريتم فترة طويلة جدًا حتى على FPU ، لذلك استبدلت اللوغاريتم الحقيقي بتقريب خطي متقطع ، يسهل الحصول عليه ، مع العلممن الملائم أكثر عرض الطيف في الوحدات اللوغاريتمية (الديسيبلات) ، حيث أن نطاقه الديناميكي عادة ما يكون كبيرًا جدًا ، وعلى النطاق الخطي يمكننا التمييز فقط بين أقوى مكونات الطيف. يعتبر اللوغاريتم فترة طويلة جدًا حتى على FPU ، لذلك استبدلت اللوغاريتم الحقيقي بتقريب خطي متقطع ، يسهل الحصول عليه ، مع العلمتنسيق لتمثيل رقم في float32 . الشيء الأكثر أهمية هو علامة. البتات الثمانية التالية هي الأس الثنائي بالإضافة إلى 127. البتات المتبقية هي الجزء الكسري من الجزء العشري على الرغم من أن الجزء الصحيح هو 1 (نحذف الفروق الدقيقة في الأرقام غير المنسقة من أجل البساطة). لذلك ، بعد تحديد الأس من float32 والتقاط عدة أجزاء من الجزء العشري الأكثر أهمية ، يمكنك الحصول على تقريب جيد للوغاريتم. باستخدام الجدول المعد مسبقًا ، نقوم بتحويل الرقم الناتج إلى رمز RGB لعرضه على شاشة LCD. اتضح مقياس لون 90 أو 60 ديسيبل. يمكن ضبط مستوى الصوت المقابل للصفر من هذا المقياس عن طريق دفع عصا التحكم لأعلى ولأسفل.

نعرض صورة - حول فوائد قراءة أوراق البيانات


الآن علينا فقط عرض الصورة وإحياء "شلالنا". الطريقة المباشرة للقيام بذلك هي تخزين الصورة من الشاشة بأكملها في مخزن مؤقت ، وتحديثها هناك وإعادة الرسم في كل مرة تظهر بيانات جديدة. ليس هذا الحل غير فعال للغاية فحسب ، بل ليس لدينا أيضًا ذاكرة كافية لتخزين الصورة بأكملها. يبدو أن LCD نفسها لديها ذاكرة كافية لذلك ، ويجب أن تكون قادرة على القيام بشيء مثير للاهتمام معها. في الواقع ، دراسة ورقة البياناتيسمح لك باكتشاف أمر التمرير غير المستخدم حتى الآن ، والذي يسمح لك بتغيير طريقة عرض ذاكرة وحدة تحكم LCD على الشاشة بشكل ديناميكي. تخيل أن الذاكرة عبارة عن شريط مغلق في حلقة تشاهدها تحت زجاج الشاشة. يسمح لك أمر بدء التمرير الرأسي (0x37) بتعيين الموضع على الشريط المقابل للحافة العلوية للشاشة. لذا ، كل ما نحتاجه لإحياء "الشلال" هو تسجيل طيف جديد في هذا الموضع والتمرير عبر شريط الذاكرة. تمت إضافة الرمز المقابل إلى برنامج تشغيل LCD ، وتم استعارته من بيتر دريشر ذي السمعة الطيبة ، وتم تكييفه كما هو موضح هنا. العيب الوحيد لهذا النهج: يعمل التمرير فقط على طول الجانب الطويل من الشاشة. وبناءً على ذلك ، يتوفر الجانب القصير فقط لإخراج الطيف.

12 ?


دعنا ننتقل إلى التطبيقات العملية لجهازنا. أول شيء يسهل رؤيته على الطيف هو التوافقيات ، أي الترددات التي هي مضاعفات التردد الأساسي. خصوصا الكثير منهم في الصوت. هناك أيضا في الأصوات التي تصنع الآلات الموسيقية. من السهل أن نفهم لماذا تختلف ملاحظات الأوكتاف المجاورة في التردد مرتين: ثم تتزامن ملاحظات الأوكتاف الأعلى في التردد مع النغمة التوافقية الثانية لملاحظات الأوكتاف المنخفضة. يقولون أنهم في نفس الوقت يبدون "في انسجام". من الصعب قليلاً فهم سبب وجود 12 نوتة في الأوكتاف - سبعة مفاتيح رئيسية (مفاتيح بيضاء على لوحة مفاتيح البيانو) بالإضافة إلى 5 إضافية (مفاتيح سوداء). يشار إلى الملاحظات الإضافية بالملاحظات الرئيسية بأحرف حادة ومسطحة ، على الرغم من أنه في الواقع لا يوجد فرق بينها وبين الملاحظات الرئيسية - تشكل جميع الملاحظات الـ 12 تقدمًا هندسيًا لذلكأن نسبة الترددات بين الملاحظات المجاورة تساوي جذر الدرجة الثانية عشرة من 2. معنى هذا التقسيم من الأوكتاف إلى الملاحظات هو أنه بالنسبة لأي ملاحظة هناك ملاحظات أخرى تختلف في التردد بمقدار مرة ونصف - تسمى هذه التركيبة الخامسة. الملاحظات التي تشكل النوتة الخامسة تبدو متناغمة لأن النغمة التوافقية الثانية لإحدى النغمات تتزامن مع التردد النغمة الثالثة للنغمة الأخرى. تُظهر الصورة أدناه أطياف النوتات Do و Sol ، التي تشكل التوافقيات الخامسة المطابقة محاطة بدائرة باللون الأصفر.تشكيل التوافقية الخامسة ، محاطة بدائرة باللون الأصفر.تشكيل التوافقية الخامسة ، محاطة بدائرة باللون الأصفر.



كيف تأتي الملاحظات 12؟ نظرًا لأن الملاحظات تشكل تقدمًا هندسيًا ، فإننا ننتقل إلى اللوغاريتمات. ln (1.5) / ln (2) = 0.58496 ... يتم الحصول على قيمة إغلاق للكسر 7/12 = 0.583 ... أي أن سبع نغمات نصف (فترات بين الملاحظات المجاورة) تبين أنها قريبة جدًا من الخامسة ، 1.498. ومن المثير للاهتمام أن الكسر 31/53 = 0.58491 .. يعطي دقة أكبر بكثير ، بحيث يختلف الخامس عن 1.5 فقط في المكان العشري الخامس. لم تمر هذه الحقيقة دون أن يلاحظها أحد ، لكن الآلات الموسيقية التي تحتوي على 53 نوتة في اوكتاف لم تحصل على توزيع. من الصعب ضبطها ، ومن الصعب اللعب ، ونسبة الأشخاص الذين يمكنهم أن يشعروا بالفرق باستخدام الأدوات التقليدية ضئيلة للغاية.

كود المصدر


تقع هنا . لتجميع تم استخدام IAR Embedded Workbench ARM 7.50.2. لا توجد مكتبات أخرى مطلوبة للتجميع.

Source: https://habr.com/ru/post/ar391311/


All Articles