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

من الأفضل رؤية العمل على أي موسيقى:
وروابط لأمثلة أخرى من أنواع مختلفة. ميتالديث-تورنادو من النفوس:
بعيد المنال:
لذلك بالنسبة للتحلل ، تحتاج إلى القيام بالخطوات التالية:
- من الإشارة الأصلية ، تحتاج إلى الحصول على 8 إشارات وسيطة ؛
- من هذه الإشارات الوسيطة والإشارة الأصلية ، تحتاج إلى الحصول على 8 إشارات - طبقات ، والتي يمكن تفكيكها إلى موجات منفصلة ؛
- لحساب عدد الموجات في كل طبقة وما هو اتساعها.
الآن ، المزيد عن كل مرحلة: من أجل الحصول على إشارة وسيطة ، تحتاج إلى أخذ مشتق الإشارة الأصلية. في الجوهر ، هذا مشتق من وظيفة منفصلة. للعثور عليه لكل لحظة من الإشارة الأصلية ، تحتاج إلى تعيين معلمة 1: الفترة التي يقع فيها هذا المشتق. القيمة المشتقة هي معامل الميل في فاصل معين ، على سبيل المثال ، يمكن إيجاده بواسطة طريقة المربعات الصغرى.
مطلوب لحساب 8 إشارات وسيطة مع 8 فترات مختلفة. أبسط مجموعة من الفترات: 4 ، 8 ، 16 ، 32 ، 64 ، 128 ، 256 ، 512. عند تعيين نقطة ، يتم حساب المشتق لكل عينة إشارة باستخدام صيغة المربعات الصغرى. إنه مثل المتوسط المتحرك ، ولكنه هنا ليس متوسط متحرك ولكنه مشتق متحرك للفاصل الحالي.
وبالتالي ، يتم الحصول على 8 إشارات مشتقة ومصدر واحد. يجب الآن دمج كل من الإشارات المشتقة الثمانية. في هذه الحالة ، هذا يعني أن كل عينة لاحقة تساوي مجموع جميع العينات السابقة. بعد ذلك ، يتم الحصول على 8 طبقات وسيطة.
الخطوة التالية هي الحصول على طبقات يمكن تفكيكها إلى موجات منفصلة. الآن تحتاج إلى الحصول على 8 طبقات. يتم حساب الطبقات على النحو التالي:
الطبقة 0 = إشارة وسيطة بدون مخرج
طبقة 1 = متوسطة 1 متوسطة 0
طبقة 2 = متوسطة 2 متوسطة 1
طبقة 3 = متوسطة 3 متوسطة 2
طبقة 4 = متوسطة 4 متوسطة 3
طبقة 5 = متوسط 5 متوسط 4
طبقة 6 = متوسطة 6 متوسطة 5
layer7 = وسيط 7-وسيط 6
طبقة 8 = وسيطة 7
الطبقة الأخيرة ليست فرقًا ، لكنها تساوي ببساطة الإشارة المتوسطة الأخيرة.
يمكنك المحاولة بشكل مختلف ، أي لحساب الإشارات الوسيطة اللاحقة من الإشارات الوسيطة السابقة. ولكن في البرنامج الحالي ، يتم استخدام خيار 1.
الآن ، لتحليل الطبقات إلى موجات منفصلة ، ما عليك سوى حساب المناطق حيث تزيد القيم وحيث تنخفض. في الواقع مدة المقاطع هي أطوالها الموجية. أقسام الإشارة حيث تكون قيم الإشارة ثابتة ، فقط تخطي. للعثور على اتساع الإشارة في الطيف في فترة زمنية معينة ، تحتاج إلى إضافة جميع اتساعات الموجة مضروبة في طولها.

يبدو الرمز الذي يحسب الإشارة المتوسطة كما يلي:
هنا wavesize هو عدد العينات
إشارة [] - صفيف مع الإشارة الأصلية
SY = 0 ، SX = 0 ، SXX = 0 ، SXY = 0 ، Ky = 0 - متغيرات من النوع العائم
Step2 = STEP / 2 حيث STEP هي الفترة (4،8،16،32،64،128،256،512)
for(int i=Step2;i<wavesize-Step2;i++){ SY=0,SX=0,SXX=0,SXY=0,Ky=0; for(int j=i-Step2,fromZ=0;j<i+Step2;j++,fromZ++){ SX+=fromZ; SY+=signal[j]; SXX+=fromZ*fromZ; SXY+=fromZ*signal[j]; } Ky=float((STEP)*SXY-SX*SY)/float((STEP)*SXX-SX*SX); OutSignal[i]=OutSignal[i-1]+Ky; }
لطرح إشارة من أخرى ، ببساطة اطرح كل عينة من بعضها.
على سبيل المثال ، للطبقة 0:
for(int i=0;i<wavesize-1;i++) layer0[i]=OutSignal0[i]-Signal[i];
إذا قمت بإضافة كل الطبقات وأخذت الأخيرة بعلامة عكسية ، فستحصل على الإشارة الأصلية ، وبالتالي تضاعف أي طبقة ، فمن الممكن عمل مرشح تردد. السؤال التالي هو كيفية حساب اتساع التوافقيات المحددة. والحقيقة هي أنه في فاصل زمني ثابت ، على سبيل المثال = 4000 عينة ، يمكن أن يكون هناك الكثير من الموجات القصيرة وعدد قليل نسبيًا من الموجات الطويلة.
يمكنك بالطبع العثور على متوسط السعات لكل طبقة والإضافة. لكن هذه الطريقة ليست جيدة جدًا نظرًا لوجود عدد قليل جدًا من الموجات الطويلة ، وعادة ما يكون اتساعها كبيرًا جدًا ، ويتم الحصول على عدم انتظام اتساع قوي تجاه الترددات المنخفضة.
في برنامج يعرض الموسيقى الملونة بالارتباطات ، يتم حساب اتساع كل نغمة توافقية على النحو التالي: اتساع الموجة * طولها. كل نفس ، ينشأ التفاوت ، ولكن ليس بالقوة كما هو الحال في المتوسط.
بشكل عام ، لا أعتقد أن الشخص ينظر إلى الصوت على أنه تحلل إلى طيف ؛ بدلاً من ذلك ، يتكون الصوت من صور صوتية ، تتكون من موجات ذات أطوال مختلفة. وفقًا لذلك ، فإن حجم الصوت هو متوسط حجم جميع الموجات التي يتكون منها الصوت. ولكن ليس من الواضح حتى الآن ما هي المعلمات التي تشكل الصورة الصوتية ، وربما متوسط التردد ، أو الانحراف المعياري ، أو أي شيء آخر.