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.