نمونه گیری صدا

از Android 5.0 (Lollipop)، نمونه‌های مجدد صدا اکنون کاملاً مبتنی بر فیلترهای FIR هستند که از یک تابع پنجره‌دار Kaiser مشتق شده‌اند. Kaiser windowed-sinc ویژگی های زیر را ارائه می دهد:

  • محاسبه پارامترهای طراحی آن (ریپل باند توقف، پهنای باند انتقال، فرکانس قطع، طول فیلتر) ساده است.
  • برای کاهش انرژی باند توقف در مقایسه با انرژی کلی تقریباً بهینه است.

رجوع کنید به PP Vaidyanathan، سیستم های چند نرخی و بانک های فیلتر ، ص. 50 برای بحث در مورد پنجره Kaiser و بهینه بودن و رابطه آن با Prolate Spheroidal Windows.

پارامترهای طراحی به طور خودکار بر اساس تعیین کیفیت داخلی و نسبت های نمونه مورد نظر محاسبه می شوند. بر اساس پارامترهای طراحی، فیلتر windowed-sinc تولید می شود. برای استفاده از موسیقی، نمونه‌برداری مجدد برای 44.1 تا 48 کیلوهرتز و بالعکس با کیفیت بالاتری نسبت به تبدیل فرکانس دلخواه تولید می‌شود.

نمونه‌های مجدد صدا کیفیت افزایش یافته و همچنین سرعت دستیابی به آن کیفیت را فراهم می‌کنند. اما نمونه‌های مجدد می‌توانند مقادیر کمی موج عبور باند و نویز هارمونیک را ایجاد کنند و می‌توانند باعث از دست دادن فرکانس بالا در باند انتقال شوند، بنابراین از استفاده غیرضروری از آنها خودداری کنید.

بهترین شیوه ها برای نمونه گیری و نمونه گیری مجدد

این بخش برخی از بهترین شیوه‌ها را توضیح می‌دهد تا به شما در جلوگیری از مشکلات نرخ نمونه‌گیری کمک کند.

نرخ نمونه برداری را متناسب با دستگاه انتخاب کنید

به طور کلی، بهتر است نرخ نمونه برداری را متناسب با دستگاه انتخاب کنید، معمولاً 44.1 کیلوهرتز یا 48 کیلوهرتز. استفاده از نرخ نمونه بیشتر از 48 کیلوهرتز معمولاً منجر به کاهش کیفیت می شود زیرا برای پخش فایل باید از resampler استفاده شود.

از نسبت‌های نمونه‌گیری مجدد ساده (چند فازهای ثابت در مقابل درونیابی) استفاده کنید

نمونه برداری مجدد در یکی از حالت های زیر عمل می کند:

  • حالت چند فازی ثابت ضرایب فیلتر برای هر چند فاز از قبل محاسبه شده است.
  • حالت چند فازی درون یابی. ضرایب فیلتر برای هر چند فاز باید از نزدیکترین دو چند فاز از پیش محاسبه شده درون یابی شود.

نمونه‌بردار مجدد در حالت چند فاز ثابت سریع‌ترین است، زمانی که نسبت نرخ ورودی به نرخ خروجی L/M (با برداشتن بزرگترین مقسوم‌کننده مشترک) M کمتر از 256 باشد. برای مثال، برای تبدیل 44100 به 48000، L = 147، M = 160.

در حالت چند فاز ثابت، نرخ نمونه برداری قفل است و تغییر نمی کند. در حالت چند فازی درون یابی، نرخ نمونه برداری تقریبی است. هنگام پخش بر روی یک دستگاه 48 کیلوهرتز، نرخ نمونه برداری معمولاً یک نمونه در طول چند ساعت است. این معمولاً نگران کننده نیست زیرا خطای تقریب بسیار کمتر از خطای فرکانس است که توسط نوسانگرهای کوارتز داخلی، رانش حرارتی یا جیتر (معمولاً ده ها ppm) ایجاد می شود.

هنگام پخش در دستگاهی با فرکانس 48 کیلوهرتز، نرخ‌های نمونه‌گیری با نسبت ساده مانند 24 کیلوهرتز (1:2) و 32 کیلوهرتز (2:3) را انتخاب کنید، حتی اگر سایر نرخ‌ها و نسبت‌های نمونه‌برداری از طریق AudioTrack مجاز باشند.

برای تغییر نرخ نمونه به جای نمونه برداری از نمونه برداری از نمونه برداری استفاده کنید

نرخ نمونه برداری را می توان در پرواز تغییر داد. دانه بندی چنین تغییری بر اساس بافر داخلی (معمولاً چند صد نمونه) است، نه بر اساس نمونه به نمونه. این را می توان برای افکت استفاده کرد.

هنگام کاهش نمونه‌گیری، نرخ‌های نمونه‌گیری را به صورت پویا تغییر ندهید. هنگام تغییر نرخ نمونه پس از ایجاد یک تراک صوتی، تفاوت‌های حدود 5 تا 10 درصدی نسبت به نرخ اصلی ممکن است باعث محاسبات مجدد فیلتر در هنگام پایین‌نمونه‌سازی (برای سرکوب صحیح الایاسینگ) شود. این می تواند منابع محاسباتی را مصرف کند و اگر فیلتر در زمان واقعی جایگزین شود، ممکن است یک کلیک شنیداری ایجاد کند.

نمونه برداری را به بیش از 6:1 محدود کنید

نمونه برداری پایین معمولاً توسط الزامات دستگاه سخت افزاری انجام می شود. وقتی از مبدل Sample Rate برای پایین‌نمونه‌گیری استفاده می‌شود، سعی کنید نسبت پایین‌نمونه‌سازی را به بیش از 6:1 محدود کنید تا حذف نام مستعار خوب باشد (به عنوان مثال، نمونه پایین‌تر از 48000 تا 8000 نباشد). طول فیلتر مطابق با نسبت پایین‌نمونه‌برداری تنظیم می‌شود، اما شما پهنای باند انتقال بیشتری را در نسبت‌های پایین نمونه‌گیری بالاتر قربانی می‌کنید تا از افزایش بیش از حد طول فیلتر جلوگیری کنید. هیچ نگرانی مشابهی برای نمونه برداری وجود ندارد. توجه داشته باشید که برخی از قسمت‌های خط لوله صوتی ممکن است از کاهش نمونه‌برداری بیشتر از 2:1 جلوگیری کند.

اگر نگران تأخیر هستید، نمونه برداری مجدد نکنید

نمونه برداری مجدد از قرار گرفتن مسیر در مسیر FastMixer جلوگیری می کند، به این معنی که تاخیر بسیار بالاتری به دلیل بافر اضافی و بزرگتر در مسیر Mixer معمولی رخ می دهد. علاوه بر این، یک تأخیر ضمنی از طول فیلتر نمونه‌برداری مجدد وجود دارد، اگرچه این مدت معمولاً حدود یک میلی‌ثانیه یا کمتر است، که به اندازه بافر اضافی برای مسیر معمولی Mixer (معمولاً 20 میلی‌ثانیه) نیست.

استفاده از صدای ممیز شناور

استفاده از اعداد ممیز شناور برای نمایش داده های صوتی می تواند به طور قابل توجهی کیفیت صدا را در برنامه های صوتی با کارایی بالا افزایش دهد. نقطه شناور مزایای زیر را ارائه می دهد:

  • محدوده دینامیکی گسترده تر
  • دقت ثابت در محدوده دینامیکی
  • فضای سر بیشتر برای جلوگیری از بریدن در طول محاسبات میانی و گذرا.

در حالی که ممیز شناور می تواند کیفیت صدا را افزایش دهد، معایب خاصی دارد:

  • اعداد ممیز شناور از حافظه بیشتری استفاده می کنند.
  • عملیات ممیز شناور از ویژگی‌های غیرمنتظره استفاده می‌کند، برای مثال، اضافه کردن ارتباطی نیست.
  • محاسبات ممیز شناور گاهی اوقات به دلیل گرد کردن یا الگوریتم‌های ناپایدار عددی، دقت حسابی را از دست می‌دهند.
  • استفاده موثر از ممیز شناور به درک بیشتر برای دستیابی به نتایج دقیق و قابل تکرار نیاز دارد.

قبلاً، ممیز شناور به دلیل در دسترس نبودن یا کند بودن بدنام بود. این هنوز در مورد پردازنده های رده پایین و تعبیه شده صادق است. اما پردازنده‌های دستگاه‌های موبایل مدرن اکنون دارای نقطه شناور سخت‌افزاری با عملکردی مشابه (یا در برخی موارد حتی سریع‌تر) از عدد صحیح هستند. CPUهای مدرن همچنین از SIMD (دستورالعمل واحد، داده های متعدد) پشتیبانی می کنند که می تواند عملکرد را بیشتر بهبود بخشد.

بهترین روش ها برای صدای ممیز شناور

بهترین روش های زیر به شما کمک می کند تا از مشکلات مربوط به محاسبات ممیز شناور جلوگیری کنید:

  • برای محاسبات نادر، مانند محاسبه ضرایب فیلتر، از ممیز شناور با دقت مضاعف استفاده کنید.
  • به ترتیب عملیات دقت کنید.
  • متغیرهای صریح را برای مقادیر میانی اعلام کنید.
  • از پرانتز آزادانه استفاده کنید.
  • اگر نتیجه NaN یا بی نهایت دریافت کردید، از جستجوی دودویی برای کشف مکان معرفی آن استفاده کنید.

برای صدای ممیز شناور، فرمت صوتی که AudioFormat.ENCODING_PCM_FLOAT را رمزگذاری می‌کند، مشابه ENCODING_PCM_16_BIT یا ENCODING_PCM_8_BIT برای تعیین قالب‌های داده AudioTrack استفاده می‌شود. روش سربارگذاری شده مربوطه AudioTrack.write() در یک آرایه شناور برای تحویل داده ها استفاده می کند.

کاتلین

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

جاوا

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

برای اطلاعات بیشتر

این بخش برخی از منابع اضافی در مورد نمونه گیری و ممیز شناور را فهرست می کند.

نمونه برداری

نرخ نمونه

نمونه گیری مجدد

بحث عمق بیت بالا و کیلوهرتز بالا

نقطه شناور

صفحات ویکی پدیا زیر برای درک صدای ممیز شناور مفید هستند:

مقاله زیر اطلاعاتی را در مورد جنبه‌هایی از ممیز شناور که تأثیر مستقیمی بر طراحان سیستم‌های کامپیوتری دارد ارائه می‌کند: