Processing math: 100%

2012-05-01

Window function - Kaiser w Python

Tutaj implementacja w Python z wykorzystaniem odwołania do scipy.special.iv, czyli Modified Bessel function of first order. Mam nadzieję, że w następnym poście podam kod na scipy.special.iv. Wtedy wszystko będzie już gotowe do przeniesienia w C#. By tam generować BLEP-y programowo jakie się nam wymarzy.

def kaiser(samples, beta):
    result = [0] * samples
    M = samples - 1
    for i in range(samples):
        num = special.iv(1, beta*math.sqrt(1-(2*i/M - 1)**2))
        den = special.iv(1, beta)
        result[i] = num / den
    return result

2012-04-30

Transformata Z i równanie różnicowe filtru dolnoprzepustowego drugiego stopnia

Filtr dolnoprzepustowy pierwszego stopnia zostanie omówiony w innym poście. Nie możemy użyć poniższych wzorów podstawiając po prostu A=0. Ale za to podstawienie A=0 i B=0 daje poprawne wyniki.

Filtru dolnoprzepustowego drugiego stopnia:

H(s)=1s2R1R2C1C2+s(R1C1+R2C2)+1

Ogólnie:

H(s)=1s2A+sB+1

Filtr pierwszego stopnia to filtr dla którego A = 0.

Korzystając z wzoru na związek pomiędzy transformatą Laplaca a Z:

s=2T(z1)(z+1)

Po przekształceniach otrzymujemy:

H(z)=T2+2T2z1+T2z24A+2TB+T2+(2T28A)z1+(4A2TB+T2)z2

Co możemy zapisać jako:

H(z)=b0+b1z1+b2z21+a1z1+a2z2

, gdzie:

a0=4A+2TB+T2
a1=(2T28A)/a0
a2=(4A2TB+T2)/a0
b0=T2/a0
b1=2T2/a0
b2=T2/a0

T to okres co jaki chcemy otrzymywać kolejne próbki, w naszym przypadku jest to częstotliwość z jakiej wielokrotnością custom chip jest w stanie zmieniać wyjście.

Filtr zapisany w takiej postaci to Digital biquad filter.

Takie funkcji przejścia odpowiada następujące równianie różnicowe:

y(n)=b0x(n)+b1x(n1)+b2x(n2)a1y(n1)a2y(n2)

Wszystko to pozwala nam na generowania przebiegów BLEP wprost z równania różnicowego, którego parametry są bezpośrednio określone parametrami elektrycznymi filtra i częstotliwością z jaką chcemy ciągły sygnał próbkować.