Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przetwarzanie tablicy próbek - szukam algorytmu

jankomuzykant 27 Kwi 2009 13:41 873 2
  • #1 27 Kwi 2009 13:41
    jankomuzykant
    Poziom 13  

    W pamięci mam przebieg ośmiobitowego audio, przy czym zero=080h. Szukam szybkiego algorytmu zmniejszającego poziom przebiegu na wyjściu d/a pamiętając o utrzymaniu poziomu zerowego na 080h (wystarczy kilka poziomów, np. różniących się bitową rozdzielczością). Liczy się każdy cykl, dlatego zadaję tu pytanie - może jest jakiś prosty sposób, na który nie wpadłem.
    Oczywiście asembler.

    0 2
  • #2 28 Kwi 2009 13:33
    Dr.Vee
    VIP Zasłużony dla elektroda

    Najszybciej będzie tworząc 256-bajtową tablicę na każdy poziom. Bez podwójnych rejestrów DPTR musiałbyś mieć próbki w pamięci IRAM (mov A, @Rn) lub ew. w jednej stronie pamięci XRAM (movx A, @Rn):

    Code:
        mov DPTR, #tablica_poziomu_x
    
        mov R1, #liczba_probek
        mov R2, #adres_1_probki_w_ram
    petla:
        mov A, @R2                      ; +1
        movc A, @DPTR+A                 ; +1
        mov @R2, A                      ; +1
        inc R2                          ; +1
        djnz R1, petla                  ; +2
                                        ; =6 cykli na próbkę

    Można ew. kombinować z zachowywaniem najstarszego bitu, odejmowaniem 0x80, warunkową negacją, odczyt z tablicy, warunkowa negacja i dodawanie 0x80 - ale to więcej operacji, za to dwa razy mniej pamięci na tablice.

    Pozdrawiam,
    Dr.Vee

    0
  • #3 28 Kwi 2009 23:44
    jankomuzykant
    Poziom 13  

    Dr.Vee napisał:
    Najszybciej będzie tworząc 256-bajtową tablicę na każdy poziom.

    I to chyba jest myśl. Właściwie wystarczą dwa poziomy, potrzebuję tego do samplera perkusyjnego, tu nieco na jego temat:
    Link
    Dr.Vee napisał:

    Można ew. kombinować z zachowywaniem najstarszego bitu, odejmowaniem 0x80, warunkową negacją, odczyt z tablicy, warunkowa negacja i dodawanie 0x80 - ale to więcej operacji, za to dwa razy mniej pamięci na tablice.

    Zacząłem właśnie kombinować z liczeniem tego, ale brakuje czasu - w końcu to tylko pięćdziesiątka jedynka :)
    Dzięki za sugestię.

    0