روی Sample های PCM باید عملیاتی انجام داد تا به فرمت دلخواه برسیم.
ساده ترین کار در اینجا تبدیل بین Sample های 8 بیتی 16 بیتی و 32 بیتی است. به شکل زیر:
ُSample32 := Sample16 shl 16
Sample32 := (Sample8 xor $80) shl 24
Sample16 := Sample32 shr 16
Sample16 := (Sample8 xor $80) shl 8
Sample8 := (Sample16 shr 8) xor $80
Sample8 := (Sample32 shr 24) xor $80
برای تبدیل مونو به استریو میتوانید هر sample را 2 بار تکرار کنید (چون سورس مونو هست برای Left و Right همان صدا گذاشته می شود.)
برای تبدیل استریو به مونو میتوانید Left و Right را باهم جمع کنید با در نظر گرفتن maximum. مثال برای 16 بیتی:
MixedSample := EnsureRange(LeftSample+RightSample,-32768,32767)
در تمامی سورسهای C و Delphi که من در Net دیده ام میکس صدا با این روش انجام شده. ایراد آن اینست که باعث بالا رفتن gain صدا میشود و آنچه مسلم است ابزارهایی مثل AdobeAudition یا DirectSound الگوریتمهای بهتر و درست تری برای این کار دارند.
برای تبدیل SampleRate که من شخصا فکر میکنم کار سختی هست الگوریتمهای متفاوتی وجود دارد که البته روی کیفیت صدا هم بعد از Resample تاثیر گذار هست. در ساده ترین و کم کیفیت ترین الگوریتم به نسبت بعضی از Sample ها را برای DownSampling حذف میکنند یا برای UpSampling تکرار میکنند. اما قطعا این روش مطابق اصول مهندسی صدا نیست. من سورس درست حسابی برای UpSampling یا DownSampling در net تا حال به چشمم نخورده اگر پیدا کردید ممنون میشم لینکشو اینجا قرار دهید تا استفاده کنیم.
در ضمن برای تبدیلات می توانید از ACM هم استفاده کنید ولی ACM همه مدل تبدیل را پشتیبانی نمیکند. مثلا نمیتوانید با آن صدای 48000 هرتز را به 44100 یا 22050 هرتز تبدیل کنید اما تبدیل به 24000 یا 12000 و بالعکس را پشتیبانی میکند.