هل يمكنني القيام بتصفية الفرقة بسهولة باستخدام DirectSound؟ إذا لم يكن كذلك ، كيف يمكنني فعل ذلك؟

StackOverflow https://stackoverflow.com/questions/258667

سؤال

أنا أتساءل عما إذا كان هناك شيء مثل هذا ممكن (وسهل القيام به نسبيًا) ، وإذا كان الأمر كذلك ، كيف يمكنني فعل ذلك؟

أرغب في القيام بتصفية النطاق على ملف الموجة أقوم بإعادة إنتاجه. شيء مشابه لـ "التعادل" الذي تراه في معظم التطبيقات التي تشبه Winamp.
ومع ذلك ، فإن فكرتي هي عدم تعادل الصوت ، ولكن استخدام قيم DB سلبية عالية جدًا ، لقتل الفرقة تقريبًا التي أقوم بتصفية.

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

كيف يمكنني أن أفعل شيئًا كهذا؟

أيضا ، ما مدى دقة صنع هذه المرشحات؟ (إذا أردت تصفية كل شيء من 2250 هرتز إلى 2275 هرتز ، فما هو الخطأ الذي سيحصل عليه المرشح؟ ما هو الحد الأقصى للدقة التي يمكنني الحصول عليها؟)

شكرًا!

هل كانت مفيدة؟

المحلول

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

ربما ابدأ هنا (الرياضيات الثقيلة): فلتر التنوب

ثم Google للحصول على معلومات متعلقة بـ Windows/Directound الخاصة بك

نصائح أخرى

DirectSound لا يفعل تصفية النطاق كما تصف هنا ، على حد علمي.

تتمثل الفكرة العامة وراء ترشيح Bandpass في استخدام خطوط التأخير ، والتي تعيد إخراج الإشارة وتغذيها مرة أخرى في دفق الإدخال ، مع عامل تأخير محدد وعامل التحلل (أو التوهين). سيسمح لك التصميم الدقيق للمرشح بتضخيم أو تخفيف نطاقات تردد محددة في مصدر الصوت الخاص بك. لاحظ أن هذه التقنية لا تستخدم FFT ، باستثناء ربما أداة تشخيصية أثناء اختبار تأثيرات المرشح. تقوم تقنيات FFT بعمل أكثر دقة في الحد من الترددات أو تضخيمها ، ولكن خطوط التأخير أسرع بشكل عام (وأسهل طريقة للشفرة).

لمعالجة ملف WAV (على عكس القيام بتوليف/تصفية في الوقت الفعلي) ، فإن تنفيذ خط تأخير على المخزن المؤقت الصوتي بسيط مثل:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

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

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

يوفر DirectSound أي مرافق معالجة الإشارات على الإطلاق. هناك مجموعة متنوعة من التقنيات التي يمكنك استخدامها للقيام بما تريد. من الممكن استخدام FFT للقيام بما تريد ، ولكن ربما لا تكون أفضل أو أسهل طريقة. يجب أن تقرأ على الصوت DSP ، وخاصة التصفية الرقمية (IIR ، FIR). هناك كتاب DSP جيد متاح على الإنترنت مجانًا دليل العالم والمهندس لمعالجة الإشارات الرقمية وهو بالتأكيد يستحق نظرة. هناك أيضًا العديد من كتب DSP الجيدة الأخرى المتاحة من Amazon وما إلى ذلك.

لا أعرف أي مكتبات تعتني بهذا النوع من الأشياء مباشرة.

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

الفكرة الأساسية لتطبيق Eq باستخدام FFT هي:

  1. احصل على الصوت الخاص بك. الصوت هو مجرد مجموعة طويلة جدًا من القيم (العينات) وهي إزاحة مخروط مكبر الصوت / مرور الوقت.
  2. خذ تحويل فورييه للصوت (سيقوم libary بذلك ، ولكن سيتعين عليك السيطرة على عينات الصوت إلى التنسيق الصحيح. هذا يحول العينات المستندة إلى الوقت إلى تمثيل قائم على التردد - وهذا يحول الإشارة بشكل أساسي لإظهار التوزيع من الترددات في الإشارة.
  3. قسّم التردد إلى أعلى - تقسيم التوزيع إلى المناطق ، ستكون كل منطقة نطاقًا من الترددات.
  4. يمكنك بعد ذلك إجراء تعديلات على نطاقات التردد - على سبيل المثال ، يمكنك صفر منطقة واحدة لإزالة كل أثر لها.
  5. خذ تحويل فورييه العكسي لتوزيع التردد المحدث. سيؤدي ذلك إلى إرجاع التمثيل إلى المجال الزمني ، وإعادة بناء (تقريب) للإشارة الأصلية ، ولكن مع التعديلات التي أجريتها.

إن القيام بشيء من هذا القبيل سيتيح لك معالجة الترددات الموجودة في الصوت الخاص بك بدقة مما يمنحك نوع التحكم الذي تريده. كن حذرًا من أنه ليس من السهل التنفيذ.

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

أتمنى أن يساعد ذلك قليلاً.

قد لا تدعم DirectSound هذا مباشرة ، ولكن ينبغي أن يكون DirectShow. هل يمكنك استخدام API بدلاً من ذلك؟

أنا الثاني فكرة فلتر التنوب. للحصول على درجة ضيقة ، ستحتاج إلى نواة مرشح طويلة.

في الأساس ، يمكنك استخدام تلبية دفق الإدخال مقابل مجموعة من القيم (kernel). كل عينة إخراج هي مجموع من عينات N السابقة مضروبة مع إدخالها المقابل في kernel المرشح.

لذلك تحتاج إلى الحفاظ على صفيف kernel و FIFO أو مخزن مؤقت دائري من نفس العدد من العينات.

هم حاسبة فلتر فلتر FIR على الويب ، فقط Google "Fir Filter Calculator".

You should be able to do do an FFT, mess around in the frequency-domain (scaling frequency bins), and then do an IFFT to recover the time-domain signal. Otherwise, designing filters using ScopeFIR or MATLAB is pretty easy. ScopeFIR can easily design a bandstop filter and give you the coefficients so you can do a convolution on the signal. Here's a tutorial from the ScopeFIR website: http://www.iowegian.com/fir/tutor/firintro.htm

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