//___________________________
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;
}
예제 #2
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;
}
예제 #3
0
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]);
    }
}
예제 #4
0
 // 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);
 }