Exemple #1
0
FTMEXT_METHOD_OBJECT(rastafilt, NULL, obj)
{
    rastafilt_t *self = (rastafilt_t *)FTMEXT_GET_EXT();
    fts_object_t *obj = FTMEXT_GET_OBJECT();
    int type;
    float * data;
    int size;
    int stride;

    if(obj != NULL) {
        if(self->nfilt != -1) {
            type=fmat_or_fvec_vector_lock((fts_object_t *)obj,&data,&size,&stride);
            if((type==0)||(type==1)) {
                ftmext_error((ftmext_t *)self,"UNSUPPORTED TYPE %d",type);
            }
            else if(type==2) {
                //ftmext_post((ftmext_t *)self,"FMAT TYPE - size %d - stride %d - 1st-data %f",size,stride,data[0]);
                if(((fmat_get_m((fmat_t *)obj))==1)||((fmat_get_n((fmat_t *)obj))==1)) {
                    //ftmext_post((ftmext_t *)self,"GOOD FMAT #row %d #col %d",fmat_get_m((fmat_t *)obj),fmat_get_n((fmat_t *)obj));
                    if(size==(self->nfilt)) {
                        memset(self->output,0,(self->nfilt)*sizeof(float));
                        rasta_filt(self,data);
                        memcpy(data,self->output,(self->nfilt)*sizeof(float));

                        fmat_or_fvec_unlock((fts_object_t *)obj);

                        if(self->obj != NULL) fts_object_release(self->obj);

                        self->obj = obj;
                        fts_object_refer(obj);

                        ftmext_outlet_object((ftmext_t *)self, 0, self->obj);

                    }
                    else {
                        ftmext_error((ftmext_t *)self,"INPUT SIZE %d IS DIFFERENT THAN NFILT=%d",size,(self->nfilt));
                    }
                }
                else {
                    ftmext_error((ftmext_t *)self,"ONLY FMAT WITH 1 COL OR 1 ROW SUPPORTED");
                }
            }
            else {
                ftmext_error((ftmext_t *)self,"UNKNOWN TYPE %d",type);
            }


        }
        else {
            ftmext_error((ftmext_t *)self,"NFILT WAS NOT SET");
        }
    }

    FTMEXT_METHOD_RETURN;
}
Exemple #2
0
FTMEXT_METHOD_NUMBER(rastafilt, num)
{
    rastafilt_t *self = (rastafilt_t *)FTMEXT_GET_EXT();
    int nfilt = FTMEXT_GET_INT();
    int i;

    if(nfilt <= 1) {
        ftmext_error((ftmext_t *)self,"NFILT %d MUST BE BIGGER THAN 1",nfilt);
    }
    else {

        /*clean using old filt number*/
        if(self->nfilt != -1) {
            for(i=0; i<self->nfilt; i++) {
                free(self->filtIN[i]);
                free(self->filtOUT[i]);
            }
            free(self->filtIN);
            free(self->filtOUT);
            free(self->output);
        }

        self->nfilt = nfilt;

        self->filtIN=(float **)malloc(self->nfilt*sizeof(float *));
        self->filtOUT=(float **)malloc(self->nfilt*sizeof(float *));

        for(i=0; i<self->nfilt; i++) {
            self->filtIN[i]=(float *)malloc(5*sizeof(float));
            memset(self->filtIN[i],0,5*sizeof(float));
            self->filtOUT[i]=(float *)malloc(5*sizeof(float));
            memset(self->filtOUT[i],0,5*sizeof(float));
        }

        self->output=(float *)malloc(self->nfilt*sizeof(float));

        self->eos = 1;
        rasta_filt(self,(float *)NULL);
        self->eos = 0;
    }


    FTMEXT_METHOD_RETURN;
}
Exemple #3
0
FTMEXT_METHOD_VOID(rastafilt, reset)
{
    rastafilt_t *self = (rastafilt_t *)FTMEXT_GET_EXT();

    int i;

    /*clean using old filt number*/
    if(self->nfilt != -1) {
        for(i=0; i<self->nfilt; i++) {
            free(self->filtIN[i]);
            free(self->filtOUT[i]);
        }
        free(self->filtIN);
        free(self->filtOUT);
        free(self->output);


        self->filtIN=(float **)malloc(self->nfilt*sizeof(float *));
        self->filtOUT=(float **)malloc(self->nfilt*sizeof(float *));

        for(i=0; i<self->nfilt; i++) {
            self->filtIN[i]=(float *)malloc(5*sizeof(float));
            memset(self->filtIN[i],0,5*sizeof(float));
            self->filtOUT[i]=(float *)malloc(5*sizeof(float));
            memset(self->filtOUT[i],0,5*sizeof(float));
        }

        self->output=(float *)malloc(self->nfilt*sizeof(float));


        self->eos = 1;
        rasta_filt(self,(float *)NULL);
        self->eos = 0;
    }

    FTMEXT_METHOD_RETURN;
}
Exemple #4
0
/*
	This is the main routine for the analysis on a frame;
	it assumes only that the windowed speech has been put into
	an fvec pointed to by fptr, and that the analysis parameters
	are all available in the structure pointed to by pptr .
	It returns a pointer to the cepstral fvec for this frame.
	The called routines initialize required tables if
	called for the first time.
*/
struct fvec *rastaplp(struct fhistory *hptr, struct param *pptr, struct fvec *fptr)
{
	struct fvec *pspectrum, *aspectrum, *nl_aspectrum,
		*ras_aspectrum, *ras_nl_aspectrum,
		*ras_postaspectrum, *cepstrum;
        struct fvec *npower;
        struct fmat *map_source;  
        
        static struct map_param  mapping_param;
        int mapset;	
        
        char *funcname;

	funcname = "rastaplp";

	/* Compute the power spectrum from the windowed input */
	pspectrum   = powspec(pptr, fptr);

	/* Compute critical band (auditory) spectrum */
	aspectrum = audspec(pptr, pspectrum);

        /*---Jah Rasta with spectral mapping -----------------*/
        if ((pptr->jrasta == TRUE ) && (pptr->cJah == FALSE))
        { 
             npower = comp_noisepower(hptr, pptr, aspectrum);
             if (npower->values[0]  < TINY)
                pptr->jah = 1.0e-6;
             else
                pptr->jah = 1/(C_CONSTANT * npower->values[0]); 
             comp_Jah(pptr, &mapping_param, &mapset);
        }
         
	
        /* Put into some nonlinear domain */
	nl_aspectrum = nl_audspec(pptr, aspectrum);

	/* Do rasta filtering */
	ras_nl_aspectrum = rasta_filt(hptr, pptr, nl_aspectrum);

        if ((pptr->crbout) == FALSE)
        { 
           if ((pptr->jrasta == TRUE) && (pptr->cJah == FALSE))
           {
               map_source = cr_map_source_data(pptr, &mapping_param, ras_nl_aspectrum);
               do_mapping(pptr,&mapping_param, map_source, mapset, ras_nl_aspectrum);  
           }  

	   /* Take the quasi inverse on the nonlinearity
		(currently just an exp) */
	   ras_aspectrum = inverse_nonlin(pptr, ras_nl_aspectrum);

	   /* Do final cube-root compression and equalization */
	   ras_postaspectrum = post_audspec(pptr, ras_aspectrum); 

           if ((pptr->comcrbout) == FALSE)
           {
              /* Code to do final smoothing; initial implementation
                 will only permit plp-style lpc-based representation,
                 which will consist of inverse dft followed
                 by autocorrelation-based lpc analysis and an
                 lpc to cepstrum recursion. */

              cepstrum = lpccep(pptr, ras_postaspectrum);
              return( cepstrum );
           }
           else
           {
              return( ras_postaspectrum );
           }
         } 
         else
         {
            return(ras_nl_aspectrum);    /* return the critical band energies
                                            after bandpass filtering   */
         }
          
}