Cześć,
w moim programie na procesor XMega32A4U-AU taktowanym częstotliwością 24MHz odtwarzam dźwięk (korzystam z kodu źródłowego tmf) .
Dźwięk jest w formacie 8-bitowym bez znaku. Odtwarzany z częstotliwością 22KHz, z bufora podwójnego za pomocą systemu DMA. Wielkość bufora to 2x480b.
Próbki odczytywane są z pamięci zewnętrznej FLASH poprzez interfejs SPI.
W przerwaniu DMA odczytywane są dwa bufory:
Bufor główny podwójny - mainbuffer oraz pomocniczy new buffer.
Następnie muszę dokonać operacji skalowania każdego z dźwięków. Wygląda to tak:
Wartość 127 jest wartością "neutralną" czyli wtedy membrana głośnika jest w spoczynku. Wartość volume_coefficient zawiera się w przedziale 0-100, także w efekcie mamy tutaj główne próbki odtwarzane z połowiczną głośnością oraz do tego dodawane nowe próbki z głośnością w zakresie 0-50% tak, żeby nie przekroczyć sumarycznie maksimum.
Problem polega na tym, że chciałbym sterować również stosunkiem próbek głównych do próbek nowych tak, żeby nowe próbki były odtwarzane z głośnością 0-80%, a próbki główne w zakresie 50%-20% (im głośniejsze próbki nowe tym cichsze próbki główne tak, żeby sumarycznie po ich dodaniu wychodziło wciąż 100% głośności.
Do zrealizowania tego próbowałem zastosować ten sam algorytm, co przy nowych próbkach:
ale niestety taka ilość obliczeń pokonała już mój mikroprocesor. Czy wyrażenie:
da się zapisać albo zastąpić czymś, co w mniejszym stopniu obciąży procesor?
Zauważyłem, że program działa w wersji oryginalnej (główny dźwięk ciągle 50%, a nowy 0-50%) przy zapisie:
ale jeśli próbuję ustawić proporcje na twardo, np.:
To już przeciążam procesor.
Stąd wnioskuję, że dodawanie dwóch wartości i dzielenie ich na 2 jest ładnie optymalizowane, ale w innych proporcjach już tak nie jest. Dlatego zastanawiam się, czy i tego wyrażenia wspomnianego wyżej nie dałoby się uprościć tak, żeby kilkukrotnie przyspieszyć jego wykonywanie. Może da się to jakoś sprytnie zrealizować?
Z góry serdeczne dzięki!
w moim programie na procesor XMega32A4U-AU taktowanym częstotliwością 24MHz odtwarzam dźwięk (korzystam z kodu źródłowego tmf) .
Dźwięk jest w formacie 8-bitowym bez znaku. Odtwarzany z częstotliwością 22KHz, z bufora podwójnego za pomocą systemu DMA. Wielkość bufora to 2x480b.
Próbki odczytywane są z pamięci zewnętrznej FLASH poprzez interfejs SPI.
W przerwaniu DMA odczytywane są dwa bufory:
Kod: C / C++
Bufor główny podwójny - mainbuffer oraz pomocniczy new buffer.
Następnie muszę dokonać operacji skalowania każdego z dźwięków. Wygląda to tak:
Kod: C / C++
Wartość 127 jest wartością "neutralną" czyli wtedy membrana głośnika jest w spoczynku. Wartość volume_coefficient zawiera się w przedziale 0-100, także w efekcie mamy tutaj główne próbki odtwarzane z połowiczną głośnością oraz do tego dodawane nowe próbki z głośnością w zakresie 0-50% tak, żeby nie przekroczyć sumarycznie maksimum.
Problem polega na tym, że chciałbym sterować również stosunkiem próbek głównych do próbek nowych tak, żeby nowe próbki były odtwarzane z głośnością 0-80%, a próbki główne w zakresie 50%-20% (im głośniejsze próbki nowe tym cichsze próbki główne tak, żeby sumarycznie po ich dodaniu wychodziło wciąż 100% głośności.
Do zrealizowania tego próbowałem zastosować ten sam algorytm, co przy nowych próbkach:
Kod: C / C++
ale niestety taka ilość obliczeń pokonała już mój mikroprocesor. Czy wyrażenie:
Kod: C / C++
da się zapisać albo zastąpić czymś, co w mniejszym stopniu obciąży procesor?
Zauważyłem, że program działa w wersji oryginalnej (główny dźwięk ciągle 50%, a nowy 0-50%) przy zapisie:
Kod: C / C++
ale jeśli próbuję ustawić proporcje na twardo, np.:
Kod: C / C++
To już przeciążam procesor.
Stąd wnioskuję, że dodawanie dwóch wartości i dzielenie ich na 2 jest ładnie optymalizowane, ale w innych proporcjach już tak nie jest. Dlatego zastanawiam się, czy i tego wyrażenia wspomnianego wyżej nie dałoby się uprościć tak, żeby kilkukrotnie przyspieszyć jego wykonywanie. Może da się to jakoś sprytnie zrealizować?
Z góry serdeczne dzięki!
