كيف نختبر أنظمة الميكروفون على STM32: تجربة مطوري أجهزة Yandex



مرحبًا ، أنا جينادي "Crail" Kruglov من فريق حلول أجهزة Yandex.

يعد اختيار الميكروفونات لمصفوفة الميكروفون جزءًا معقدًا ومثيرًا للاهتمام من عملنا: نقوم باختبار النماذج ذات المعلمات المختلفة ، وتجربة تكوينات المصفوفة المختلفة ، وتحسين خوارزميات معالجة الصوت.

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

يبدو بسيطا للوهلة الأولى فقط. في هذه المقالة سوف أشرح كيف تمكنا من حل مشكلة نقل الصوت من سبعة ميكروفونات بواجهة PDM إلى كمبيوتر عبر USB ، وما هي الفروق الدقيقة في الأجهزة والبرامج التي واجهناها وكيفية التغلب عليها (المفسد: يمكن تكييف هذا النهج للمصفوفات مع عدد الميكروفونات ≤ 8 ) في نهاية المنشور ، سأشارك رابطًا إلى الدفق ، حيث أعرض عملية التطوير على متحكم متحكم STM32 وأتحدث عن السلسلة التالية.

صياغة المشكلة


خلفية صغيرة: لإنشاء شعاع متحكم فيه من الحساسية ، لمحطة Yandex الأولى ، تم اختيار دائرة بها سبعة ميكروفونات (تناظرية) ، للنسخة المصغرة - بأربعة (رقمية بالفعل). بالنسبة للمنتجات الأخرى ، يتم النظر في التكوينات المختلفة ، ولكن لا تزال مصفوفة الميكروفونات السبعة بالنسبة لنا أساسية وكلاسيكية.

لذا ، بالنظر إلى: سبعة ميكروفونات رقمية ، الحاجة إلى اختبارها. العثور على: ليس من الصعب للغاية تنفيذها وطريقة مرنة للتفاعل معها. من المنطقي تقسيم المهمة إلى قسمين:

1. الحصول على البيانات من الميكروفونات.

2. أرسلها إلى جهاز الكمبيوتر.

في الجهاز النهائي ، عندما يتصل المستخدم بـ Alice ، يتم إرسال الإشارات من الميكروفونات الرقمية مباشرة إلى المعالج المركزي (من الأصح تسميتها SoC - System-on-Chip ، لكن "المعالج" أكثر شيوعًا وملاءمة) ، ولديه طاقة كافية لمعالجتها. ولكن من أجل تصحيح الخوارزميات ، من الأسهل بكثير الحصول على هذه البيانات مباشرة إلى كمبيوتر المطور. أسهل طريقة هي الاتصال عبر USB: وبالتالي ، يجب أن تحتوي اللوحة على متحكم دقيق مع الوحدة المناسبة. نحن نحب وحدة التحكم STM32 ، ولكن من المستحيل إرسال دفق الصوت من الميكروفونات مباشرة إليه: لا توجد وحدة استقبال إشارة PDM (تعديل كثافة النبض) - واجهة الإخراج للميكروفونات الرقمية.

خيار آخر هو توصيل لوحة الميكروفون بلوحة التصحيح من الشركة المصنعة لـ SoC المستخدم. لكن هذا القرار مرتبط بـ Linux alsamixer ، وتؤثر معلماته بشدة على نتيجة تحويل PDM إلى PCM. قد تختلف هذه الكتل ليس فقط للمعالجات من الشركات المصنعة المختلفة ، ولكن حتى لطرازين من نفس المورد. أذكركم أننا بحاجة إلى حل بسيط وشفاف ويمكن التنبؤ به.

حل الأجهزة


قبول عدم قدرة STM32 على قبول PDM متعدد القنوات. يمكن للمرء استخدام كتلة SPI لتلقي إشارة PDM ، ولكن يمكن توصيل ميكروفون واحد فقط بناقل SPI واحد. نحن نعمل مع وحدة التحكم STM32L476RC ، حيث يوجد ثلاث حافلات فقط. تعقيد إضافي: إشارة PDM عالية التردد تمامًا ، من الضروري القيام بالتدمير ، المتوسط ​​، المعالجة ، التصفية - بالنسبة لسبعة ميكروفونات هذه المهمة معقدة للغاية.

نظرًا لأننا نتحدث عن لوحة تصحيح ، وليس نموذجًا أوليًا للإنتاج الضخم ، فسوف نركز على شريحة متخصصة TSDP18xx. إنه يفعل كل ما هو ضروري: فهو يولد الترددات والإشارات اللازمة لـ PDM ، ويحسب ويعالج إشارة PDM ، ويحولها كلها إلى إشارة I2S. بتعبير أدق ، TDM (مضاعفة تقسيم الوقت) ، لأن ناقل I2S يفترض قناتين ، وإذا كنت تقود أكثر عبر نفس الأسلاك ، فلن يكون من الصحيح تمامًا تسميته I2S.

ميزة هذا النهج هو أن كل العمل على الإعداد والمتوسط ​​يقوم به TSDP. ناقص - يتم ربط جميع الخوارزميات بإحكام داخل هذه الدائرة المصغرة ، ولا يمكن تغييرها. على وجه الخصوص ، لا يمكنك ضبط مستوى الصوت عن طريق تعديل معلمات المتوسط. ولكن بالنسبة لتصحيح الأخطاء ، هذا ليس بالغ الأهمية.

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

لذلك ، نرفع TDM ثماني القنوات إلى STM32 ، نحصل على دفق صوتي ثماني القنوات. كيفية نقل البيانات:



وحدة أجهزة SAI - STM32 للعمل مع I2S / TDM. إنه مرن للغاية ويسمح لك بتنفيذ العديد من خيارات البروتوكول. ولكن بسبب هذا ، من السهل الخلط بين متطلبات الترددات.

شجرة الساعة تستحق نظرة فاحصة. يتم توصيل مرنان كوارتز 12 ميجاهرتز بجهاز التحكم الدقيق. نقسم هذا التردد قبل التقديم على كتل PLL على 3 ونحصل على 4 MHz. ثم يعمل مثل هذا:

1. سيكون من الجيد جعل التردد الأساسي أعلى لمواكبة كل شيء: على سبيل المثال ، الحد الأقصى لوحدة التحكم هذه هو 80 ميجاهرتز. نستخدم أول كتلة PLL: نضرب 4 MHz في 40 ونقسمها على 2.

2. USB يتطلب 48 MHz. للقيام بذلك ، استخدم كتلة PLL الثانية: اضرب 4 MHz في 24 وقسمه على 2.

3. حول الميكروفونات. تستخدم لوحات الاختبار لدينا تردد أخذ العينات Fs = 16 كيلو هرتز ، وهو معيار معتمد في مجال التعرف على الكلام. من التردد الأولي البالغ 4 ميجاهرتز ، تحتاج إلى الحصول على شيء يمكن تحويله إلى ترددات إطار ناقل TDM بسرعة 16 كيلوهرتز (ويعرف أيضًا باسم LRCK أو aka FCK أو aka FrameSync). في هذه الحالة:

[تردد تزامن البتات (BCLK ، BitClk ، Sync ، SCK)] = Fs ∙ [عدد القنوات] ∙ [عدد البتات لكل قناة]

أي: SCK = 16 kHz ∙ 8 ∙ 16 = 2048 kHz.

4. تشير ورقة البيانات إلى أن العلاقة بين الساعة الرئيسية ومعدل أخذ العينات Fs هي كما يلي: MasterClock = 16 كيلو هرتز ider مقسم MCLK ∙ 256. هنا 256 ثابت ، ويمكن تعيين المقسوم في التسجيل. دعونا نتحقق من المخطط - للوظيفة المطلوبة ، هناك معاملات لتقسيم تردد PLL على 7 أو 17:



لتلخيص المشكلة: تحتاج إلى اختيار مجموعة من عوامل وتقسيم PLL و SAI للحصول على تردد أخذ العينات 16 كيلو هرتز وتردد بت 128 مرة أكثر. نظرًا لأن المجموعة تحتوي على مقسومًا إجباريًا على 7 (أو 17) ، فإنها لم تعمل على الحصول على النتيجة المرجوة بالضبط. اضطررت إلى بناء جدول للمضاعفات والفواصل للحصول على 24.571 ميجاهرتز. بتقسيم هذا التردد على 6 (مقسم MCLK) ، ثم على 256 (ثابت) ، أخيرًا ، نحصل على عدد قريب بما يكفي من 16 كيلو هرتز. الآن سأشرح لماذا هذا مهم جدا.

تشغيل USB


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

مع نوع النقل المتزامن بسرعة USB FullSpeed ​​(تبلغ 12 ميجابت / ثانية ؛ وبهذه السرعة يمكن أن تعمل كتلة USB STM32) ، يأتي الكمبيوتر إلى الجهاز للحصول على البيانات كل مللي ثانية: بعد هذه الفترة الزمنية ، يجب عليه جمع البيانات المتراكمة. دعني أذكرك بالقنوات التمهيدية: تردد أخذ العينات 16 كيلو هرتز ، 8 قنوات ، كل قناة تتطلب وحدتي بايت ، لأن الصوت ستة عشر بت. إجمالي 16000 ∙ 2 ∙ 8/1000 = 256 بايت لكل مللي ثانية. يمكن أن يصل حجم حزمة واحدة لنوع الإرسال المتزامن إلى 1023 بايت ، لذلك لا توجد مشاكل في هذه المرحلة.

لذلك ، حجم الحزمة 256 بايت. يبدو أن كل شيء على ما يرام. تلقى 16 مرة بيانات عن TDM ، تم وضعها في المخزن المؤقت ، جاء USB ، نعطيها حزمة ، نكرر ... ولكن هذا يحدث فقط في عالم مثالي. تكمن المشكلة في أنه من ناحية ، لدينا 16 كيلوهرتز غير كاملة (أقل بقليل) ، ونتيجة لذلك ، تأتي البيانات أقل بقليل من مرة واحدة كل مللي ثانية. من ناحية أخرى ، فإن الثانية من الكمبيوتر تطفو أيضًا ، لأنها مشغولة: عندما تستطيع ، ثم جاءت. وهذا يعني أن تردد أخذ عينات الميكروفون يختلف عن 16 كيلو هرتز (ولكن دائمًا هو نفسه) ، ويختلف أيضًا مللي ثانية USB في الطول (الفرق يطفو على الأرجح: يتحول أكثر قليلاً ، ثم أقل بقليل من مللي ثانية مثالية).

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



المشكلة ، في الواقع ، معروفة. هناك ثلاث طرق للتعامل معها:

  • . USB. — . «» — . USB . , , ( , 16 ), . , .
  • . .
  • غير المتزامن هو الأفضل لهذه المهمة. يحتوي الجهاز على مولد تردد ثابت. يتم الحفاظ على معدل أخذ العينات كما هو بالضبط بدون الرجوع إلى USB. في هذه الحالة ، تحتاج إلى نقل البيانات إلى الجهاز حتى لا تكون هناك اختلافات كبيرة.

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



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

ها هو


نستخدم الإضافة المتكررة للعينات والمخزنين المؤقتين لتخزين البيانات لإرسالها. 16 مرة لكل مللي ثانية نضيف إلى المخزن المؤقت المحدد العينة التالية. في وقت ما ، يحدث انقطاع: أخذ USB الحزمة السابقة. إذا كان المخزن المؤقت رقم 1 ممتلئًا ، فإنه يتحول إلى المخزن المؤقت رقم 2. عند وصول USB للحزمة التالية ، فهذا يعني أنه جاهز بالفعل. إرسال رقم المخزن المؤقت 2 والرجوع إلى الرقم 1.



يأتي USB للبيانات في نقاط زمنية مختلفة ، وتتضمن الحزمة عددًا مختلفًا من العينات. يمكن أن يتحول إلى أكثر وأقل من ستة عشر ، لذلك هناك فرصة لتجاوز حزمة حجمها 256 بايت ، فمن الأفضل ترك مساحة للمناورة. فليكن 384 = 256 + 128: سيعطي هذا هامش نصف مللي ثانية ، أي أنه سيسامح مرحلة السباحة لإشارة USB بنسبة 50٪ - يجب أن يكون هذا الهامش أكثر من كاف. الإجمالي: في بعض الأحيان يتم إرسال 256 بايت أو أقل ، ولكن لا يتم أبدًا حزمة فارغة ، والتي تتجنب فقدان البيانات. أي أنه تم حل مشكلة التفاوت عن طريق زيادة الحزمة ، على حساب زيادة جزء من عرض النطاق الترددي للحافلة المخصص لجهازنا وتقليل هذا الجزء للأجهزة الأخرى.

على هذا ، انتهى تسليم البيانات إلى الكمبيوتر. يمكن تصحيح المطورين ، ويمكنك طرح أسئلة في التعليقات إذا كان نوع من حزم البيانات غير كافٍ لفهم كامل.

تياراتي والحلقة القادمة


في الآونة الأخيرة ، تبثت مرتين من معمل اللحام المنزلي. في البداية ، عرضت للتو عملية اللحام وأخبرت الأجهزة التي أستخدمها. تم تخصيص السلسلة الثانية للتطوير على STM32.

تيارات مستمرة. يوم الجمعة في تمام الساعة 19:00 ، سيقوم زميلي من فريق تطوير حلول الأجهزة Andrey Laptev بترتيب تحليل عبر الإنترنت لـ Yandex.Stations Mini - لإظهار التفاصيل ومشاركة تاريخ الإنتاج. لمزيد من المرح ، سيقوم Andrey بتثبيت البطارية في العمود - وليس كل نفس ، يعمل من السلك. في النهاية ، ستتلقى دليلاً يسمح لك بتكرار هذه التجربة بنفسك أو الخروج بتصميم أكثر إثارة للاهتمام.

سجللمشاهدة الدفق. سوف تتلقى رسالة مع ملف للتقويم وتذكير في يوم البث. شكرا لقرائتك!

All Articles