Adım algılamayı iyileştirmeye yönelik ipuçları


21

Kullanıcının gitarını ayarlamasını sağlayan basit bir web uygulaması üzerinde çalışıyorum. Sinyal işleme konusunda gerçek bir acemiyim, bu yüzden sorum uygunsuzsa çok fazla yargılama.

Böylece, bir FFT algoritması kullanarak temel frekansı almayı başardım ve bu noktada uygulama bir şekilde işlevsel. Ancak, iyileştirme için yer var, şu anda FFT algoritmasına ham pcm gönderiyorum, ancak belki de tespiti artırabilecek bazı öncesi / sonrası algoritmaları / filtreleri olduğunu düşünüyordum. Herhangi bir öneride bulunabilir misin?

Benim asıl sorunum, belirli bir frekansı algıladığında 1-2 saniye boyunca frekansı göstermesi ve daha sonra diğer rastgele frekanslara atlaması ve ses sürekli olsa bile tekrar tekrar gelmesidir.

Ben de böyle şeyler ile deneyim varsa başka herhangi bir optimizasyon türü ile ilgileniyorum.

Yanıtlar:


20

Sanırım diğer frekansları temel harmonikler mi? Sanki 100 Hz çalıyorsunuz ve bunun yerine 200 Hz veya 300 Hz alıyor? İlk olarak, arama alanınızı bir gitarın olması muhtemel frekanslarla sınırlamalısınız. İhtiyacınız olabilecek en yüksek temeli bulun ve bununla sınırlandırın.

Otokorelasyon , temelin harmoniklerden daha düşük olması (veya tamamen eksik olması, ancak gitarla ilgili bir sorun değil) , temeli bulmada FFT'den daha iyi çalışacaktır :

resim açıklamasını buraya girin

Ayrıca, temelleri vurgulamak ve harmonikleri en aza indirmek için daha düşük frekansları ağırlıklandırmayı deneyebilir veya bunun gibi bir pik toplama algoritması kullanabilir ve daha sonra frekanstaki en düşük değeri seçebilirsiniz.

Ayrıca, FFT'yi uygulamadan önce sinyalinizi pencerelemelisiniz. Frekans spektrumunu daha temiz hale getirmek için dalga formunun başlangıcını ve sonunu inceleyen bir pencere işlevi ile çarpın . Sonra geniş bileşenler yerine frekans bileşenleri için uzun dar ani yükselmeler elde edersiniz.

Daha doğru bir tepe noktası elde etmek için enterpolasyonu da kullanabilirsiniz. Spektrumun günlüğünü alın, sonra zirveye ve iki komşu noktaya bir parabol takın ve parabolün gerçek zirvesini bulun. Yine de bu kadar kesinliğe ihtiyacınız olmayabilir.

İşte tüm bunlar için örnek Python kodum .


Aradığım şey bu, çok iyi bir cevap, teşekkür ederim!
Valentin Radu

2
Konikleştirilmiş bir pencere işleviyle çarpılması, sinyalinizdeki spektral çizgileri bulaştırır ve böylece onları daha geniş hale getirir. Bununla birlikte, sizi satın alabileceği şey, örneğin yüksek güçlü bir parazit tonu varlığında çok düşük güçlü bir spektral çizgiyi tanımlamanıza izin veren dinamik aralıktır.
Jason R

@JasonR, bunun yüksek güçlü parazit tonu / tonlarının olasılığının gerçekten düşük olduğu bir ortamda çalışmak üzere tasarlandığı göz önüne alındığında, Hamming penceresi kullanmamanın daha iyi olduğunu düşünüyor musunuz?
Valentin Radu

1
Bir Hamming penceresi kullanmanın, okumaları sabit tutma hedefime yaklaştığını doğrulayabilirim. Şu anda, bir A4 oynadığımda çoğu zaman 440 Hz alıyorum ve çok nadiren 650 Hz gibi yakın bir okuma alıyorum. Sanırım bunlar harmonikler mi? Ayrıca, daha yüksek frekans için uygulamanın kusursuz çalıştığını ve daha düşük için başarısız olmaya başladığını fark edemedim. Muhtemelen zirve büyüklük frekans bölmesini tespit etmek ve daha düşük frekanslar için FTT kullanıyorum çünkü bu her zaman temel değildir?
Valentin Radu

1
Mindnoise: 660 Hz, 440 Hz'lik bir harmonik değil, 220 Hz'lik bir harmonik veya 440'ın üzerinde mükemmel bir beşinci. Başka bir tel rezonans veya bozulma veya başka bir şey olabilir mi? FFT'yi çizip ona bakabiliyorsanız, bu tür sorunları anlamak çok daha kolaydır. Evet, düşük frekanslar, mekanik efektlerle veya analog devrenizle yüksek frekanslara göre filtrelenebilir ve azaltılabilir.
endolit

12

Pitch, bir FFT'nin tepe büyüklük frekans bölmesi ile aynı değildir. Pitch insan psiko-akustik bir fenomendir. Ses perdesi sesinin eksik veya çok zayıf bir temeli olabilir (bazı ses, piyano ve gitar seslerinde yaygındır) ve / veya spektrumunda ses perdesi frekansını aşan çok güçlü tonlar olabilir (ama yine de bir ses perdesi olarak duyulur) . Bu nedenle, herhangi bir FFT tepe frekans dedektörü (bazı pencereleme ve enterpolasyon dahil olsa bile) sağlam bir perde tahmini yöntemi olmayacaktır.

Bu yığın akışı sorusu , daha iyi sonuçlar elde edebilecek perdeyi tahmin etmek için bazı alternatif yöntemlerin bir listesini içerir.

EKLENDİ: Bunu gitar sesleri için yapıyorsanız, en düşük gitar tellerinin aslında biraz harmonik tonlar üretebileceğini unutmayın, insan kulağı tonların alt katları ile daha yakından ilişkili bir perde frekansı duyabileceğinden, perde tahminini daha da zorlaştırır. , ipin gerçek temel titreşim frekansından ziyade.

EKLENDİ 2: Bu konu o kadar sık ​​soruluyor ki, konuyla ilgili daha uzun bir blog yazısı yazdım: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html


bize az önce bahsettiğiniz blogu ziyaret etti (ve yorum yaptı).
robert bristow-johnson

5

Uzun yıllar polifonik müzikte ses perdesi tespiti araştırdım - bir mp3 kaydında bir gitar solo notalarını tespit etmek gibi. Ayrıca Wikipedia'da sürecin kısa bir açıklamasını veren bir bölüm yazdım (aşağıdaki bağlantıdaki "Pitch algılama" alt bölümüne bakın).

Bir piyanoya tek bir tuşa basıldığında, duyduğumuz şey sadece bir ses titreşimi frekansı değil, aynı zamanda matematiksel olarak farklı frekanslarda meydana gelen çoklu ses titreşimlerinin bir bileşiğidir . Farklı frekanslardaki titreşimlerin bu bileşiğinin elemanlarına harmonik veya kısmi denir. Örneğin, piyanoda Orta C tuşuna basarsak, kompozitin harmoniklerinin bireysel frekansları temel frekans olarak 261.6 Hz'de başlar, 523 Hz 2. Harmonik, 785 Hz 3. Harmonik, 1046 Hz Daha sonraki harmonikler, temel frekansın, 261.6 Hz'nin tam katlarıdır (örn: 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1046).

Öncelikle tepe seviyeleri olan frekansları arayarak olası harmonikleri tespit etmek için değiştirilmiş bir DFT Logaritmik Dönüşümü kullanıyorum (aşağıdaki şemaya bakın). Değiştirilmiş Log DFT'im için veri toplama şeklimden dolayı, sinyale bir Pencereleme İşlevi uygulamak veya ekleme ve üst üste binme GEREKMEZ . Ve DFT'yi oluşturdum, böylece frekans kanalları logaritmik olarak yerleştirildi, böylece harmoniklerin gitar, saksafon vb.

Şimdi emekli olmak, PitchScope Player adlı ücretsiz bir gösteri uygulaması içinde saha algılama motorumun kaynak kodunu yayınlamaya karar verdim . PitchScope Player web üzerinde mevcuttur ve seçtiğiniz bir mp3 dosyasında iş algoritmamı görmek için Windows için yürütülebilir dosyayı indirebilirsiniz. GitHub.com'a aşağıdaki bağlantı, özel bir Logaritmik DFT dönüşümü ile harmonikleri nasıl tespit ettiğimi görebileceğiniz ve daha sonra frekanslarını doğru tamsayı ilişkisini sağlayan kısmi (harmonikler) arayabileceğiniz tam kaynak koduma yönlendirecektir. Saha'.

Pitch Detection Algorithm aslında iki aşamalı bir işlemdir: a) İlk olarak ScalePitch algılanır ('ScalePitch' 12 olası adım değerine sahiptir: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) ve ScalePitch belirlendikten sonra, Octave 4 olası Octave-Candidate notunun tüm harmonikleri incelenerek hesaplanır. Algoritma, bir polifonik MP3 dosyasında herhangi bir zamanda en baskın perdeyi (müzik notası) tespit etmek için tasarlanmıştır. Bu genellikle bir enstrümantal solo notalarına karşılık gelir. 2 Aşamalı Hatve Algılama algoritmam için C ++ kaynak koduyla ilgilenenler GitHub.com'daki SPitchCalc.cpp dosyasındaki Estimate_ScalePitch () işlevinde başlamak isteyebilir.

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

Aşağıda, bir polifonik mp3 kaydında bir gitar solo 3 saniye boyunca bir Logaritmik DFT (benim C ++ yazılımı tarafından oluşturulan) görüntüsü yer almaktadır. Bir solo çalarken harmoniklerin gitardaki bireysel notalar için nasıl göründüğünü gösterir. Bu Logaritmik DFT'deki her nota için, çoklu harmoniklerinin dikey olarak uzandığını görebiliriz, çünkü her harmonik aynı zaman genişliğine sahip olacaktır. Notun Oktavı belirlendikten sonra, Temelin sıklığını biliyoruz.

resim açıklamasını buraya girin

Aşağıdaki şemada, bu not için ScalePitch belirlendikten sonra doğru Oktav-Aday notunu (yani doğru Temel) seçmek için geliştirdiğim Oktav Algılama algoritması gösterilmektedir. C ++ 'da bu yöntemi görmek isteyenler, GitHub'daki kaynak kodumda bulunan FundCandidCalcer.cpp adlı dosyanın içindeki Calc_Best_Octave_Candidate () işlevine gitmelidir.

resim açıklamasını buraya girin


James, DFT zift dedektörünüz eksik (veya zayıf) temelli notları algılıyor mu?
robert bristow-johnson

Evet, 2 Aşamalı Pitch Algılama algoritmam, sinyalin "eksik (veya zayıf) bir temeli" olsa bile notları algılar - bu, bu 2 aşamalı sürecin büyük bir gücüdür. Temel, ikinci aşamada, Logaritmik DFT diyagramındaki notlar için gördüğünüz zaman genişliklerinde Oktav Algılama gerçekleştirildiğinde belirlenir. Bu Pitch Detection işlevi bir polifonik mp3 sinyalinin karışıklığı içinde çalıştığından, Fundamental dahil olmak üzere birçok harmoniği eksik olan notları tespit edecektir. Bu cevaba Octave Detection algoritmamı açıklayan ikinci bir diyagram ekledim.
James Paul Millard
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.