2010-07-01 8 views
7

Podana jest tablica 320 elementów (int16), które reprezentują sygnał audio (16-bitowy LPCM) o czasie trwania 20 ms. Szukam najbardziej prostej i bardzo szybkiej metody, która powinna zdecydować, czy ta tablica zawiera aktywny dźwięk (jak mowa lub muzyka), ale nie hałas czy cisza. Nie potrzebuję bardzo wysokiej jakości decyzji, ale musi to być bardzo szybkie.Najprostsza i najszybsza metoda wykrywania aktywności audio?

Najpierw przyszło mi do głowy dodać wszystkie kwadraty lub wartości bezwzględne elementów i porównać ich sumę z progiem, ale taka metoda jest bardzo powolna w moim systemie, nawet jeśli jest to O (n).

+0

Czy 'L' oznacza liniowy lub logarytmiczny? – msw

+0

@msw: L oznacza Linear – psihodelia

+2

Może powinieneś opublikować kod sumy kwadratów + podejście progowe - to naprawdę nie powinno być "bardzo powolne" - może wprowadzasz je nieefektywnie? –

Odpowiedz

4

Nie osiągniesz dużo szybciej niż podejście o sumie kwadratów.

Jedną z optymalizacji, której może nie robić się do tej pory, jest wykorzystanie sumy całkowitej. Oznacza to, że w każdym kroku czasowym, zamiast sumowania kwadratów z ostatnich n próbek, należy utrzymywać sumę bieżącą i aktualizować ją za pomocą kwadratu ostatniej próbki. Aby uniknąć całkowitego wzrostu i wzrostu liczby lat w czasie, dodaj rozkład wykładniczy. W pseudokod:

decay_constant=0.999; // Some suitable value smaller than 1 
total=0; 
for t=1,... 
    // Exponential decay 
    total=total*decay_constant; 

    // Add in latest sample 
    total+=current_sample; 

    if total>threshold 
     // do something 
    end 
end 

Oczywiście, musisz dostroić stałą i próg zaniku do swojej aplikacji. Jeśli nie jest wystarczająco szybki, aby uruchomić się w czasie rzeczywistym, masz poważnieniewposażony w DSP ...

+2

Nie zapomnij dodać prostego filtru, aby usunąć wszystkie zakłócenia o wysokiej częstotliwości.Filtr dolnoprzepustowy może być tak prosty, jak "zapamiętanie" poprzedniej próbki i uśrednienie jej z prądem, i użycie tego zamiast surowej próbki. Bardzo szybki i bardzo skuteczny – Toad

2

Możesz spróbować obliczyć dwie proste "statystyki" - pierwsza będzie rozłożona (maks. -min.). Cisza będzie miała bardzo niski spread. Druga byłaby różnorodnością - podziel zakres możliwych wartości na 16 nawiasów (= zakres wartości) i przechodząc przez elementy, ustal, w którym nawias ten element przechodzi. Hałas będzie miał podobne liczby dla wszystkich nawiasów, podczas gdy muzyka lub mowa powinna preferować niektóre z nich, jednocześnie zaniedbując innych.

To powinno być możliwe do zrobienia tylko w jednym przejściu przez tablicę i nie potrzebujesz skomplikowanej arytmetyki, tylko dodawania i porównywania wartości.

Weź również pod uwagę pewne przybliżenie, na przykład weź tylko co czwartą wartość, zmniejszając w ten sposób liczbę sprawdzanych elementów do 80. Dla sygnału audio powinno to być w porządku.

0

Jest oczywiste, że złożoność powinna wynosić co najmniej O (n). Prawdopodobnie niektóre proste algorytmy, które obliczyć zakres wartości są dobre w tej chwili, ale będę szukać Voice Activity Detection w Internecie i dla related code samples.

1

Zrobiłem coś takiego po chwili. Po kilku eksperymentach dotarłem do rozwiązania, które w moim przypadku działało wystarczająco dobrze.

Użyłem tempa zmian w sześcianie bieżącej średniej ponad około 120ms. Kiedy jest cisza (tylko szum), wyrażenie powinno się unosić wokół zera. Jak tylko stawka zacznie się zwiększać w ciągu kilku biegów, prawdopodobnie będziesz miał pewną akcję.


rate = cur_avg^3 - prev_avg^3 

Użyłem sześcianu, ponieważ kwadrat nie był wystarczająco agresywny. Jeśli kostka ma zwolnić dla ciebie, spróbuj zamiast tego użyć kwadratu i bitshift. Mam nadzieję że to pomoże.

Powiązane problemy