Düşük Seviyeli Ses Motoru Ses Verilerini Yeniden Biçimlendirme - Örnek Hızı ve Bit Derinliği Dönüşümü
Öncelikle, az sayıda düşük seviyeli ses programlama öğreticisi var gibi görünüyor, bu yüzden iyi kaynaklardan haberdar olan biri varsa çok minnettar olurum. Şimdi elimizdeki konuya gelelim!
Geliştirmeye çalıştığım ses motoru için WASAPI kullanıyorum ve okunan ses dosyası verilerini ses cihazının almaya hazır olduğu bir biçime yeniden biçimlendirmede güçlükler yaşıyorum. Özellikle, okuma ses dosyasının örnekleme hızını ve bit derinliğini anında cihazın istenen formatına nasıl dönüştürebileceğimi merak ediyorum. Doğrusal enterpolasyonun kullanıldığı bir örnek gördüm, ancak başka bir yerde böyle bir filtrenin takma ad gibi çok fazla yapaylık sunduğunu okudum, bu yüzden yine gerçek zamanlı bir uygulamada ses verilerini yeniden biçimlendirmek için hangi pratik algoritmaların olacağını merak ediyorum.
Yanıtlar
Sinc enterpolasyonu, örneklemeden önce başlangıçta düzgün bir şekilde bant sınırı olan verilere hiçbir örtüşme yapıtları getirmez. (Ancak, bir Sinc veya Dirichlet çekirdeğinin sonsuz bir süreye sahip olması nedeniyle, biraz değiştirilmesi gerekir.)
Yeniden yapılanmanın neden işe yaradığına ve nasıl enterpolasyon yapılacağına dair kanonik bir referans burada: https://ccrma.stanford.edu/~jos/resample/
Burada Basic'te basit bir uygulamam var: http://www.nicholson.com/rhn/dsp.html#3
Diğer yaygın yöntem, düşük geçişli filtreli tamsayı oranı yukarı örneklemedir ve ardından uygun iki oranla düşük geçişli filtrelenmiş tamsayı oranı altörneklemesidir. Diğer bir yaygın yöntem, çok fazlı bir FIR filtre bankası (pencereli Sinc (veya başka şekilde optimize edilmiş FIR filtreleri) enterpolasyon çekirdeklerinin birden çok fazından üretmektir. Diğer bir yaygın yöntem, Sinc çekirdeğinin tümseklerinin her birinin polinom interpolatörlerini kullanarak bir Farrow filtre bankası oluşturmaktır. .
Niceleme gürültü tabanınızı spesifikasyonunuz ne olursa olsun altında tutmak için yeterli bit aritmetik ara değer taşımanız gerekir.