Ses için çift (64 bit) kayar nokta dikkate alındığında


12

Modern işlemcilerde ses sentezlerken ve işlerken, tek duyarlıklı (32 bit) kayan noktadan başka bir şey kullanmayı ne zaman düşünmeliyiz? Açıkçası, gerçek dünyaya giren ve çıkan ses 16/24 bit, bu yüzden sadece yazılımdaki sinyallerin (hem sesin kendisi hem de filtre katsayıları gibi şeyler) hassaslığından bahsediyorum.

Varsayın:

  • CPU / DSP, hem tek hem de çift hassasiyet için donanım kayan nokta desteğine sahiptir
  • Öncelik, yüksek performans değil kaliteli ses. Örneğin, daha iyi (algısal) kalite sunması durumunda çifte kesinlik dikkate alınacaktır.

Yanıtlar:


9

IEEE float single'ları sadece 24 bit mantis sağlar. Ancak birçok DSP / filtreleme algoritması (birim çemberin yakınında kutuplu / sıfırlı IIR biquad'leri), ara hesaplama ürünleri (akümülatörler vb.) İçin 24 bitten fazla mantis gerektirir, sadece 16'ya yakın sonuçlar elde etmek için veya 24 bit. Bu tür algoritmalar için, FPU'su olmayan DSP'lerde sıklıkla 32, 40 ve 48 bit ölçekli tam sayı akümülatörleri kullanılmıştır.

Ancak birçok geçerli işlemci uygulamasında (PC'ler, akıllı telefonlar vb. İçin), çift duyarlıklı FPU, algoritmanızın 24 bitten fazla ara ürüne ihtiyaç duyması durumunda 32 veya 64 bit ölçekli tam sayı kullanmaya çalışmaktan çok daha hızlıdır.

Veri önbelleğini çöpe atmayı önlemek için, ham veriler kısa tamsayı veya tek duyarlıklı kayan noktalı biçimde olabilirken, yalnızca daha yerel hesaplama çekirdeği daha yüksek bir çözünürlük biçimini kullanabilir. Ancak, ara hesaplama sonuçlarını DSP modülleri arasında paylaşıyorsanız, modüller arasındaki değişim protokolü daha yüksek çözünürlüklü (24 bit mantis'den fazla) veriyolundan veya veri biçiminden de yararlanabilir.


Bu benim peşim olduğum türden bir bilgi. Bir filtre çalışması yapmak için çift ​​hassasiyet gerektiren bir davanın somut bir örneğini verebiliyorsanız, bu cevabı kabul edeceğim , yani, tek bir hassasiyetle kötü (veya en azından oldukça sıradan), ancak tereyağı gibi pürüzsüz çift ​​hassasiyetli.
user1849104

Ayrıca, önbelleği çöpe atarak tam olarak ne demek istiyorsun ? İki kat daha fazla veriye sahip olmanın işleri korkunç derecede yavaşlatacağını mı söylüyorsunuz?
user1849104

Birim çemberinin yakınında kutup / sıfır bulunan IIR bir örnek verilmiştir. Bir önbellek varsa, bu önbelleğe uyan algoritmalar ve çalışma veri kümeleri, sahip olmayanlardan önemli ölçüde daha hızlı olabilir.
hotpaw2

9

CPU / DSP, hem tek hem de çift hassasiyet için donanım kayan nokta desteğine sahiptir.

Gerçekten ne tür bir destekten bahsettiğinize bağlı. X86'da, x87 stil kayan nokta talimatlarını kullanırken, ister tek ister çift hassasiyetle çalışın, tam 80 bit dahili hassasiyeti ve aynı işlem süresini elde edersiniz.

Ancak SIMD talimatlarını kullanırken, 32 bit şamandıraları 64 bit şamandıralardan iki kat daha fazla iş yapabilirsiniz. Bu çok önemli.

Dikkate alınması gereken başka bir şey de bellektir - çift duyarlıklı kullanım, en hızlı önbellek düzeylerine uyan veri miktarını ikiye böler.

Modern işlemcilerde ses sentezlerken ve işlerken,

Ne tür bir sentezleme ve işleme yaptığınıza gelecektir. IIR filtreleri (veya daha genel olarak durum değişkenleri ve / veya geri bildirimi olan herhangi bir şey) içeriyorsa, 32 bit ile kendinizi daha kolay bir şekilde ayağınızdan çekebilirsiniz (katsayı kesilmesi nedeniyle kararsızlık veya düşük kesme hataları). ne yaptığınız hakkında çok düşünün. Bazı filtre topolojileri 32 bit ile kusursuz çalışır.

Her durumda, bu sayısal bir hassasiyet meselesidir - kalite açısından, herhangi bir algısal fark olmayacaktır. Bir donanım ses zincirinin 20 bitten fazla hassasiyete sahip olmasını beklemenin oldukça saçma olduğunu unutmayın (kartın kusursuz bir şekilde yönlendirildiğini ve tüm parçaların ideal olduğunu varsayarsak, Johnson gürültüsünün sınırına koşuyoruz!) - ve bu hassasiyet büyük ölçüde tek hassasiyetli şamandıralarla kaplıdır. Üst düzey bir karıştırma masasındaki sinyal yolu, tek hassasiyetli şamandıralardaki aritmetik işlemlerin niceleme gürültüsünden birkaç büyüklükte daha fazla bozulmaya sahip olan 50'li op-amp'e sahiptir.


SIMD talimatları ile tek bir hassasiyet kullanmanın, çift ​​hassasiyet üzerinde size her zaman yaklaşık iki kat daha fazla performans vereceğini söyleyebilir miyiz?
user1849104

Önceki yorumu artık düzenleyemediğim için: SIMD komut setlerini (doğrudan) kullanma fırsatım olmadı. Tek bir hassasiyet kullanmak ve iki kat performans elde etmek mümkün müdür? Yoksa gerçeklik yoluna giriyor mu?
user1849104

6

Algoritmanızın sayısal gereksinimlerini bilmeniz ve buna göre hassasiyeti seçmeniz gerekir.

Burada matematiği yapalım: 32 bitlik kayan bir noktanın 24 bitlik mantis ve 8 bitlik bir üssü vardır. Bu, yaklaşık 1540 dB dinamik aralıkta yaklaşık 150 dB sinyal / gürültü oranı sağlar. Çoğu şey ses için bol. Çift hassasiyet size kabaca iki kat daha fazla verir.

Her algoritmanın sayısal hassasiyet için belirli gereksinimleri vardır. Eğer bildiğim tüm ses algoritmaları düzgün tasarlanmışsa 32-bit kayan nokta ile iyi para cezası. "düzgün tasarlanmış" anahtar kelimedir. Örneğin, II IIR çift dörtlü filtreden doğrudan olarak uygulanan 44.1kHz'de örneklenmiş 40-200 Hz'den 6. sıra bant geçişi gerçekten 32-bit'de bazı gürültü problemlerine sahip olacaktır. Bununla birlikte, transpoze form II veya doğrudan form I filtre olarak mükemmel çalışır.

Matlab'ın residuez () işlevini kullanarak aynı bant geçiren filtrenin kısmi kesir genişlemesini denerseniz, çift kesinlikte bile kötü sonuçlar elde edersiniz. Yine, söz konusu giriş verileri için algoritmanın sayısal gereksinimleri, çift kesinlik değerinin sunduklarını aşmaktadır. Bunu düzeltmenin anahtarı hassasiyeti körü körüne yükseltmek değil, daha iyi bir algoritma kullanmaktır.

Son olarak, kayan (32 bit veya 64 bit) neyin savunmasız hale geldiğine bir göz atalım: Muazzam dinamik aralığınız var, yani sinyali 200dB'ye kadar azaltabilir, 500dB'ye kadar yükseltebilir, tekrar 300dB'ye kadar azaltabilir ve tam olarak başladığınız yere ulaşabilirsiniz hassasiyette neredeyse hiç kayıp olmadan. Yani bu değil. Kayan nokta, boyut olarak çok farklı numaralar eklemekte sorun yaşıyor. Küçük bir sayı eklemenin hiçbir fark yaratmadığı bir nokta vardır, yani 1 + dx = 1 elde edersiniz. Bu "dx" sayısı 32 bit kayan nokta için yaklaşık 1.2e-7 ve 64 bit için 2.2e-16'dır. Algoritmanız, çok büyüklükte sayılar eklemeyi veya çıkarmayı içeriyorsa, sorun yaşayabilirsiniz.

Bunun için iyi bir örnek, daha önce bahsedilen Doğrudan Form II filtresidir: Doğrudan II filtresinden (bkz. Örneğin, https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) temel olarak giriş değişkenlerini filtreleyerek durum değişkenlerini hesaplar ilk önce sadece kutup aktarım işleviyle ve ardından çıktıyı oluşturmak için sıfırlarla filtreleme yapın. Kutuplar birim daireye yakınsa, sadece kutup aktarım işlevi çok, çok büyür. Durum değişkeni girişten çok daha büyük olabilir (80db ila 100dB daha büyük) ve durum değişkenlerini girişle toplamak çok fazla gürültü yaratır.

Buradaki çözüm, aktarılmış bir Form II veya doğrudan Form I filtresine gitmektir. Analiz, durum değişkenlerinin giriş / çıkıştan daha sonra 12dB'den veya ondan daha büyük olamayacağını gösterir, bu nedenle sorun büyüklüğü uyumsuzluğu ilk etapta gerçekleşmez.


2

Tek hassasiyete göre çifte kesinlik elde etmenin iki avantajı vardır: artan menzil ve daha iyi çözünürlük. Artan aralık uygulamanızda herhangi bir fark yaratırsa çok şaşırırım. Eğer öyleyse, muhtemelen ölçeklemenizde bir sorun var.

Eğer bir iyileşme olursa bu kararda olur. Daha iyi çözünürlük daha az niceleme gürültüsü demektir . Nicemleme gürültüsü, diğer tüm gürültü kaynaklarınızla aynı seviyeye yakın olmadığı sürece, muhtemelen herhangi bir fark yaratmaz. Gürültünün ne kadarının nicemleme hatasından geldiğine dair bir fikir edinmek için gürültü ve sinyal seviyeleriniz üzerinde bazı analizler yapabilirsiniz, ancak her ikisiyle birlikte uygulayana kadar bir fark yaratıp yaratmayacağından emin olamayacaksınız ve fark yaratıp yaratmadığına bakın.


2

Üretim ve oluşturma (16/24 bit tam sayıya dönüştürme) arasında çok fazla işlem gören sentezlenmiş sesle çalışıyorsanız, makinenizin sahip olduğu en iyi sayısal hassasiyetle çalışmanın avantajlarından yararlanacaksınız.

Tamsayılarla kayan nokta sayıları arasında temel bir ayrım yapmak da önemlidir. Çift kesinlikli kayar nokta (64bit), 64 bitlik bir tam sayıdan farklıdır ve kullandığınız yazılım araçlarına bağlı olarak, yazılımdaki keyfi hassasiyetli tamsayılarla bile çalışabilirsiniz. Sesleri üretmek yerine kaydetmek zorunda olsaydınız bu önemli olurdu (bildiğim kadarıyla, AD dönüşümü her zaman örneklenen sesleri tamsayı formatında kaydeder).

Bundan tam olarak emin olamıyorum, ancak sesinizi zaten kayan noktada oluşturursanız, daha yaygın yapay nesneler tanım gereği bulunmaz ve çok daha fazla "ses kalitesi" ile işleyebilirsiniz. Belki de ses örneklerini sadece jeneratörün kendisine bazı efektler uyguladıktan SONRA bile üretebilirsiniz. Herhangi bir potansiyel yapay nesneyi gerçekten tanıtacağınız tek an, örneğin .WAV gibi bir tamsayı dosya biçiminde çıktıya dönüştürmektir.

Aslında, çoğu makine bugünlerde doğal bir "çift" (64bit) hassasiyete sahip olduğundan, artık 32 bit ile çalışmak için bir neden görmüyorum ...

Umarım yardımcı olur!


3
SIMD kullanmadığınız sürece, artık 32 bit ile çalışmak için bir neden göremiyorum ...
18'de pichenettes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.