سؤال
كيفية طرح موجة صوتية من أخرى؟ بشكل عام وفي C# (أو إذا لم نتمكن من القيام بذلك في C# في C/C ++)
لدي الموجة الصوتية A و Sound Wave B (راجع للشغل: فهي في PCM) أريد طرح B من أ
ماذا أحتاج؟ LIBS مفتوح المصدر (وليس GPL ، ولكن LGPL سيكون على ما يرام) البرامج التعليمية حول كيفية القيام مثل هذه العملية (مع أو بدون استخدام libs) مقالات حول هذا الموضوع
ملاحظة: كل شيء عن AEC ...
المحلول
إذا تم تطبيع العينات إلى نفس المستوى ، وتم تخزينها بتنسيق موقّع بحيث يكون "مستوى الصفر" 0
أو 0.0
, ، الجواب بسيط إلى حد ما:
S_C = (S_A / 2) - (S_B / 2);
لكل عينة S_A
و S_B
في A و B.
إذا كنت تستخدم قيمًا غير موقعة للعينات ، فستحتاج إلى القيام بمزيد من العمل: أولاً ، ستحتاج إلى تحويلها إلى قيمة موقعة مع مركز صفر (على سبيل المثال ، إذا كان لديك 16 عينة غير موقعة ، قم بطرح 32768 من كل) ، ثم قم بتطبيق الصيغة ، ثم قم بتحويلها مرة أخرى إلى التنسيق غير الموقّع. كن حذرًا من الفائض - إليك مثال على كيفية إجراء التحويلات لعينات 16 بت المذكورة أعلاه:
#define PCM_16U_ZERO 32768
short pcm_16u_to_16s(unsigned short u)
{
/* Ensure that we never overflow a signed integer value */
return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}
unsigned short pcm_16s_to_16u(short s)
{
/* As long as we convert to unsigned before the addition, unsigned arithmetic
does the right thing */
return (unsigned short)s + PCM_16U_ZERO;
}
نصائح أخرى
https://stackoverflow.com/questions/1723563/acoustic-echo-cancellation-aec-in-wpf-with-c يسأل سؤال مماثل ولديه إجابة مقبولة. تحتوي المكتبة المقترحة على نوع من إلغاء الصدى على ما أعتقد.
لسوء الحظ ، لم أستخدم أي مكتبات صوتية مفتوحة المصدر. لقد استخدمت fmod لمعالجة الصوت من قبل ، لا أتذكر أن هناك أي AEC فيه ، ولكن يمكنك الوصول إلى الصوت الخام أثناء معالجته وتشغيل الكود الخاص بك عليه.