//___________________________ void AVDMProcessAudio_Resample::InitialSRC(void) { int i; frqs = 44100 * OSRM; // virtual high sampling rate frqc = lpfcof[_quality]; // cutoff freq. firodrv = firodr[_quality]; // FIR order = firodrv*2+1 divisor = bessel0(ALPHA); hgain = (2.0 * ISRM * frqc) / frqs; hfir[0] = hgain; for (i = 1; i <= firodrv; i++) { regv = (double) (i * i) / (firodrv * firodrv); wfnc = bessel0(sqrt(1.0 - regv) * ALPHA) / divisor; regv = (2.0 * M_PI * frqc * i) / frqs; hfir[i] = (hgain * sin(regv) * wfnc) / regv; } ismd = OSRM / ISRM; ismr = OSRM % ISRM; eptr = firodrv / ISRM; eptrr = firodrv % ISRM; sptr = -eptr; sptrr = -eptr; // ZeroMemory(smpld, sizeof(smpld)); memset(smpld, 0, sizeof(smpld)); winpos = 0; iptr = 0; }
double kaiser(int i, int n, double beta) { double a,w,a2,b1,b2,beta1; b1 = bessel0(beta); a = 2.0*i/(double)(n-1) - 1.0; a2 = a*a; beta1 = beta * sqrt(1.0 - a2); b2 = bessel0(beta1); w = b2/b1; return w; }
void KaiserWindow::init() { double denominator = bessel0(m_beta); bool even = (m_length % 2 == 0); for (int i = 0; i < (even ? m_length/2 : (m_length+1)/2); ++i) { double k = double(2*i) / double(m_length-1) - 1.0; m_window.push_back(bessel0(m_beta * sqrt(1.0 - k*k)) / denominator); } for (int i = 0; i < (even ? m_length/2 : (m_length-1)/2); ++i) { m_window.push_back(m_window[int(m_length/2) - i - 1]); } }
// static const float KAISER_ALPHA = 4.0; static double kaiser(double alpha, double half_width, double x) { const double ratio = (x / half_width); return bessel0(alpha * sqrt(1 - ratio * ratio)) / bessel0(alpha); }