سؤال

أنا أكتب برنامج المزج و تحتاج إلى توليد bandlimited الملقب مجانا الطول الموجي في الوقت الحقيقي في 44.1 كيلو هرتز samplerate.مشرشف مثل سن المنشار الموجي يعمل الآن, منذ أن كنت يمكن أن تولد موجة النبض عن طريق خلط اثنين sawtooths معا واحد مقلوب و مرحلة تحول.

حتى الآن لقد حاول الطرق التالية:

  1. Precomputing واحدة-دورة تماما bandlimited الموجي عينات مختلفة bandlimit الترددات عند بدء التشغيل ثم إعادة تشغيل اثنين من أقرب منها مختلطة معا.يعمل حسنا أعتقد لكن لا يشعر أنيقة جدا.الكثير من العينات اللازمة أو "الفجوات" بين لهم سوف يسمع.التحريف و خلط كبير أيضا وحدة المعالجة المركزية مكثفة.

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

لذا سؤالي هو:ما هي الطريقة المعتادة يتم هذا ؟ أي الحلول المقترحة يجب أن تكون فعالة من حيث وحدة المعالجة المركزية ، لأنه يجب أن يتم في الوقت الحقيقي ، العديد من الأصوات في وقت واحد.

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

المحلول

هناك الكثير من طرق معالجة bandlimited الموجي جيل.سوف ينتهي التداول الحسابية تكلفة ضد الجودة كالعادة.

أقترح عليك أن نلقي نظرة على هذا الموقع هنا:

http://www.musicdsp.org/

تحقق من الأرشيف!انها كاملة من مادة جيدة.أنا فقط عملت بحث على كلمة "bandlimited".المواد التي للملوثات العضوية الثابتة يجب أن تبقى مشغول لمدة أسبوع على الأقل.

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

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

نصائح أخرى

واحد طريقة سريعة لإنشاء الفرقة محدودة الطول الموجي باستخدام الفرقة-خطوات محدودة (BLEPs).يمكنك إنشاء الفرقة محدودة الخطوة نفسها:

enter image description here

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

enter image description here

نرى خلال المشي في الفرقة محدودة توليف الصوت.

لأن هذا BLEP غير سببية (بمعنى أنه يمتد إلى المستقبل) ، لتوليد الوقت الحقيقي الطول الموجي ، فمن الأفضل استخدام الحد الأدنى للمرحلة الفرقة خطوة محدودة ، ودعا MinBLEP, التي لها نفس الترددات, ولكن فقط تمتد إلى الماضي:

MinBLEPs تأخذ فكرة أخرى ، اتخاذ إطارات سينك, إجراء الحد الأدنى مرحلة إعادة الإعمار ثم دمج نتيجة تخزينه في الجدول.الآن لجعل المذبذب لك مجرد إدراج MinBLEP في كل الانقطاع في الموجي.لذلك موجة مربع إدراج MinBLEP حيث الموجي المقلوب ، رأيت موجة إدراج MinBLEP حيث قيمة المقلوب ، ولكن يمكنك توليد المنحدر بشكل طبيعي.

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

للحد من التعرج أكثر النواة ويمكن زيادة حجم قليلا ، مما يجعلها 2*phaseChange على سبيل المثال تبدو جيدة كذلك ، على الرغم من أنك تفقد قليلا من ترددات أعلى.

أيضا هنا هو جيد آخر DSP الموارد وجدت عند تصفح SP عن مواضيع مماثلة: تركيب أدوات في C++ (STK).انها مكتبة الفئة التي لديها الكثير من المفيد DSP الأدوات.حتى أنها جاهزة للاستخدام bandlimited مولدات الموجي.طريقة يستخدمونها في دمج سينك كما وصفت في أول وظيفة (على الرغم من أنني أعتقد أنها تفعل ذلك أفضل لي...).

float getSaw(float phaseChange)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange);
}

float getPulse(float phaseChange, float pulseWidth)
{
    static float phase = 0.0f;
    phase = fmod(phase + phaseChange, 1.0f);
    return getBoxFilteredSaw(phase, phaseChange) - getBoxFilteredSaw(fmod(phase + pulseWidth, 1.0f), phaseChange);
}

float getBoxFilteredSaw(float phase, float kernelSize)
{
    float a, b;

    // Check if kernel is longer that one cycle
    if (kernelSize >= 1.0f) {
        return 0.0f;
    }

    // Remap phase and kernelSize from [0.0, 1.0] to [-1.0, 1.0]
    kernelSize *= 2.0f;
    phase = phase * 2.0f - 1.0f;

    if (phase + kernelSize > 1.0f)
    {
        // Kernel wraps around edge of [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize - 2.0f;
    }
    else
    {
        // Kernel fits nicely in [-1.0, 1.0]
        a = phase;
        b = phase + kernelSize;
    }

    // Integrate and divide with kernelSize
    return (b * b - a * a) / (2.0f * kernelSize);
}

DC تعويض من blit - يمكن تخفيض بسيط High Pass Filter!- مثل الكثير من الدوائر التناظرية الحقيقي حيث أنها تستخدم DC حجب كاب!

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