#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
 
#define SIG_LENGTH 16
#define FIR1_ORDER 5
#define FIR1_LP_CUTOFF 0.3
#define FIR1_HP_CUTOFF 0.6
 
int main(int argc, char **argv)
{
    long order;
    double cutoff;
    double beta;
    double gain;
    spDVectors coefs;
    unsigned long options;
 
    x = xdvzeros(SIG_LENGTH);
 
    h = xdvfir1(FIR1_ORDER, FIR1_LP_CUTOFF);
    dvdump(h);
    xdvfree(h);
 
    h = xdvfir1bp(FIR1_ORDER, FIR1_LP_CUTOFF, FIR1_HP_CUTOFF);
    dvdump(h);
    xdvfree(h);
    
    h = xdvfir1bs(FIR1_ORDER, FIR1_LP_CUTOFF, FIR1_HP_CUTOFF);
    dvdump(h);
    xdvfree(h);
    
    h = xdvfir1(FIR1_ORDER + 1, FIR1_HP_CUTOFF);
    dvdump(h);
    xdvfree(h);
    
    h = xdvfir1hp(FIR1_ORDER, FIR1_HP_CUTOFF);
    dvdump(h);
    xdvfree(h);
    
    
    poles = xdvbuttap(3);
    dvdump(poles);
    xdvfree(poles);
 
    dvdump(coefs->vector[0]);
    dvdump(coefs->vector[1]);
    xdvsfree(coefs);
    
    coefs = xdvsbutter(3, 0.25, 
SP_TRUE);
    dvdump(coefs->vector[0]);
    dvdump(coefs->vector[1]);
    xdvsfree(coefs);
 
    
    poles = xdvcheb1ap(5, 3.0, &gain);
    dvdump(poles);
    fprintf(stderr, "gain = %f\n\n", gain);
    xdvfree(poles);
 
    coefs = xdvscheby1(5, 3.0, 0.5, 
SP_FALSE);
    dvdump(coefs->vector[0]);
    dvdump(coefs->vector[1]);
    y = xdvfilter(coefs->vector[0], coefs->vector[1], x);
    dvdump(y);
    xdvfree(y);
    xdvsfree(coefs);
    
    coefs = xdvscheby1(5, 3.0, 0.5, 
SP_TRUE);
    dvdump(coefs->vector[0]);
    dvdump(coefs->vector[1]);
    y = xdvfilter(coefs->vector[0], coefs->vector[1], x);
    dvdump(y);
    xdvfree(y);
    xdvsfree(coefs);
    
    kaiserord(1000.0 / 4000.0, 1500.0 / 4000.0, 0.05, 0.01, 
SP_FALSE, &order, &cutoff, &beta);
    printf("kaiserord result: order = %ld, cutoff = %f, beta = %f\n", order, cutoff, beta);
 
    h = xdvkaiser(order + 1, beta);
    dvdump(h);
    xdvfree(h);
 
    xdvfree(x);
 
    t = xdvinit(0.0, 0.00025, 1.0);
    theta1 = xdvscoper(t, "*", 2.0 * PI * 30.0);
    theta2 = xdvscoper(t, "*", 2.0 * PI * 60.0);
    x1 = xdvsin(theta1);
    x2 = xdvsin(theta2);
    x = xdvoper(x1, "+", x2);
 
#if 1
    options = SP_DECIMATE_OPTION_KEEP_EDGE;
#else
    options = SP_DECIMATE_OPTION_USE_FIR;
#endif
    y = xdvdecimateex(x, 4, 0, options);
    printf("-------- decimate result --------\n");
    {
        long m;
        long framel;
        long max_output_buf_length;
        long delay;
        long nprocess;
        long ypos;
        spDecimateRec decimate;
 
        framel = 128;
        
        if ((decimate = spDecimateOpen(4, 0, framel, options, &max_output_buf_length, &delay)) != NULL) {
            spDebug(10, 
"main", 
"max_output_buf_length = %ld, delay = %ld\n", max_output_buf_length, delay);
 
            ypos = 0;
            for (m = 0;; m++) {
                nprocess = spDecimateProcess(decimate, &x->
data[m * framel], framel, &y1->
data[ypos],
                spDebug(100, 
"main", 
"nprocess = %ld, delay = %ld\n", nprocess, delay);
 
                ypos += nprocess;
                
                if ((m + 1) * framel + framel >= x->
length) {
 
                    spDebug(10, 
"main", 
"last frame: ypos = %ld, y1->length = %ld\n", ypos, y1->
length);
 
                    nprocess = spDecimateProcess(decimate, &x->
data[(m + 1) * framel], x->
length - (m + 1) * framel, &y1->
data[ypos],
                    ypos += nprocess;
                    spDebug(100, 
"main", 
"last frame: nprocess = %ld, delay = %ld, ypos = %ld / %ld\n",
 
                            nprocess, delay, ypos, y1->
length);
                    break;
                }
            }
 
            spDecimateClose(decimate);
        }
    }
        long k;
        double dist;
        diffv = xdvoper(y, "-", y1);
        dvsquare(diffv);
        for (k = 0; k < diffv->
length; k++) {
 
            if (diffv->
data[k] > 0.0001) {
 
                printf(
"%ld: big distortion: %f\n", k, diffv->
data[k]);
            }
        }
        dist = dvmean(diffv);
        printf(
"distortion between y (length: %ld) and y1 (length: %ld) = %f\n", y->
length, y1->
length, dist);
        
        
        xdvfree(y1);
    } else {
        dvdump(y);
    }
    xdvfree(y);
    
    xdvfree(x);
    xdvfree(x1);
    xdvfree(x2);
    xdvfree(theta1);
    xdvfree(theta2);
    xdvfree(t);
    
    return 0;
}
void spDebug(int level, const char *func_name, const char *format,...)
#define NODATA
Definition sp.h:76
double型を扱うためのベクトル型です.
Definition vector.h:248
double * data
Definition vector.h:256
long length
Definition vector.h:251