it-swarm-tr.com

Gerçek zamanlı ses girişinden dakika başına vuruş

Giriş sesini izlemek için basit bir C # uygulaması yazmak ve bana dakikadaki akımı (iyi, ortalama) atışı vermek istiyorum.

Gördüm Bu gamedev makalesini , ve bu kesinlikle yardımcı olmadı. Ben gittim ve ne yaptığını uygulamaya çalıştım ama işe yaramadı.

Bunun için tonlarca çözüm olması gerektiğini biliyorum, çünkü pek çok DJ yazılımı bunu yapıyor, ancak açık kaynaklı bir kütüphane bulma konusunda kendime bir şansım yok.

42
Karl

Kayar pencereli bir güç ölçüsünü hesaplayın FFT: 1024 örnek alın: 

double[] signal = stream.Take(1024);

Bir FFT algoritmasına besleyin: 

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

Gerçek bir bölüm ve hayali bir bölüm alacaksınız. Hayali kısmı atmayın. Hayali olarak aynısını yapın. Hayali kısmın gerçek ile faz dışı pi/2 olduğu doğru olsa da, yine de spektrum bilgisinin% 50'sini içerir.

DÜZENLE:

Gücü, amplitüdün aksine hesaplayın, böylece gürültülü olduğunda yüksek ve sessizken sıfıra yakın yüksek bir sayıya sahip olabilirsiniz:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

Benzer şekilde hayali kısım için.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

Şimdi son 1024 örnek için bir güç spektrumunuz var. Spektrumun ilk kısmı düşük frekanslarda ve spektrumun son kısmı yüksek Frekanslardır.

BPM'yi popüler müzikte bulmak istiyorsanız, muhtemelen baslara odaklanmalısınız. Güç yoğunluğunun alt kısmını toplayarak bas yoğunluğunu tespit edebilirsiniz. Hangi numaraların kullanılacağı örnekleme sıklığına bağlıdır:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

Şimdi aynısını tekrar yapın, ancak yeni bir spektrum hesaplamadan önce pencereyi 256 örnek hareket ettirin. Şimdi her 256 örnek için bas yoğunluğunu hesaplayarak bitirdiniz. 

Bu, BPM analiziniz için iyi bir girdidir. Bas sessizken bir ritminiz yoktur ve yüksek olduğunda bir ritminiz olur. 

İyi şanslar!

26
Hallgrim

Prosedürel olarak DDR dans adımlarını müzikten üreten Dancing Monkeys adında mükemmel bir proje var. Yaptıklarının büyük bir kısmı (mutlaka çok kesin) ritim analizine dayanmaktadır ve proje raporları, çeşitli ritim tespit algoritmalarını ve göreve uygunluklarını açıklayan çok detaylı bir şekilde ele alınmıştır. Her algoritma için orijinal makalelere referanslar içerirler. Ayrıca çözümleri için matlab kodunu yayınladılar. Eminim ki aralarında ihtiyacın olanı bulabilirsin.

Hepsi burada mevcut: http://monket.net/dancing-monkeys-v2/Main_Page

15
Nick Johnson

Bunun nasıl uygulanacağıyla ilgili bir ipucum olmadığı için, ancak ses mühendisliği açısından önce filtrelemeniz gerekir. Bas davul vuruşları ilk kontrol eden olur. Size yaklaşık 200Hz'in altında bir şey veren düşük geçişli bir filtre, bas davulunun oldukça net bir resmini vermelidir. Diğer enstrümanlardaki dağınıklığı, harmonikleri düşük olan diğer aletlerden temizlemek için de bir kapı gerekli olabilir.

Kontrol etmek için bir sonraki tuzak hit olacaktır. Bunu da EQ ile yapmak zorunda kalacaksın. Bir tuzaktan gelen "çatlak", bellekten 1,5 kHz civarındadır, ancak bunu kesinlikle geçmeniz gerekir.

Bir sonraki zorluk korkak vuruşlar için bir algoritma geliştirmek olacaktır. Programlı ritmi 1'i nasıl bulursunuz? Sanırım önceki vuruşları takip edersin ve başka bir şeyle eşleşen bir kalıp kullanırsın. Bu yüzden, ritmi doğru bir şekilde bulmak için muhtemelen birkaç çubuğa ihtiyacınız olacak. Sonra 4/4, 3/4, 6/8, vay gibi zamanlama sorunları var, bunu doğru yapmak için ne gerekli olduğunu hayal bile edemiyorum! Ses donanım/yazılım şirketleri için ciddi bir değer olacağını düşünüyorum.

8
Dan Harper

Bu kesinlikle kolay bir problem değil. Size sadece genel bir bakış vermeye çalışacağım.

Yapabilecekleriniz aşağıdaki gibi bir şeydir:

  1. Sinyalin ortalama (kök-ortalama-kare) yüksekliğini 5 milisaniyelik bloklar üzerinden hesaplayın. (Bunu daha önce hiç yapmadım, ne kadar iyi bir blok büyüklüğü olacağını bilmiyorum.)
  2. FFT algoritmasını kullanarak "bloke" sinyalin Fourier dönüşümünü alın.
  3. Dönüştürülen sinyalde en büyük büyüklüğe sahip olan bileşeni bulun.

Bir Fourier dönüşümü temel olarak sinyalde mevcut olan tüm frekansların gücünü hesaplamanın bir yoludur. Bunu "bloke" sinyali üzerinden yaparsanız, atımın frekansı umarım en güçlü olanı olacaktır.

Belki de önce BPM hakkında en fazla bilgiyi içeren belirli frekanslara (bas gibi) odaklanmak için bir filtre uygulamanız gerekir.

6
Thomas

Dakikada Vuruş tespiti için oldukça sağlam bir uygulama gibi görünen bu kütüphaneyi buldum . http://soundtouchdotnet.codeplex.com/

Epeyce DJ projelerinde kullanılan http://www.surina.net/soundtouch/index.html temeline dayanmaktadır http://www.surina.net/soundtouch/applications). html

5
eandersson

Öncelikle, Hallgrim'in ürettiği güç spektral yoğunluk fonksiyonu değil. Herhangi bir sinyaldeki istatistiksel periyodiklikler, bir otokorelasyon işlevi aracılığıyla ortaya çıkarılabilir. Otokorelasyon sinyalinin fourier dönüşümü güç spektral yoğunluğu. PSD'de 0 Hz dışındaki baskın tepe değerleri, sinyaldeki etkin periyodikliğe karşılık gelir (Hz olarak) 

1
pete

BASS ses kütüphanesini ve BASS.NET paketini kontrol etmenizi öneririm. BPMCounter sınıfında yerleşiktir. 

Bu özel işleve ilişkin detaylar http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm adresinde bulunabilir.

0
Matt Williams

Bunu yapmanın kolay yolu, kullanıcının ritimle bir düğmeye basması ve zamana bölünen musluk sayısını saymasıdır.

0
Lucius Kwok