Nasıl (mümkünse) FFT benzeri bir şekilde rasgele bir ses örneğinin (genellikle müzik) frekans bileşenlerini ayıklamak için çalışıyorum, ama FFT algoritması üzerine araştırma, ben bazı acı çekiyor öğreniyorum bu amaçla ciddi kısıtlamalar.
FFT'nin sunduğu 3 sorun var:
FFT bin çözünürlüğü pencere boyutunuza eşdeğer olduğundan, oldukça makul bir doğruluk elde etmek için (1 Hz diyelim), mantıksız derecede uzun bir pencereye ihtiyacınız var (diyelim 1 saniye). Bu, geçici veya yeni girilen frekansları hızlı bir şekilde algılayamayacağınız anlamına gelir. Ayrıca, sorunun daha hızlı bir CPU ve daha yüksek bir örnekleme hızı ile çözülemeyeceği anlamına gelir - kısıtlama kendiliğinden zamana bağlıdır.
İnsanlar frekansı logaritmik olarak algılar, ancak FFT kutuları doğrusal olarak aralıklıdır. Örneğin bizim işitme düşük ucunda 20Hz bir farktır büyük yüksek ucunda 20Hz bir fark algılanamaz oysa. Dolayısıyla, düşük frekanslarda ihtiyacımız olan doğruluğu elde etmek için, yüksek frekanslarda ihtiyacımız olandan çok daha fazlasını hesaplamamız gerekir.
Bu sorunların bazıları, FFT kutuları arasında enterpolasyon uygulanarak çözülebilir. Bu, çok müzikal ses için işe yarayabilir, çünkü frekanslar genellikle birbirinden çok uzak olacak ve bu nedenle 1'den fazla frekans bir çift bölmeye sızmayacaktır. Ancak bu, özellikle vurmalı çalgılar gibi harmonik sesler için her zaman böyle olmayacaktır. Yani enterpolasyon gerçekten sadece bir tahmindir.
DFT / FFT algoritmasından anladığım kadarıyla, çıkışlar (depo genlikleri) her bir kutunun frekansındaki sinüs / kosinüsün etkili bir şekilde korelasyonudur. Eğer algoritma, bin frekansları doğrusal olmayan şekilde aralıklı olacak şekilde yeniden tasarlanabiliyorsa (yani farklı sinüs / kosinüs setini ilişkilendiririz), o zaman tüm frekanslarda psikoakustik olarak eşit çözünürlük elde edebileceğimizi vurgular. Bu mümkün mü, yoksa ilgili matematik hakkındaki eksik anlayışım üzerine kurulu bir rüya mı?
Sanırım ilgilendiğim her frekansta sinüsleri / kosinüsleri ilişkilendirerek problemi kaba kuvvetle de çözebilirim. Burada matematik konusunda fazla ipucu yok. Mümkün mü? Ne tür bir verimlilik? Sorunumu çözer mi?
Bir sinyalin daha doğru, gerçek zamanlı, frekans ayrışmasını sağlamanın farklı bir yolu var mı? CPU verimliliği bir endişe kaynağıdır, ancak büyük bir endişe kaynağı değildir - kısmen teorik olarak yapılıp yapılamayacağı ile ilgileniyorum. Bununla birlikte, modern bir masaüstü makinesinde gerçek zamanlı olarak uygulanabilir bir şey ideal olacaktır.