Verileri ölçeklendirerek genliği (ve muhtemelen FFT kalitesini) artırmak geçerli midir?


10

Mark Borgerding'in "KISS FFT" sürümünü kullanıyorum. 16 bitlik sabit nokta giriş değerleri dizisini kabul eder ve 32 bit kayan sonuç dizisi oluşturur.

Giriş genliklerinin düşük olması durumunda, kayan sonuç sonuçlarının çoğunun sıfır geldiğini keşfettim, ancak girişleri ölçeklendirirsem (örneğin, faktör 16'ya göre), daha az çıkış değerinin sıfır olduğunu ve bu nedenle çıkışın daha fazla detay. (Benim amacım için çok önemli değil, ama tutarlılık için elde edilen şamandıra değerlerini aynı ölçeklendirme faktörüne bölerim.)

Her neyse, bu işe yarıyor gibi görünüyor, daha önce neredeyse tüm sıfırlardan bir tampon aldım, bir sonuç üretmek açısından, ama geçerli bir yaklaşım olmamasının bir nedeni olup olmadığını merak ediyorum.

(Bu yaklaşımın verilerde çok daha fazla "kabalık" / ayrıntı düzeyi olduğu ve özellikle normalde mevcut olacak düşük seviyeli gürültünün olmadığı anlamına geldiğini unutmayın. Enjekte etmenin akıllıca olup olmayacağını merak ediyorum. girişteki sıfır değerlerini değiştirmek için bazı düşük seviyeli gürültü.)


"Girişteki sıfır değerlerini değiştirmek için düşük seviyeli bir gürültü enjekte etmenin akıllıca olup olmayacağını merak ediyorum." = En.wikipedia.org/wiki/Dither
Endolit

Yanıtlar:


7

Bu geçerli bir yaklaşım olabilir. Sabit nokta (yani tamsayı) aritmetiğini kullanırken sıkça ortaya çıkan çok pratik bir sorunu gözlemliyorsunuz (her ne kadar kayan noktada da olabilir). Hesaplamaları yapmak için kullandığınız sayısal biçim, hesaplamalarınızdan kaynaklanabilecek tüm değer aralığını ifade etmek için yeterli hassasiyete sahip olmadığında, bir tür yuvarlama gerekir (örneğin, kesme, en yakın yuvarlama vb.) ) üzerinde. Bu genellikle sinyaline ek bir nicemleme hatası olarak modellenir .

Bununla birlikte, bazı algoritma ve yuvarlama şeması kombinasyonları için, giriş sinyalinin büyüklüğü çok düşük olduğunda, gözlemlediğiniz şeyi elde etmek mümkündür: çok sayıda sıfır çıkış. Temel olarak, işlem dizisinin bir yerinde, ara sonuçlar sıfır olmayan bir seviyeye nicelemek için gerekli eşiği kırmayacak kadar küçük hale gelmektedir. Değer daha sonra sıfıra yuvarlanır ve bu genellikle çıktıya ileri doğru yayılabilir. Sonuç, belirttiğiniz gibi, çok sayıda çıkış sıfırları üreten bir algoritmadır.

Peki, verileri artırarak bu sorunu çözebilir misiniz? Bazen (her zaman işe yarayan çok az teknik vardır!). Giriş sinyaliniz, sayısal biçimin tam ölçeğinin altında bir değerle sınırlanmışsa (-32768 ile +32767 arasında çalışan 16 bit işaretli tam sayılar), giriş sinyalini kullanılabilir aralığı tam olarak kullanmak için ölçeklendirebilirsiniz. o. Herhangi bir yuvarlama hatasının büyüklüğü ilgili sinyale kıyasla küçüldüğünden, bu, yuvarlama hatasının etkilerini azaltmaya yardımcı olabilir. Bu nedenle, tüm çıktılarınızın algoritmaya dahili olarak sıfırlara yuvarlanması durumunda, bu yardımcı olabilir.

Böyle bir teknik size ne zaman zarar verebilir? Algoritma hesaplamalarının yapısına bağlı olarak, giriş sinyalini büyütmek sizi sayısal taşmalara maruz bırakabilir. Ayrıca, sinyal, algoritmanın yuvarlama hatasından daha büyük arka plan gürültüsü veya parazit içeriyorsa, çıktıda elde ettiğiniz şeyin kalitesi, hesaplamada ortaya çıkan hata ile değil, genellikle çevre tarafından sınırlandırılır.


Ölçekleme için oldukça iyi çalışan dinamik bir teknik kullanıyorum. Ve şansın sahip olacağı gibi, aşırı geçici durumlar gürültü olarak kabul edilir ve yine de kırpılır, bu nedenle ara sıra kırpma bir sorun olmamalıdır. Girişin ölçek faktörüne bölerek çıktıyı "kireçten arındırmak" için geçerli olduğunu düşünüyor musunuz?
Daniel R Hicks

1

Bununla başa çıkmanın en kolay ve en aptal yolu, verileri FFT'den ÖNCE kayan noktaya dönüştürmek ve bir kayan nokta FFT kullanmaktır. Bu yaklaşımın tek dezavantajı, daha fazla işlemci ve bellek tüketebilmenizdir. Çıktınız zaten kayan nokta olduğundan, muhtemelen çok az pratik fark vardır.


Bu projeyi halihazırda mevcut FFT algoritması ile teslim ettim ve bu noktada onunla uğraşmak istemiyorum. Ve tüm bunlar bir telefonda gerçek zamanlı olarak devam ediyor, bu yüzden performans kesinlikle bir sorundur.
Daniel R Hicks

Anladım. FFT dahili sabit veya kayan nokta olup olmadığını biliyor musunuz? Düzeltildiyse, kırpma, taşma ve taşma konusunda endişelenmeniz gerekir
Hilmar

Dokümantasyon ve yorum yokluğunda olağanüstü, ancak kodda çok sayıda ints ve değerli birkaç yüzer ve çiftler görüyorum. 16 bit'ten 32 bit'e veya kayan noktaya geçiş için ham # ifdef çerçevesini içeriyor gibi görünüyor, ancak çerçeve uzun zamandır devre dışı bırakıldı.
Daniel R Hicks

Bir iPhone (ARM + NEON CPU), C'deki bir tam sayı
FFT'den
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.