Gerçek zamanlı insan hassasiyetiyle ses sinyalinin frekans bileşenlerini çıkarmanın en etkili yolu


14

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:

  1. 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.

  2. İ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.

  3. 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.


3
Hangi sorunu çözmeye çalışıyorsun? f0 algılama, çoklu-f0 algılama (transkripsiyon için), akor tanıma, tını modelleme ...? Bu sorunların bazıları için geçici çözümler vardır. Evirilebilirliği önemsiyor musunuz (bir analiz-> dönüşüm-> resentez çerçevesinde kullanılacak)?
pichenettes

Çözmeye çalıştığım problem kuşkusuz açık uçlu. Listenizin çoğunu kapsayan dijital müziğe genel bir ilgim var. Ama belirsizlik neler yapılabileceğini bilgisi benim eksikliği nedeni kısmen ve hangi spesifik standart endüstri veya söz her sorunu çözmenin en iyi yolu (Bu soruyu sordum kadar hep FFT olduğunu kabul ediyorum vardır o ). Ancak listenizdeki en çok ilgimi çeken öğe tını modellemesi. Ayrıca, bir kayıtta eşzamanlı olarak karmaşık tınıların çıkarılmasının yollarını bulmak istiyorum. Resentez heyecan vericidir. AI algoritmaları ilgi çekicidir.
bryhoyt

Geçmişte çözmeye çalıştığım ve daha sonra tekrar denemek istediğim daha spesifik bir sorun: Bir mikrofonla kaydedilmiş bir grup oyuncu veya şarkıcıyla gerçek zamanlı olarak "doğaçlama" yapmak için bir program yazmak istiyorum. Bilgisayarımın benimle bir sinüs "ıslık çalması" gibi farkettim, gecikmeli ve ayarsız. Böyle bir doğaçlamanın doğru bir şekilde ayarlanması ve vurulması hayati önem taşır. Elbette, bunu başarmanın başka yolları da var (oyuncular dijital enstrümanlar çalıyor veya bilgisayara önceden belirlenmiş bir akor ilerlemesi vb. Gibi "içeriden bilgi" veriyorlar) ama bu benim amacım değil.
bryhoyt

"algoritma, bin frekanslarının doğrusal olmayan şekilde aralıklandırılması için yeniden tasarlanabilir, daha sonra tüm frekanslarda psiko-akustik olarak eşit çözünürlük elde edebiliriz." Kesintisiz bir Morlet dalgacık dönüşümü gibi geliyor
endolith

Yanıtlar:


5

XxwnNk/N

hn=wnej2πnkN

1/Nk

fkfk+1=21/12fk21/1212fk

CQT'nin uygulamalarını burada ve orada bulabilirsiniz, yakın zamanda Prof. Klapuri'nin son zamanlarda oldukça iyi bir tersi ile geliyor burada bulabilirsiniz . Telecom ParisTech'teki Ses grubunun da Prof. Prado tarafından bir uygulaması var , ancak henüz denemedim.

[Brown91] J. Brown, "Sabit Q Spektral Dönüşümünün Hesaplanması", Amerika Akustik Derneği Dergisi, 1991, 89, 425-434

20121014 EDIT: (bryhoyt's) sorularınıza bazı cevaplar ve yorumlar.

  1. Sadece ana soruya kendi yorumlarınızla ilgili genel fikirler: Bana göre, ele alınması oldukça önemsiz pek çok uygulama ile ilgileniyorsunuz. "Timbre modelleme" bana ses perdesi veya frekans çözünürlüğü veya hassasiyetinin çok fazla olmadığı konuşma tanıma veya benzerleriyle daha alakalı geliyor (MFCC'lerin genellikle nasıl hesaplandığını düşünün).

    Ayrıca , otomatik doğaçlama ve eşlik etme konusunda kaç tane üst düzey araştırmacının ( F. Pachet ve IRCAM, Fransa'daki repmus ekibi ) otomatik doğaçlama ve eşlik etme konusunda çalıştığını düşünün : görev imkansız değildir, ancak birçok alanda uzmanlık gerektirir. Özetlemek gerekirse, tipik bir sistemin insan işitsel sistemini taklit etmesi (en azından), ses / müzik / perde / ritim algısını uygulaması, müzik teorisini bilmesi ve önceki tüm adımların tahminlerine dayanarak kararlar alması gerekir. Fourier dönüşümü veya herhangi bir sinyal gösterimi, nihai hedefe doğru sadece (küçük) bir adımdır - ve potansiyel olarak, bence, şimdiye kadar en iyi anlaşılan.

    Bununla birlikte, herkesin gerçekte olanın çok ötesine bakma olasılığı var ve bunu basit, böylece zarif bir çözümde parçalayabilirsiniz! Tamamlandığında bu konuda yayın yapmayı unutmayın! :-)

  2. 44kHz'de 0.1s'lik bir numune, çok çeşitli frekansları içermek için yeterlidir

    Fs/N=44100/4410=10Hz

  3. FFT bunu düşük ve yüksek frekanslar için algılayamaz, ancak diğer algoritmaların şunları yapabileceğini söylüyorsunuz: ödünleşim nedir?

    Kısa cevap: melodi tahmini ile ilgili tezimi okuyun!

    Biraz daha ayrıntılı olarak açıklamak gerekirse: birçok perde tahmin algoritması, işlenecek sesler üzerindeki varsayımlar sayesinde FT'nin sınırlarının ötesine geçer. Doğal seslerden gelen notların (insan sesi, obua, saksafon, piyano ...) tek sinüzoidlerden daha karmaşık olmasını bekliyoruz. Çoğu tiz ses az çok harmoniktir, yani frekansları temel frekansın katı olan sinüzoidlerin toplamı olarak modellenebilir.

    Bu nedenle, sahayı tahmin ederken, spektral toplamlar, spektral ürünler veya otomatik korelasyon fonksiyonları gibi tespit fonksiyonlarını kullanan yöntemler ile bu harmonikleri dikkate almak yararlıdır. Birisi yakın zamanda ilgili bir konu başlattı .

  4. Ödünleşmeler nelerdir? Daha spesifik olarak, makul derecede kısa bir pencere için ne düzeyde frekans doğruluğu bekleyebilirim? (CQT'deki pencere boyutunun değişken olduğunu anlıyorum - ne kadar çok?) Daha da spesifik olarak, yakl. 0.005s pencereli% 0.5 frekans farkının hedefi?

    Daha önce de belirtildiği gibi, 0.005s'lik bir pencereyle, 200Hz "frekans sızıntısı" gibi bir şey bekleyebilirsiniz. Bu gerçekten sadece 200Hz'den daha yakın frekanslara sahip 2 sinüzoidiniz olduğunda, FT'nin 2 farklı sinüzoid olduklarını gösteremeyeceği bir problemdir. Eh,% 0.5'inizden çok uzaktayız (bu arada, bir yarı ton frekansın% 6'sında!) Ve 0.005s gerçekten amacınız için biraz küçük. Bununla birlikte, her 0.005 saniyede bir tahmin sağlamak istiyorsanız, genellikle konuşma / müzik işlemede olduğu gibi daha uzun çakışan kareleri işleyebilirsiniz. Aslında istediğin bu mu?

    Nk=Fsfk(21/B1)
    BB=48fk=100Hzyaklaşık 0.7s uzunluğunda pencereler gerektirir. O zaman zamansal çözünürlüğü biraz kaybettiğimizi söyleyecek bir şey yok ... Ama daha önce de belirtildiği gibi, bu sadece sesin yapısını unutursak sorun olur. Buna ek olarak, psikoakustik, 500Hz'in altında, insanların sinüzoitleri gerçekten çok iyi ayırt etmediğini düşünür: insanlar bile orada zorlanır. Tabii ki, bilgisayarlarımızın bizden daha iyisini yapabileceğini umabiliriz, ancak burada zor bir sorunla karşı karşıyayız!

    Sonunda, bir sesin zaman-frekans temsilini hesaplamanın diğer yollarının mevcut olduğunu, örneğin gammatone filtre bankalarını göz önünde bulundurun. Daha önce bahsettiğim CQT'nin avantajı, hem dönüşüm hem de ters çevirme için yazılımın olmasıdır. Kişisel olarak, sadeliği için hala STFT'ye bağlı kalıyorum ve şimdiye kadar, kaynak ayırma için bile düşük frekanslarda daha iyi bir çözüme ihtiyaç duymadım.

    [Schoerkhuber2010] Schoerkhuber, C. ve Klapuri, A., "Müzik işleme için Constant-Q dönüştürme araç kutusu", 7. Ses ve Müzik Bilişim Konferansı, Barselona, ​​İspanya, 2010.


Küçük bir açıklama: CQT, 1. ve 2. noktalarınızın endişelerini çözmenize yardımcı olabilir, ancak 3. noktaya değil. 3. noktaya gelince, her zaman zaman ve frekans çözünürlüğü arasında bir denge vardır ve düşük bir frekans çözünürlüğü istiyorsanız frekans bileşenlerinde, zaman çözünürlüğünü kaybetmek için büyük olasılıkla kabul etmeniz gerekir. Şimdi, saha tahmini için başka çözümler olabilir, eğer ilgilenirseniz doktora
tezimde

Tam olarak anlamıyorum. Ücretsiz bir şey elde edemeyeceğinizi biliyorum - bir algoritmanın en düşük frekansın en az birkaç periyodu boyunca iyi bir çözünürlükte örneklenmemiş frekansları doğru bir şekilde algılamasını bekleyemem. Ancak 44kHz'de 0.1s'lik bir örnek, bir insanın doğru bir şekilde ayırt edebileceği geniş bir frekans aralığı içermek için yeterlidir (göreceli olarak - "burada 5.", "düz bir azaltılmış 4." vb.) orada bir yerlerde. FFT bunu düşük ve yüksek frekanslar için algılayamaz, ancak diğer algoritmaların şunları yapabileceğini söylüyorsunuz: ödünleşim nedir?
bryhoyt

Yukarıdaki tüm mükemmel cevaplardan CQT, sorduğum soruya en iyi şekilde benziyor. Ödünleşmeler nelerdir? Daha spesifik olarak, makul derecede kısa bir pencere için ne düzeyde frekans doğruluğu bekleyebilirim? (CQT'deki pencere boyutunun değişken olduğunu anlıyorum - ne kadar çok?) Daha da spesifik olarak, yakl. 0.005s pencereli% 0.5 frekans farkının hedefi? (Bu, bir insanın bir şeyin melodi dışında veya vuruş dışında işitmeye ne zaman başlayabileceğine dair kaba
tahminim

5

İlk olarak, klasik kısa vadeli Fourier dönüşümü yaklaşımıyla, enterpolasyona alternatif vardır - özellikle anlık frekansı kurtarmak için faz bilgilerini kullanan teknikler ( Bu soruya bakın ); FFT boyutunun artması. Dezavantajı, doğru bir şekilde söylediğiniz gibi, sistemin bitişik zirveleri ayırt etme yeteneğini artırmamanızdır - ancak bu, FFT bin endeksinin merkezi frekansını kullanmaya kıyasla zaten büyük bir gelişme.

srFFT_size

İşe yarayan başka bir kaba kuvvet yaklaşımı daha vardır: sinyallerinizi pencereli karmaşık üstel (Gabor dalgacıkları) ile "araştırın". Bunlar bir merkez frekansı, bir merkez zaman ve bir bant genişliği (dalgacığın zamana veya frekansa nasıl yayıldığını ölçer) ile karakterizedir. Sinyaliniz ve bu dalgacıklar arasındaki birçok, çok, çok sayıda korelasyonu, istediğiniz kadar zaman ofseti, frekans ve bant genişliği ile değerlendirmeniz gerekir. Sonuç, her zaman aralığı ve her frekans bandı için en uygun pencere boyutunun seçildiği çok esnek bir "döşenmiş" STFT ile aynı olacaktır. Hesaplama maliyetinin yanı sıra, olumsuz bir algoritma ve nedensel bir algoritma olmaması (sözlüğünüzdeki en uzun dalgacık kadar önceden çok sayıda örnek bilmeniz gerekir). Bu teknikleri denemek istiyorsanız,MPTK .

k

  • k
  • Beyaz gürültü varlığında iyi performans gösterirler - bu, analizden önce sinyalin beyazlatılmasını gerektirir; Bir filtre bankasının ayrı kanallarında analiz yapmak da yardımcı olur.

Bunlar hesaplama açısından pahalıdır, ancak model siparişleri ve / veya gürültü düşükse kısa pencerelerle çevrimiçi çalışabilirler.


4

Frekans mı, zift mi? İnsan zift algısı üzerine tonlarca araştırma makalesi ve kitap var. Ancak, IIRC, insanlar temel bir adım olmadıkça frekansları doğru bir şekilde "çıkarma" konusunda kötü olma eğilimindedir. Ve bir "kritik bant" içindeki çoklu frekans zirveleri gürültü olarak algılanma eğilimindedir. Dolayısıyla, "insana yakın doğruluk" içeren herhangi bir yöntemin, aynı zamanda bazı insan algı tahmin tahminlerini de içermesi gerekebilir.

FFT, dikeylik ve tersine çevrilebilirlik gerekmedikçe pek çok amaç için uygun olmayan bir filtre bankasıdır. MEL frekans filtre bankası gibi bu iki şeye ihtiyacınız yoksa (ve insan algısı açıkça gerektirmiyorsa) diğer filtre bankaları mümkündür. Bir frekans tepe noktası bir MEL frekans filtre bankası tarafından tanımlandıktan sonra, FFT enterpolasyonu veya faz vocoder teknikleri ile daha fazla analiz, izole edilmiş herhangi bir spektral frekans tepe noktasının bir frekans tahmininin düzeltilmesi için yararlı olabilir.

FFT ile karşılaştırıldığında aynı zaman alanı verisi boyunca kullanılan bu filtreleme tekniklerinin hiçbiri tarafından başka bilgi toplanmadığını unutmayın. Gerçekte olan, insan işitme sisteminin "yanlışlığı" veya anormallikleriyle daha iyi eşleşecek bilgi kaybı olabilir.

Ve bir dizi frekanstan perde tahmini tamamen farklı bir sorundur, yine odyoloji ve benzeri kitaplarda birçok araştırma makalesi ve bölüm içeren bir konudur.

Performansla ilgili sorunuzun son kısmı kırmızı bir ringa balığı olabilir. Bir bugünlerde bir cep telefonu işlemcisi üzerinde düzinelerce FFT ve düzinelerce farklı filtre bankası yapabilirsiniz. CPU satıcılarından temin edilebilen çok verimli FFT kütüphaneleri göz önüne alındığında, 1000 "fazla" çöp kutularına sahip bir FFT, önemli ölçüde daha küçük ama daha saf kodlanmış bir filtre bankasından daha verimli olabilir.


Çok bilgilendirici cevap, teşekkürler. Adım ve frekans arasındaki farkın farkındayım, ancak cevabınız, insan gereksinimlerinin belirli gereksinimleri karşılayan sese ne kadar bağlı olduğunu vurgulamaya gerçekten yardımcı oldu. Uyum bilgime göre, insanların bir adım temel olmayan frekansları çıkarmada oldukça kötü olduğu doğru. Ayar içi aralıkları birbirinden ve ayar dışı aralıklardan (ünsüz aralıklar uyumsuzluktan daha kolay) doğru bir şekilde ayırt edebilirim. Ama iki ayar dışı aralığı ("düz", "çok düz", "keskin" vb. Hariç) ayırt etmekte zorlanıyordum.
bryhoyt

2

Birçok alternatif var, ama ne yaptığınıza bağlı. Fiziksel olarak, kulaklarımızın FFT'den daha çok paralel bir filtre bankası gibi olduğunu ve onlara iyi zaman çözünürlüğü verdiğini ve "odaklama" adı verilen bir işlemin onlara iyi frekans çözünürlüğü verdiğini iddia ediyorum. Yani, bazı durumlarda, teorik olarak bir filtre bankası kullanabilirsiniz, ancak bu çok fazla işlem gerektirir, işlemek için çok fazla veri bırakır.

Dalgacıkların özellikle etkili ve ilgili filtreler kümesi olarak görüntülenmesi mümkündür. Müzik ve ses analizi için dalgacıklarla ilgili sorun, genellikle sadece 1 oktav çözünürlüğü vermesidir (bu konuda çeşitli şeyler yapabilmenize rağmen, dalgacıkların sesde özellikle yararlı olmadığını görmedim).

Diğer bir yaklaşım da örtüşen FFT pencerelerini kullanmaktır. Sadece büyüklük bilgisine değil, faz bilgisine bakarak FFT'nin frekans çözünürlüğünü artırabilirsiniz. Bu, aksi takdirde kullanabileceğinizden çok daha kısa pencereler kullanmanıza izin verir, bu da daha iyi performans ve daha iyi zaman çözünürlüğü sağlar. Üst üste binen pencerelerin doğru şekilde yeniden sentezlenmesi zordur ve faz hakkında çok fazla varsayım yapmak da tehlikeli olabilir. Olursa olsun, bu tür hileler muhtemelen karmaşık zaman-frekans analizi problemlerini çözmenin temelidir.

Belirli uygulamalar için başka araçlar da vardır.


1
xnXkmwn
Xfm=nxn+mwnej2πnkN
Nxnm
Xfm=pxpwpmej2π(pm)kN=pxphmp
hn=wnej2πnkN

1
STFT'ler bir filtre bankası olabilir, ancak tüm filtre bantları STFT'ler değildir.
Bjorn Roche
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.