Bu yine horlama dedektörüm.
Orada bir şey olduğunda bir sinyal tespit etme konusunda oldukça iyi oldum - duvar soyulmuş bir horlamadan kayıtta bile duyamayacağınız nefes almaya kadar takip edebilirsiniz. Sorun şu ki, sinyalin algılanabilir seviyenin altına düştüğünü ve uygulamanın sadece "işitme" olduğunu söyleyemem. Ve ne yazık ki, horlama / nefes alma, basit bir otokorelasyon veya benzer aralık zamanlama şemasının çok yardımcı olmayacak kadar düzensizdir. (Ve aslında bazı durumlarda gürültünün nefes almaktan daha düzenli olması muhtemeldir.)
Peki, sinyal olmadığında anladığım için kaçırdığım herhangi bir püf noktası var mı? Görünüşe göre, burada "sinyal" çok gürültü gibi göz önüne alındığında, burada sert bir yere karşı olduğumu görünüyor.
(Ve belki de bu yaşadığım başka bir sorunla ilgilidir: Garip bir şekilde, oldukça yüksek olsa bile sinyal seviyesini doğru bir şekilde (veya yaklaşık olarak) ölçemiyorum. seviye bilgisi tür kayboluyor. Sulandırmak için bazı hileler arıyorum.)
Temel teknik
(Yoda için)
Ses sinyali örneklenir (genellikle çeşitli nedenlerle 8000Hz'de), daha sonra 1024 blokta FFTlenir. (Deneylerimde Hamming filtreleri ve çakışan bloklar çok az etkiye sahip gibi görünüyor, ancak bunlar daha sonra tekrar ziyaret edilebilir.)
FFT, "bantlara" (şu anda 5, düşük uca daha fazla ayrıntı yerleştirmek için hafifçe eğik) ayrılır ve her bandın "spektral farkı" ve seviyesi toplanır. Zirve sınırlı değerlerin uzun vadeli ortalamaları "eşikler" olarak kullanılır ve kabaca% 20 "eşik" oranını korumak için daha fazla sapma ayarları kullanılır.
Her "aşırı eşik" değerine 1 ağırlık verilir (eşiğin altında 0 ağırlık verilir), ancak daha sonra bu ağırlık, bantlara daha fazla ağırlık vermek için banttaki görünür "değişkenlik" (kabaca 2Hz'de) ile ayarlanır. daha belirgin sinyal taşıyan.
Bantların ağırlıkları toplanır ve daha sonra sonraki blokların toplanan ağırlıkları yaklaşık bir saniye içinde toplanarak çalışan bir "skor" elde edilir. Bu yine horlama başlangıç / ofsetini tespit etmek için çalışan ortalama eşikle (artı birkaç sezgisel tarama) karşılaştırılır.
Güncelleme
Aniden bana, algoritmamın sabit seviyeli bir sinyali (sinyal seviyesi problemime göre) etkili bir şekilde sürdürmesi durumunda, SNR'yi etkili bir şekilde ölçmenin yolunun, sinyal olmadığında gürültüyü ölçmek olduğu ortaya çıktı.
Uygun olarak, horlamalar aralıklıdır, aralarında çok sayıda "ölü hava" vardır. Ve zaten horlama zarflarını tespit ediyorum. Yani zarfın dışındaki herhangi bir şey (bir horlamanın sonu ile bir sonrakinin başlangıcı arasında) muhtemelen gürültü! Bu (bazı mütevazı doğruluk / tekrarlanabilirlik derecesi ile) ölçebilirim. (Elbette, yarım terbiyeli bir algoritma bulmak üç denemeyi aldı - gerçeklik asla teoriye uymuyor.)
Bu yüzden henüz tam cevabım yok ama ilerleme kaydettim.
(Yukarıdaki teknik bana SNR için oldukça iyi bir proxy verirken, hala gerçek sinyal seviyesini tahmin etmekte sorun yaşıyorum. "Göreceli seviye" göstergelerim, zorlukla duyulabilir bir nefes için ölçek dışı olabilir ve bir pencere tıkırtısı için so-so. Mutlak seviye için bir çeşit proxy'ye ihtiyacım var.)