metoda kompresji dźwięku - błąd przy przepisaniu wzoru?

0

Cześć. Próbuję napisać funkcję do kompresji dźwięku z wykorzystaniem tych wzorów poniżej, jednak nie potrafię znaleźć błędu który mogę popełniać.
screenshot-20220510174938.png

def kompresja(dane):
    x = dane.copy()
    a = 87.6
    F=np.zeros(x.shape[0])
    # zakresy
    idx1 = x < (1/a)
    idx2 = np.logical_not(idx1) # x mają wartość od -1 do 1
    # kompresja
    F[idx1] = (a * np.abs(x[idx1])) / (1 + np.log(a))
    F[idx2] = ( 1 + np.log( a * np.abs(x[idx2])) ) / (1 + np.log(a))
    F = np.sign(F)

    return F

Pisałem już bardzo podobną do tego kompresję μ-law i nie miałem z nią problemów, tym większe moje zdziwienie że nie mogę znaleźć błędu tutaj.

1

O co chodzi z idx1 i idx2 oraz F[idx1] = i F[idx2] = ? Nie rozumiem tego zapisu.

1

Co to jest, dane, to się w ogóle kompiluje? Gdzie implementujesz funkcję ze wzoru? Bo koniec końców zwracasz wektor zmapowany funkcją, np.sign.
https://numpy.org/doc/stable/reference/generated/numpy.sign.html

0

Dane to np.

readWav, fs = sf.read('jakisPlik.wav', dtype=np.int16)
dane = (readWav/np.iinfo(np.int16).max).astype(float)

albo

x=np.linspace(-1,1,1000) 
dane=np.sin(np.pi*x*10)

Tak, kompiluje się.
Mapuję np.sign ponieważ funkcja signum znajduje się też we wzorze.

Ok, napisałem to trochę inaczej, jest teraz czytelniej.

def kompresja(dane):
    x = dane.copy()
    Z=np.zeros(x.shape[0])
    for i in range(x.shape[0]):
        Z[i] = np.sign(fun(dane[i]))

    return Z

def fun(x):
    a = 87.6
    if x < (1/a):
        x = (a * np.abs(x)) / (1 + np.log(a))
    else:
        x = ( 1 + np.log( a * np.abs(x)) ) / (1 + np.log(a))
    return x

Wyniki są takie same jak w wersji z mojego postu na górze.

0

Co się dzieje w linii, 14? IDE, czy formaterka nie krzyczy "Statement with no effect"? A może:

def fun(x):
    a = 87.6
    if x < (1/a):
        return (a * np.abs(x)) / (1 + np.log(a))
    return (1 + np.log( a * np.abs(x)) ) / (1 + np.log(a))
0

faktycznie musiałem przy usuwaniu komentarzy coś odwalić. Oczywiście cały czas jest coś nie tak w tej funkcji i wynik nie jest poprawny

Nie wiem co to poprawny wynik, ale, IMO, funkcja, F zawsze zwróci wartość dodatnią, więc jej znak to jeden.

1 użytkowników online, w tym zalogowanych: 0, gości: 1