it-swarm-eu.dev

Bije za minutu z audio vstupu v reálném čase

Chtěl bych napsat jednoduchou aplikaci C #, která by monitorovala audio vstup a dala mi aktuální (dobře, klouzavý průměr) úderů za minutu.

Viděl jsem tento článek gamedev , a to nebylo absolutně žádná pomoc. Prošel jsem a snažil jsem se realizovat to, co dělal, ale prostě to nefungovalo.

Vím, že na to musí být spoustu řešení, protože to dělá spousta DJ softwaru, ale nemám štěstí při hledání nějaké open-source knihovny nebo instrukcí, jak to udělat sám.

42
Karl

Vypočtěte výkonové spektrum s posuvným oknem FFT: Vezměte 1024 vzorků: 

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

Přeneste jej do algoritmu FFT: 

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

Získáte skutečnou část a imaginární část. Nevyhazujte imaginární část. Udělejte to samé se skutečnou částí jako imaginární. I když je pravda, že imaginární část je pi/2 mimo fázi s reálným, stále obsahuje 50% informací o spektru.

UPRAVIT:

Vypočítejte sílu oproti amplitudě, abyste měli velké číslo, když je hlasité a téměř nulové, když je tiché:

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

Podobně pro imaginární část.

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

Nyní máte výkonové spektrum pro posledních 1024 vzorků. Tam, kde první část spektra je nízká frekvence a poslední část spektra je vysoká [.].

Pokud chcete najít BPM v populární hudbě, měli byste se pravděpodobně zaměřit na basu. Intenzitu basů můžete zachytit součtem dolní části výkonového spektra. Která čísla použít závisí na vzorkovací frekvenci:

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

Udělejte to samé znovu, ale před výpočtem nového spektra přesuňte okno 256 vzorků. Nyní skončíte s výpočtem basové intenzity pro každých 256 vzorků. 

To je dobrý vstup pro analýzu BPM. Když jsou basy tiché, nemáte rytmus a když je hlasitý, máte rytmus. 

Hodně štěstí!

26
Hallgrim

Tam je vynikající projekt s názvem Tančící opice, které procesně generuje DDR taneční kroky z hudby. Velká část toho, co dělá, je založena na (nutně velmi přesné) analýze rytmu a jejich projektový dokument jde do detailů popisujících různé algoritmy detekce úderů a jejich vhodnost pro daný úkol. Zahrnují odkazy na původní dokumenty pro každý z těchto algoritmů. Oni také zveřejnili kód Matlab pro jejich řešení. Jsem si jistý, že mezi těmi, co potřebujete, najdete.

Vše je k dispozici zde: http://monket.net/dancing-monkeys-v2/Main_Page

15
Nick Johnson

Ne že bych měl ponětí, jak to provést, ale z hlediska audiotechniky musíte nejprve filtrovat. Hity basového bubnu by byly první, kdo by je zkontroloval. Nízkoprůchodový filtr, který vám dává něco pod 200Hz, by vám měl dát jasný obraz o basovém bubnu. Také brána by mohla být nutná k vyčištění jakéhokoliv nepořádku od jiných přístrojů s harmonickými, které jsou nízké.

Další, co by zkontrolovalo, budou hity. Měli byste EQ tohle. "Prasknutí" z snare je asi 1,5kHz z paměti, ale budete muset určitě tuto bránu.

Další výzvou by bylo vypracovat algoritmus pro funky beat. Jak byste programaticky našli rytmus 1? Myslím, že byste měli sledovat předchozí rytmy a použít vzor odpovídající něčemu či jinému. Pravděpodobně budete potřebovat několik barů, abyste přesně našli rytmus. Pak je načasování problémy, jako 4/4, 3/4, 6/8, wow, nemohu si představit, co by bylo nutné udělat přesně! Jsem si jistý, že by to stálo za nějaké vážné peníze pro audio/softwarové společnosti.

8
Dan Harper

To není v žádném případě snadný problém. Pokusím se vám poskytnout pouze přehled.

Co můžete udělat, je něco jako:

  1. Vypočítejte průměrnou (kořen-střední-čtvereční) hlasitost signálu přes bloky, řekněme, 5 milisekund. (Nikdy předtím jsem to neudělala, nevím, jaká by byla dobrá velikost bloku.)
  2. Vezměte Fourierovu transformaci "blokovaného" signálu pomocí algoritmu FFT.
  3. Najděte složku v transformovaném signálu, který má největší velikost.

Fourierova transformace je v podstatě způsob výpočtu síly všech frekvencí přítomných v signálu. Pokud to uděláte nad „blokovaným“ signálem, bude frekvence úderu pravděpodobně nejsilnější.

Možná musíte nejprve použít filtr, abyste se zaměřili na konkrétní frekvence (jako basy), které obvykle obsahují nejvíce informací o BPM.

6
Thomas

Našel jsem tuto knihovnu, která se zdá být dost solidní pro detekci Beats za minutu. http://soundtouchdotnet.codeplex.com/

Je založen na http://www.surina.net/soundtouch/index.html který se používá v několika málo DJ projektech http://www.surina.net/soundtouch/applications.html

5
eandersson

Především to, co Hallgrim vyrábí, není funkce spektrální hustoty výkonu. Statistická periodicita v jakémkoliv signálu může být vyvolána autokorelační funkcí. Fourierova transformace autokorelačního signálu je výkonová spektrální hustota. Dominantní píky v PSD jiné než při 0 Hz budou odpovídat efektivní periodicitě signálu (v Hz) ... 

1
pete

Doporučil bych vyzkoušet BASS audio knihovnu a BASS.NET wrapper. Má vestavěnou třídu BPMCounter. 

Podrobnosti pro tuto specifickou funkci naleznete na adrese http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm .

0
Matt Williams

Snadný způsob, jak to udělat, je nechat uživatele klepnout na tlačítko v rytmu s rytmem a spočítat počet kohoutků dělených časem.

0
Lucius Kwok