از Android 5.0 (Lollipop)، نمونهبرداریهای مجدد صوتی اکنون کاملاً براساس فیلترهای FIR مشتقشده از تابع Kaiser windowed-sinc هستند. پنجره Kaiser-sinc ویژگیهای زیر را ارائه میدهد:
- محاسبه پارامترهای طراحی آن (موجک باند توقف، پهنای باند گذار، فرکانس قطع، طول فیلتر) ساده است.
- این فیلتر برای کاهش انرژی باند توقف در مقایسه با انرژی کلی تقریباً بهینه است.
برای بحث درباره «پنجره قیصر» و بهینگی آن و ارتباطش با «پنجرههای کروی کشیده»، به کتاب سیستمهای چندنرخی و بانکهای فیلتر، نوشته پی. پی. وایدیاناتان، صفحه ۵۰ مراجعه کنید.
پارامترهای طراحی بهطور خودکار براساس تعیین کیفیت داخلی و نسبتهای نمونهبرداری مطلوب محاسبه میشوند. براساس پارامترهای طراحی، فیلتر سینک پنجرهای تولید میشود. برای استفاده از موسیقی، نمونهبردار مجدد برای ۴۴٫۱ تا ۴۸ کیلوهرتز و برعکس با کیفیت بالاتری نسبتبه تبدیل فرکانس دلخواه تولید میشود.
نمونهبرداری مجدد صدا کیفیت و همچنین سرعت را برای دستیابی به آن کیفیت افزایش میدهد. اما نمونهبرداری مجدد میتواند مقدار کمی موجدار شدن باند گذر و نوفه همنامی هارمونیک ایجاد کند و میتواند باعث ازدست رفتن مقداری فرکانس بالا در باند گذار شود، بنابراین از استفاده غیرضروری از آنها خودداری کنید.
روالهای مطلوب برای نمونهبرداری و نمونهبرداری مجدد
این بخش برخیاز روالهای مطلوب را برای کمک به شما در اجتناب از مشکلات مربوط به نرخ نمونهبرداری شرح میدهد.
نرخ نمونهبرداری را متناسب با دستگاه انتخاب کنید
بهطور کلی، بهتر است نرخ نمونهبرداری را متناسب با دستگاه انتخاب کنید، معمولاً ۴۴٫۱ کیلوهرتز یا ۴۸ کیلوهرتز. استفاده از بسامد نمونه بیشتر از ۴۸ کیلوهرتز معمولاً منجر به کاهش کیفیت میشود زیرا برای بازپخش فایل باید از نمونهگیر مجدد استفاده شود.
استفاده از نسبتهای نمونهبرداری مجدد ساده (چندفازهای ثابت درمقابل چندفازهای درونیابیشده)
نمونهبردار مجدد در یکی از حالتهای زیر کار میکند:
- حالت چندفازی ثابت. ضرایب فیلتر برای هر چندفاز ازپیش محاسبه شده است.
- حالت چندفازی درونیابیشده. ضرایب فیلتر برای هر چندفاز باید از دو چندفاز پیشمحاسبهشده نزدیکتر درونیابی شود.
نمونهبردار مجدد در حالت چندفازی ثابت سریعترین است، وقتی نسبت نرخ ورودی به نرخ خروجی L/M (با حذف بزرگترین مقسومعلیه مشترک) M کمتر از ۲۵۶ داشته باشد. برای مثال، برای تبدیل ۴۴۱۰۰ به ۴۸۰۰۰، L = ۱۴۷، M = ۱۶۰.
در حالت چندفازی ثابت، نرخ نمونهبرداری قفل است و تغییر نمیکند. در حالت چندفازی درونیابیشده، نرخ نمونهبرداری تقریبی است. هنگام پخش در دستگاه ۴۸ کیلوهرتز، انحراف نرخ نمونهبرداری عموماً یک نمونه در چند ساعت است. این موضوع معمولاً نگرانکننده نیست زیرا خطای تقریب بسیار کمتر از خطای فرکانس ناشی از نوسانسازهای کوارتز داخلی، رانش حرارتی، یا لرزش (معمولاً دهها ppm) است.
هنگام بازپخش در دستگاه ۴۸ کیلوهرتزی، نرخهای نمونهبرداری با نسبت ساده مانند ۲۴ کیلوهرتز (۱:۲) و ۳۲ کیلوهرتز (۲:۳) را انتخاب کنید، حتی اگر نرخها و نسبتهای نمونهبرداری دیگر ازطریق AudioTrack مجاز باشد.
برای تغییر نرخ نمونهبرداری، بهجای نمونهکاهی از نمونهافزایی استفاده کنید
نرخهای نمونهبرداری را میتوان درحین کار تغییر داد. دقت چنین تغییری براساس میانگیر داخلی (معمولاً چند صد نمونه) است، نه براساس نمونهبهنمونه. میتوان از این برای جلوهها استفاده کرد.
Do not dynamically change sampling rates when downsampling. هنگام تغییر بسامد نمونه پساز ایجاد قطعه صوتی، تفاوتهای حدود ۵ تا ۱۰ درصد از بسامد اصلی ممکن است باعث بازمحاسبه فیلتر هنگام کاهش نمونهبرداری شود (برای سرکوب مناسب مستعارسازی). این کار میتواند منابع محاسباتی را مصرف کند و ممکن است باعث ایجاد صدای کلیک شنیدنی شود اگر فیلتر در زمان واقعی جایگزین شود.
محدود کردن نمونهکاهی به حداکثر ۶:۱
کاهش نرخ نمونهبرداری معمولاً بهدلیل الزامات سختافزاری دستگاه فعال میشود. وقتی از مبدل «نرخ نمونه» برای نمونهکاهی استفاده میشود، سعی کنید نسبت نمونهکاهی را به حداکثر ۶:۱ محدود کنید تا حذف نامطلوبها بهخوبی انجام شود (برای مثال، نمونهکاهی بیشتر از ۴۸٬۰۰۰ به ۸٬۰۰۰ نباشد). طول فیلترها برای مطابقت با نسبت نمونهکاهی تنظیم میشود، اما در نسبتهای نمونهکاهی بالاتر، پهنای باند انتقال بیشتری را فدا میکنید تا از افزایش بیشازحد طول فیلتر جلوگیری کنید. نگرانیهای مشابهی درباره نام مستعار برای فرا نمونهبرداری وجود ندارد. توجه داشته باشید که برخیاز بخشهای خط لوله صوتی ممکن است از کاهش نرخ نمونهبرداری بیشتر از ۲:۱ جلوگیری کند.
اگر نگران تأخیر هستید، نمونهبرداری مجدد نکنید
نمونهبرداری مجدد مانع از قرار گرفتن قطعه در مسیر FastMixer میشود، که به این معنی است که بهدلیل میانگیر اضافی و بزرگتر در مسیر Mixer معمولی، تأخیر بسیار بیشتری رخ میدهد. علاوهبراین، تأخیر ضمنی ناشی از طول فیلتر نمونهبردار مجدد وجود دارد، هرچند این تأخیر معمولاً در حد یک میلیثانیه یا کمتر است، که به اندازه میانگیری اضافی برای مسیر «مخلوطکن» معمولی نیست (معمولاً ۲۰ میلیثانیه).
استفاده از صدای ممیز شناور
استفاده از اعداد ممیز شناور برای نمایش دادههای صوتی میتواند کیفیت صدا را در برنامههای صوتی با عملکرد بالا بهطور قابلتوجهی بهبود بخشد. نقطه شناور مزایای زیر را ارائه میدهد:
- دامنه پویای وسیعتر.
- دقت ثابت در سراسر دامنه پویا.
- فضای بیشتر برای جلوگیری از برش درطول محاسبات میانی و گذرا.
درحالیکه ممیز شناور میتواند کیفیت صدا را بهبود بخشد، معایب خاصی نیز دارد:
- اعداد ممیز شناور از حافظه بیشتری استفاده میکنند.
- عملیات ممیز شناور از ویژگیهای غیرمنتظرهای استفاده میکند، برای مثال، جمع شرکتپذیر نیست.
- محاسبات ممیز شناور گاهی اوقات بهدلیل گرد کردن یا الگوریتمهای ناپایدار عددی، دقت محاسباتی را ازدست میدهند.
- استفاده مؤثر از ممیز شناور نیازمند درک بیشتر برای دستیابی به نتایج دقیق و قابلتولید است.
پیشتر، ممیز شناور بهدلیل دردسترس نبودن یا کند بودن بدنام بود. این موضوع هنوز برای پردازندههای ضعیف و توکار صادق است. اما پردازندههای دستگاههای همراه مدرن اکنون دارای ممیز شناور سختافزاری با عملکردی مشابه (یا در برخی موارد حتی سریعتر) از عدد صحیح هستند. پردازندههای مرکزی مدرن از 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)
برای کسب اطلاعات بیشتر
این بخش برخی منابع اضافی درباره نمونهگیری و ممیز شناور را فهرست میکند.
نمونهگیری
بسامدهای نمونه
- نمونهبرداری (پردازش سیگنال) در ویکیپدیا.
نمونهبرداری مجدد
- تبدیل نرخ نمونهبرداری در Wikipedia.
- تبدیل نرخ نمونهبرداری در source.android.com.
بحث بر سر عمق بیت بالا و کیلوهرتز بالا
- D/A and A/D | Digital Show and Tell ویدیو از کریستوفر «مونتی» مونتگومری از Xiph.Org.
- The Science of Sample Rates (When Higher Is Better - And When It Isn't).
- Audio Myths & DAW Wars
- «بحث» ۱۹۲ کیلوهرتز/۲۴ بیت در مقابل ۹۶ کیلوهرتز/۲۴ بیت - افشاگری جالب
ممیز شناور
صفحههای ویکیپدیا زیر برای درک صدای ممیز شناور مفید هستند:
- عمق بیت صدا
- محاسبات ممیز شناور
- ممیز شناور IEEE 754
- ازدست دادن اهمیت (لغو فاجعهبار)
- پایداری عددی
مقاله زیر اطلاعاتی درباره آن جنبههای ممیز شناور ارائه میدهد که تأثیر مستقیم بر طراحان سیستمهای رایانهای دارند:
- What every computer scientist should know about floating-point arithmetic نوشته دیوید گلدبرگ، Xerox PARC (نسخه ویرایششده).