logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Matlab wav 16 bit to 12 bit simulink

dex 22 Mar 2008 01:16 3266 4
REKLAMA
  • #1 4938823
    dex
    Poziom 27  
    Chciałem sobie przekonwertować kawałek utworu 16 bitowego na 12 bit i zobaczeć jak to wpłynie na jakość.

    Gdybym działał 'na bitach' wyzerowałbym bądż usunął 4 najmłodsze bity z każdej próbki. Jak sobie z tym poradzić? W simulinku jest funkcja data convert type ale nie wiem jak to ugryźć i czy to wogóle się nadaje.

    Funkcja wavwrite obsługuje tylko podstawowe wielkości 8,16,24,32 bity.

    Czy możliwe jest wogóle operowanie w matlabie na macierzach binarnie?

    -------------

    Powiedzmy że mam macierz jedno kolumnową z próbkami jednego kanału wczytane z pliku wav, za pomoca komendy wavread.
    Dane w kolumnie sa typu duble, jesli próbki były 16 bitowe to ile bitów wyzerować? Być może udą sie to komendą setbit.
    --------
    No nie wiem chyba bitset się nie nadaje
    "??? Error using ==> bitset
    Inputs must be non-negative integers."
  • REKLAMA
  • Pomocny post
    #2 4939116
    shg
    Poziom 35  
    Nie wiem jak w Matlabie, ale w SciLabie jest tak, że .wav wczytany zostaje jako wektor liczb zmiennoprzecinkowych z zakresu od -1 do +1.

    W związku z powyższym w celu osiągnięcia żądanej ilości poziomów kwantyzacji można zrobić tak:
    x=wavread('jakis_plik.wav');
    x = round(x*2^(ilość_bitow - 1)) / 2^(ilość_bitow - 1);


    Po kolei:
    1. Wczytać dane.
    2. pomnożyć przez połowę ilości poziomów kwantyzacji. Połowę, bo mamy wartości zarówno dodatnie, jak i ujemne, albo jak by inaczej na to spojrzeć - szerokość przedziału wartości elementów wektora jest równa 2=1 - (-1).
    3. Zaokrąglić do najbliższej liczby całkowitej, dostaniemy w ten sposób 2^(ilość_bitów) wartości dyskretnych z zakresu od -(2^(ilość_bitów-1)) do 2^(ilość_bitów-1).
    4. podzielić przez 2^(ilość_bitów-1), co da nam 2^(ilość_bitów) wartości dyskretnych z zakresu od -1 do +1.
  • REKLAMA
  • #3 4940174
    dex
    Poziom 27  
    pomysł rzeczywiście działa! Jakby ktoś miał jeszce ideę jak to zrobić 'binarnie' na bitach za pomocą bitset czy bitand, to proszę pisać.

    A działa to tak:
  • REKLAMA
  • Pomocny post
    #4 4961314
    Freddie Chopin
    Specjalista - Mikrokontrolery
    moim zdaniem zamiast round() nalezaloby uzyc floor(), poniewaz operacja odciecia bitow ma wiecej wspolnego z zaokraglaniem w dol, niz z zaokraglaniem do najblizszej wartosci.

    0x41 0x56 0x45!!
  • #5 4961433
    dex
    Poziom 27  
    Racja i racja, rzeczywiście tak jest , ale chcąc zachować w miarę 'ten sam' przebiego przy 'fachowej' konwersji z 16 na 12 'dokładniej' jest do najblizszej całkowitej.

    A le z chęcią bym się dowiedział jak obciąc te bity binarnie.
REKLAMA