سؤال

كيفية طرح موجة صوتية من أخرى؟ بشكل عام وفي 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 فيه ، ولكن يمكنك الوصول إلى الصوت الخام أثناء معالجته وتشغيل الكود الخاص بك عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top