⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavetable_generators.c

📁 一些经典的数字信号处理算法方面的c源代码。
💻 C
字号:
/* gdelay2.c - generalized circular delay with real-valued shift */

void gdelay2(D, c, q)
int D;
double c, *q;                             /* \(c\)=shift, \(q\)=offset index */
{
       *q -= c;                           /* decrement by \(c\) */

       if (*q < 0)  
              *q += D+1;

       if (*q > D)
              *q -= D+1;
}


/* sine.c - sine wavetable of length D */

#include <math.h>

double sine(D, i)
int D, i;
{
       double pi = 4 * atan(1.0);

       return sin(2 * pi * i / D);
}


/* square.c - square wavetable of length D, with D1 ones */

double square(D1, i)
int D1, i;
{
       if (i < D1)
              return 1;
       else
              return 0;
}



/* trapez.c - trapezoidal wavetable: D1 rising, D2 steady */

double trapez(D, D1, D2, i)
int D, D1, D2, i;
{
       if (i < D1)
              return i/(double) D1;
       else
            if (i < D1+D2)
                 return 1;
            else
                 return (D - i)/(double) (D - D1 - D2);
}



/* wavgen.c - wavetable generator (truncation method) */

void gdelay2();

double wavgen(D, w, A, F, q)        /* usage: y = wavgen(D, w, A, F, &q); */
int D;                              /* \(D\) = wavetable length */
double *w, A, F, *q;                /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
       double y;
       int i;

       i = (int) (*q);                             /* truncate down */

       y = A * w[i];

       gdelay2(D-1, D*F, q);                       /* shift  \(c = DF\) */

       return y;
}



/* wavgenr.c - wavetable generator (rounding method) */

void gdelay2();

double wavgenr(D, w, A, F, q)       /* usage: y = wavgenr(D, w, A, F, &q); */
int D;                              /* \(D\) = wavetable length */
double *w, A, F, *q;                /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
       double y;
       int k;

       k = (int) (*q + 0.5);                     /* round */

       y = A * w[k];

       gdelay2(D-1, D*F, q);                     /* shift  \(c = DF\) */

       return y;
}



/* wavgeni.c - wavetable generator (interpolation method) */

void gdelay2();

double wavgeni(D, w, A, F, q)      /* usage: y = wavgeni(D, w, A, F, &q); */
int D;                             /* \(D\) = wavetable length */
double *w, A, F, *q;               /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
       double y;
       int i, j;

       i = (int) *q;                        /* interpolate between \(w[i], w[j]\) */
       j = (i + 1) % D;                     

       y = A * (w[i] + (*q - i) * (w[j] - w[i]));

       gdelay2(D-1, D*F, q);                     /* shift  \(c = DF\) */

       return y;
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -