INT16 CGEN_PUBLIC CFBAproc::GenPitch(CData *idProso, CData *idPitch) { INT32 i = 0; INT32 j = 0; INT32 nRecs = 0; INT32 nLastSample = 0; INT16 bVoiced = 0; INT32 nF0 = 0; INT32 nSamples = 0; INT32 nNextPeak = 0; INT32 nPm = 0; // Validation if (idPitch == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if (idProso == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if (idProso->IsEmpty() == TRUE) return IERROR(idProso,DATA_EMPTY,idProso->m_lpInstanceName,0,0); if (idProso->GetNComps()!=3 || !dlp_is_numeric_type_code(idProso->GetCompType(0)) || !dlp_is_numeric_type_code(idProso->GetCompType(1)) || !dlp_is_numeric_type_code(idProso->GetCompType(2)) ) return IERROR(idProso,FBA_BADINTO,idProso->m_lpInstanceName,0,0); // Initialization idPitch->Reset(); idPitch->AddComp("pm", T_SHORT); idPitch->AddComp("v/uv",T_SHORT); nRecs = idProso->GetNRecs(); // For every record in idProso for (i=0; i<nRecs; i++) { bVoiced = (INT16) idProso->Dfetch(i ,2 ); // unvoiced = 0 nF0 = (INT32) idProso->Dfetch(i ,1 ); // nF0 in hz nSamples = (INT32) idProso->Dfetch(i ,0 ) * m_nCrate ; // duration in samples nPm = (INT32) (m_nSrate / nF0); nLastSample = nLastSample + nSamples; while (nLastSample > nNextPeak) { IFCHECK printf("\n Write %s pitch starting from %ld %ld samples long.",bVoiced==0?"unvoiced":"bVoiced",(long)nNextPeak,(long)nPm); idPitch->AddRecs(1,FBA_GRANY); idPitch->Dstore(nPm, j, 0); idPitch->Dstore(bVoiced, j, 1); j++; nNextPeak= nPm + nNextPeak; } } return O_K; }
INT16 CGEN_PUBLIC CFBAproc::AlignFramesToPitch(CData *idPitch, CData *idFea, CData* idNewFea) { CData* idAuxF = NULL; INT32 nSamplesP = 0; INT32 nFea = 0; INT32 nPer = 0; INT32 i = 0; INT32 j = 0; if(m_nSync) return O_K; if(idFea == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if(idFea->IsEmpty()) return IERROR(idPitch,DATA_EMPTY,idPitch->m_lpInstanceName,0,0); if(idPitch == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if(idPitch->IsEmpty()) return IERROR(idPitch,DATA_EMPTY,idPitch->m_lpInstanceName,0,0); if(idPitch->GetNComps()!=2 || !dlp_is_numeric_type_code(idPitch->GetCompType(0)) || !dlp_is_numeric_type_code(idPitch->GetCompType(1))) { return IERROR(this,FBA_BADARG,idPitch,"idPitch","contains invalid data."); } CREATEVIRTUAL(CData,idFea,idNewFea); ICREATEEX(CData,idAuxF ,"~idAuxF" ,NULL); if(idFea->m_lpTable->m_fsr <= 0.0) { idFea->m_lpTable->m_fsr = 1000.0 * (FLOAT64)m_nCrate / (FLOAT64)m_nSrate; } nFea = idFea->GetNRecs(); for(i = 0, j = 0, nSamplesP = 0; i < idPitch->GetNRecs(); i++, nSamplesP+=nPer) { nPer = (INT32)idPitch->Dfetch(i,0); while((idFea->m_lpTable->m_fsr * (FLOAT64)(j+0.5)) < (1000.0 * (FLOAT64)nSamplesP / (FLOAT64)m_nSrate)) j++; j = (j>=nFea) ? nFea-1 : j; idAuxF->SelectRecs(idFea,j,1); idNewFea->Cat(idAuxF); } IDESTROY(idAuxF); DESTROYVIRTUAL(idFea, idNewFea); return O_K; }
/* * Manual page at fst_man.def */ INT16 CGEN_PUBLIC CFst_CopyUi(CFst* _this, CFst* itSrc, CData* idIndex, INT32 nPar) { INT32 i = 0; INT32 nU = 0; /* Validate */ CHECK_THIS_RV(NOT_EXEC); CFst_Check(_this); CFst_Check(itSrc); if (idIndex) { if (CData_IsEmpty(idIndex)) return NOT_EXEC; if (nPar<0) for (i=0; i<CData_GetNComps(idIndex); i++) if (dlp_is_numeric_type_code(CData_GetCompType(idIndex,i))) { nPar=i; break; } if ( nPar<0 || nPar>=CData_GetNComps(idIndex) || !dlp_is_numeric_type_code(CData_GetCompType(idIndex,nPar)) ) { return IERROR(_this,FST_BADID,"component",nPar,0); } } /* Initialize */ CREATEVIRTUAL(CFst,itSrc,_this); CFst_Reset(BASEINST(_this),TRUE); if (idIndex) { /* Loop over records of idIndex */ for (i=0; i<CData_GetNRecs(idIndex); i++) { nU = (INT32)CData_Dfetch(idIndex,i,nPar); if (nU>=0 && nU<UD_XXU(itSrc)) { DLPASSERT(OK(CFst_CatEx(_this,itSrc,nU,1))) } else IERROR(_this,FST_BADID2,"unit",nU,0); } } else if (nPar<0)
/* * Synthesis * * @return O_K if successfull, NOT_EXEC otherwise */ INT16 CGEN_PUBLIC CFBAproc::Synthesize(data *idFea, data *idControl, data *idSyn) { if((idFea != NULL) && (idSyn != NULL)) { if (idControl == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if (idFea == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if (idSyn == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if (idControl->IsEmpty()) return IERROR(idControl,DATA_EMPTY,idControl->m_lpInstanceName,0,0); if (idFea->IsEmpty()) return IERROR(idFea,DATA_EMPTY,idFea->m_lpInstanceName,0,0); if (idFea->GetCompType(0)!=T_DOUBLE) return IERROR(idFea,DATA_BADCOMPTYPE,0,idFea->m_lpInstanceName,"double"); if(dlp_is_numeric_type_code(idControl->GetCompType(0)) && dlp_is_numeric_type_code(idControl->GetCompType(1))) { if(SynthesizeUsingPM(idFea, idControl, idSyn) != O_K) return NOT_EXEC; } else if(dlp_is_symbolic_type_code(idControl->GetCompType(0)) && dlp_is_numeric_type_code (idControl->GetCompType(1)) && dlp_is_symbolic_type_code(idControl->GetCompType(2)) && dlp_is_numeric_type_code (idControl->GetCompType(3)) && dlp_is_numeric_type_code (idControl->GetCompType(4)) && dlp_is_symbolic_type_code(idControl->GetCompType(5)) && dlp_is_numeric_type_code (idControl->GetCompType(6)) && dlp_is_numeric_type_code (idControl->GetCompType(7))) { if(SynthesizeUsingInto(idFea, idControl, idSyn) != O_K) return NOT_EXEC; } else { IERROR(this,FBA_BADPITCH,idControl->m_lpInstanceName,0,0); return IERROR(this,FBA_BADINTO, idControl->m_lpInstanceName,0,0); } ISETFIELD_RVALUE(idSyn,"rinc",1000/m_nSrate); for(INT32 i = 0; i < idFea->GetNComps(); i++) { if(dlp_is_symbolic_type_code(idFea->GetCompType(i))) { idSyn->AddComp(idFea->GetCname(i),idFea->GetCompType(i)); } } idSyn->CopyLabels(idFea); } return O_K; }
/* * Manual page at statistics.def */ INT16 CGEN_PUBLIC CStatistics_Pool ( CStatistics* _this, CStatistics* iSrc, CData* idMap ) { INT32 i = 0; /* Current component index */ INT32 nC = 0; /* Current pooled statistics class */ INT32 nCs = 0; /* Current source class index */ INT32 nXC = 0; /* Number of pooled classes */ INT32 nRpb = 0; /* Statistics raw data block size */ INT16 nCheckSave = 0; /* Saved check level */ CData* idAux = NULL; /* Auxilary data instance #1 */ CData* idPmp = NULL; /* Pooling map */ CData* idPcd = NULL; /* Pooled class raw data buffer */ /* Initialize */ /* --------------------------------- */ CHECK_THIS_RV(0); /* Check this instance */ IF_NOK(CStatistics_Check(iSrc)) /* Check source statistics */ return IERROR(_this,ERR_INVALARG,"iSrc",0,0); /* ... */ nCheckSave = _this->m_nCheck; /* Save check level */ CStatistics_Reset(BASEINST(_this),TRUE); /* Reset destination */ _this->m_nCheck = nCheckSave; /* Restore check level */ IFIELD_RESET(CData,"dat"); /* Create pool raw stats. data inst. */ /* Protocol */ /* --------------------------------- */ IFCHECK /* On verbose level 1 */ { /* >> */ printf("\n"); dlp_fprint_x_line(stdout,'-',dlp_maxprintcols()); /* Print protocol header */ printf("\n statistics -pool"); /* ... */ printf("\n"); dlp_fprint_x_line(stdout,'-',dlp_maxprintcols());printf("\n");/* ... */ } /* << */ /* No map --> pool all classes */ /* --------------------------------- */ if (CData_IsEmpty(idMap)) /* NULL or empty map instance */ { /* >> */ IFCHECK printf("\n Empty pooling map --> pool all classes"); /* Protocol (verbose level 1) */ CStatistics_PoolInt(_this->m_idDat,iSrc->m_idDat,0); /* Pool sum data */ CStatistics_PoolInt(_this->m_idDat,iSrc->m_idDat,1); /* Pool min data */ CStatistics_PoolInt(_this->m_idDat,iSrc->m_idDat,2); /* Pool max data */ STA_PROTOCOL_FOOTER(1,"done"); /* Print protocol footer */ return O_K; /* That's it */ } IFCHECK printf("\n Pooling by map"); /* Protocol (verbose level 1) */ ICREATEEX(CData,idAux,"CStatistics_Pool.~idAux",NULL); /* Create auxilary data instance #1 */ ICREATEEX(CData,idPmp,"CStatistics_Pool.~idPmp",NULL); /* Create pooling map */ ICREATEEX(CData,idPcd,"CStatistics_Pool.~idPcs",NULL); /* Create pooled raw stats.data inst.*/ /* Find and copy map component (pooled class) */ /* --------------------------------- */ for (i=0; i<CData_GetNComps(idMap); i++) /* Loop over components of idMap */ if (dlp_is_numeric_type_code(CData_GetCompType(idMap,i))) /* Is current component numeric? */ { /* >> (Yes) */ CData_SelectComps(idPmp,idMap,i,1); /* Copy component */ break; /* Have ready :) */ } /* << */ if (CData_IsEmpty(idPmp)) /* Have not got map component */ { /* >> */ IERROR(_this,STA_BADCOMP,"map",BASEINST(idMap)->m_lpInstanceName,"numeric");/* Error message */ DLPTHROW(STA_BADCOMP); /* Throw exception */ } /* << */ /* Create source class component */ /* --------------------------------- */ CData_AddComp(idPmp,"srcc",T_LONG); /* Add source class index component */ for (i=0; i<CData_GetNRecs(idPmp); i++) CData_Dstore(idPmp,i,i,1); /* Fill it */ /* Finish pooling map and initialize pooling */ /* --------------------------------- */ CData_Sortup(idPmp,idPmp,0); /* Sort map by pooled class index */ nXC = (INT32)CData_Dfetch(idPmp,CData_GetNRecs(idPmp)-1,0)+1; /* Get greatest pooled class index */ IFCHECK printf("\n Pooling %ld statistics classes",(long)nXC); /* Protocol (verbose level 1) */ IFCHECKEX(3) CData_Print(idPmp); /* Print pooling map (verbose lvl.3) */ nRpb = CData_GetNRecsPerBlock(iSrc->m_idDat); /* Get block size */ /* Prepare pooled statistics */ /* --------------------------------- */ CData_Scopy(_this->m_idDat,iSrc->m_idDat); /* Create target raw data components */ CData_Allocate(_this->m_idDat,nRpb*nXC); /* Allocate target raw data */ CData_SetNBlocks(_this->m_idDat,nXC); /* Set target statistics block number*/ /* Pooling loop */ /* --------------------------------- */ for (i=0; i<CData_GetNRecs(idPmp); ) /* Loop over pooling map */ { /* >> */ /* - Copy raw statistics data of one pooled class */ /* - - - - - - - - - - - - - - - - */ nC = (INT32)CData_Dfetch(idPmp,0,0); /* Get pooled class index */ IFCHECK printf("\n Pooled class %3ld"); /* Protocol (verbose level 1) */ for (i=0; i<CData_GetNRecs(idPmp); i++) /* Loop over partition of pool.map */ { /* >> */ if (nC != (INT32)CData_Dfetch(idPmp,0,0)) break; /* Not the current class anymore */ nCs = (INT32)CData_Dfetch(idPmp,i,1); /* Get source class index */ IFCHECK printf("\n - Source class %3ld",nCs); /* Protocol (verbose level 1) */ CData_SelectBlocks(idAux,iSrc->m_idDat,nCs,1); /* Copy raw stats. data block */ CData_Cat(idPcd,idAux); /* Append to buffer */ } /* << */ /* - Pool data */ /* - - - - - - - - - - - - - - - - */ CData_SetNBlocks(idPcd,CData_GetNRecs(idPcd)/nRpb); /* Set block count of aggr. buffer */ IFCHECK /* Protocol (verbose level 1) */ printf("\n - Aggregating %ld statistics classes", /* | */ (long)CData_GetNBlocks(idPcd)); /* | */ CStatistics_PoolInt(idAux,idPcd,0); /* Pool sum data */ CStatistics_PoolInt(idAux,idPcd,1); /* Pool min data */ CStatistics_PoolInt(idAux,idPcd,2); /* Pool max data */ /* - Store pooled raw statistics data block */ /* - - - - - - - - - - - - - - - - */ dlp_memmove /* Copy pooled raw stats. data */ ( /* | */ CData_XAddr(_this->m_idDat,nC*nRpb,0), /* | To target statistics block */ CData_XAddr(idAux,0,0), /* | From aggregation buffer */ CData_GetNRecs(idAux)*CData_GetRecLen(idAux) /* | Length of aggregation buffer */ ); /* | */ /* - Clean up auxilary instances */ /* - - - - - - - - - - - - - - - - */ CData_Reset(idPcd,TRUE); /* Clear aggregation buffer */ } /* Clean up */ /* --------------------------------- */ IDESTROY(idAux); /* Destroy auxilary data instance #1 */ IDESTROY(idPmp); /* Destroy pooling map */ IDESTROY(idPcd); /* Destroy pooled cls. raw data inst.*/ STA_PROTOCOL_FOOTER(1,"done"); /* Print protocol footer */ return O_K; /* Ok */ DLPCATCH(STA_BADCOMP) /* == Catch STA_BADCOMP exception */ IDESTROY(idAux); /* Destroy auxilary data instance #1 */ IDESTROY(idPmp); /* Destroy pooling map */ IDESTROY(idPcd); /* Destroy pooled cls. raw data inst.*/ STA_PROTOCOL_FOOTER(1,"FAILED"); /* Print protocol footer */ return NOT_EXEC; /* Not ok */ }
/** * Prints one block of the instance in vector mode (standard). */ INT32 CGEN_PRIVATE CData_PrintVectors_Block ( CData* _this, /* Pointer to data instance */ INT32 nBlock /* Block index (<0: ignore blocks) */ ) /* Returns number of lines printed */ { INT32 i = 0; /* Universal loop counter */ INT32 nR = 0; /* Current record */ INT32 nR_ = 0; /* First record to be printed */ INT32 nR0 = 0; /* First record of current page */ INT32 nSR = 0; /* Number of records of currenr page */ INT32 nXR = 0; /* Last record to print plus one */ INT32 nC = 0; /* Current component */ INT32 nXC = 0; /* Number of components */ INT32 nWI = 0; /* Component index column width */ INT32 nW0 = 0; /* Head column width */ INT32 nW = 0; /* Column width */ INT32 nP = 0; /* Current page */ INT32 nPps = 0; /* Pages per screen */ INT32 nL = 0; /* Line counter */ BOOL bPur = FALSE; /* Print physical record unit flag */ BOOL bPuc = FALSE; /* Print physical component unit flg.*/ FLOAT64 nBuf = 0.; /* Double buffer */ char sBuf[L_SSTR+1]; /* String buffer */ /* Validate */ /* --------------------------------- */ if (nBlock>=CData_GetNBlocks(_this)) return 0; /* Requested block does not exist */ /* Initialize */ /* --------------------------------- */ nR_ = nBlock>=0 ? CData_GetNRecsPerBlock(_this)*nBlock : 0; /* Get first record to print */ nXR = nBlock>=0 ? nR_+CData_GetNRecsPerBlock(_this) : CData_GetNRecs(_this); /* Get number of records */ nXC = CData_GetNComps(_this); /* Get number of components */ bPur = _this->m_lpTable->m_fsr!=1. && _this->m_lpTable->m_fsr!=0.; /* Displaying physical record units? */ bPuc = _this->m_nCinc!=1. && _this->m_nCinc!=0.; /* Displaying physical comp. units? */ nPps = dlp_maxprintlines()/(nXC+4); /* Compute no. of pages per sceeen */ /* Print vectors */ /* --------------------------------- */ if (nBlock>=0) /* Printing blockwise? */ { /* >> */ printf("\n Block %ld (offset %ld)",(long)nBlock,(long)nR_); /* Show current block index */ dlp_inc_printlines(1); nL++; /* Adjust number of printed lines */ } /* << */ for (nR0=nR_; nR0<nXR; ) /* Loop over records */ { /* >> */ CData_PrintVectors_GetColWidth(_this,nR0,0,&nWI,&nW0,&nW); /* Comp. head and data col. widths */ nSR = (dlp_maxprintcols()-nWI-nW0-4)/(nW+1); /* Number of columns to print */ if (nR0+nSR>nXR) nSR = nXR-nR0; /* No more than there are records! */ /* Print record header */ /* - - - - - - - - - - - - - - - - */ if (bPur) /* Display physical record units? */ { /* >> */ printf("\n %s ->",__pad(strcpy(sBuf,_this->m_lpRunit),nW0+nWI,'r')); /* Print name of physical unit */ for (nR=nR0; nR<nR0+nSR; nR++) /* Loop over remaining records */ { /* >> */ nBuf = _this->m_lpTable->m_ofs + (nR-nR_)*_this->m_lpTable->m_fsr; /* Compute abscissa value */ __sprintx(sBuf,&nBuf,T_DOUBLE,_this->m_bExact); /* Print to a string */ printf("%s ",__pad(sBuf,nW,'r')); /* Format and print to screen */ } /* << */ dlp_inc_printlines(1); nL++; /* Adjust number of printed lines*/ } /* << */ sBuf[0]='\0'; /* Clear string buffer */ if (bPuc) sprintf(sBuf,"%s| ",_this->m_lpCunit); /* Print phys. comp. unit name... */ printf("\n %s",__pad(sBuf,nW0+nWI+3,'r')); /* ... or empty string */ for (nR=nR0; nR<nR0+nSR; nR++) /* Loop over remaining records */ { /* >> */ i=nR-nR_; __sprintx(sBuf,&i,T_INT,_this->m_bExact); /* Print record index to a str. */ printf("%s%c",__pad(sBuf,nW,'r'),CData_RecIsMarked(_this,nR)?'*':' '); /* Format and print to screen */ } /* << */ sBuf[0]='\0'; /* Clear string buffer */ if (bPuc) sprintf(sBuf,"%c ",bPuc?'v':' '); /* Print down arrow ... */ printf("\n %s",__pad(sBuf,nW0+nWI+3,'r')); /* ... or empty string */ sBuf[0]='\0'; for (i=0; i<nW; i++) sBuf[i]='.'; sBuf[i]='\0'; /* Make horizonal delimiter */ for (nR=nR0; nR<nR0+nSR; nR++) printf("%s ",sBuf); /* Print one per vector */ dlp_inc_printlines(2); nL+=2; /* Adjust number of printed lines */ /* Print data */ /* - - - - - - - - - - - - - - - - */ for (nC=0; nC<nXC; ) /* Loop over components */ { /* >> */ __sprintx(sBuf,&nC,T_INT,_this->m_bExact); /* Print comp. index to a string */ printf("\n%c%s ", /* Format and print to screen */ CData_CompIsMarked(_this,nC)?'*':' ',__pad(sBuf,nWI,'r')); /* | (incl. "*" for "marked") */ if (bPuc && dlp_is_numeric_type_code(CData_GetCompType(_this,nC))) /* Display ordinate value? */ { /* >> */ nBuf = _this->m_nCofs + nC*_this->m_nCinc; /* Compute it */ __sprintx(sBuf,&nBuf,T_DOUBLE,_this->m_bExact); /* Print it to a string */ } /* << */ else strcpy(sBuf,CData_GetCname(_this,nC)); /* else display component name */ printf("%s: ",__pad(dlp_strtrimleft(dlp_strtrimright(sBuf)),nW0,'r')); /* Format and print to screen */ for (nR=nR0; nR<nR0+nSR; nR++) /* Loop over remaining records */ { /* >> */ __sprintx(sBuf,CData_XAddr(_this,nR,nC), /* Print cell value to a str. */ CData_GetCompType(_this,nC),_this->m_bExact); /* | */ if (dlp_is_symbolic_type_code(CData_GetCompType(_this,nC))) /* Is string value */ if ((INT32)dlp_strlen(sBuf)>nW) /* Will not fit in column */ dlp_strabbrv(sBuf,sBuf,nW); /* Abbreviate it */ if (dlp_is_numeric_type_code(CData_GetCompType(_this,nC))) /* Is numeric value */ if (_this->m_bNz && CMPLX_EQUAL(CData_Cfetch(_this,nR,nC),CMPLX(0.))) dlp_strcpy(sBuf,"-"); printf("%s%c",__pad(sBuf,nW,'r'), /* Format and print to screen */ CData_CellIsMarked(_this,nR*CData_GetNComps(_this)+nC)?'*':' '); /* | (incl. "*" for "marked") */ } /* << */ dlp_inc_printlines(1); nL++; /* Adjust number of printed lines*/ /* Break component listing */ /* - - - - - - - - - - - - - - - */ if (nPps==0) /* Not all comps. fit on screen */ { /* >> */ sprintf(sBuf,"component (0..%ld), cancel -3",(long)nXC-1); /* Make user hint */ if ((nC=dlp_printstop_nix(nC,sBuf,NULL))==-1) break; /* Break listing */ if (nC< -2 ) return -1; /* Cancelled by user */ if (nC>=nXC) break; /* No more components -> break */ } /* << */ else nC++; /* No breaking -> count comps. */ } /* << */ nR0+=nSR; /* First record on next page */ nP++; /* Count pages */ if (nR0<nXR) /* There are more records */ { /* >> */ printf("\n"); dlp_fprint_x_line(stdout,'-',dlp_maxprintcols()); /* Print a separator */ dlp_inc_printlines(1); nL++; /* Adjust number of printed lines*/ } /* << */ /* Break record listing */ /* - - - - - - - - - - - - - - - - */ if (((nPps>0 && nP>=nPps) || nPps==0) && nR0<nXR) /* Complicated break condition :) */ { /* >> */ dlp_inc_printlines(dlp_maxprintlines()); /* Do stop right here */ sprintf(sBuf,"record (%ld..%ld)%s",(long)nR_,(long)nXR-1, /* Make user hint */ nBlock>=0?", cancel -3":""); /* | */ if ((nR0=dlp_printstop_nix(--nR0,sBuf,NULL))==-1) break; /* Break listing */ if (nR0< -2 ) return -1; /* Cancelled by user */ if (nR0< nR_) nR0=nR_; /* No previous blocks, please! */ if (nR0>=nXR) break; /* No more records -> break */ nP=0; /* Reset page counter */ } /* << */ } /* << */ return nL; /* Return number of printed lines */ }
/** * Computes the print widths of the head column and one data vector. */ INT16 CGEN_PRIVATE CData_PrintVectors_GetColWidth ( CData* _this, /* Pointer to data instance */ INT32 nR0, /* First record to be printed */ INT32 nC0, /* First component to be printed */ INT32* lpnWI, /* Print width of comp.idx.col.(ret) */ INT32* lpnW0, /* Print width of head column (ret) */ INT32* lpnW /* Print width of data column (ret) */ ) /* Returns O_K or (neg.) error code */ { INT32 nR = 0; /* Current record */ INT32 nXR = 0; /* Number of records */ INT32 nC = 0; /* Current component */ INT32 nXC = 0; /* Number of components */ INT32 nWn = 0; /* Widest number in cols. of screen */ INT32 nWs = 0; /* Widest string in cols. of screen */ FLOAT64 nBuf = 0.; /* Double buffer */ char sBuf[L_SSTR+1]; /* String buffer */ UINT64 nTime = 0; /* Initialize */ /* --------------------------------- */ *lpnW = 0; /* Data column width */ *lpnWI = 0; /* Component index column width */ *lpnW0 = 0; /* Head column width */ nXR = CData_GetNRecs(_this); /* Get number of records */ nXC = CData_GetNComps(_this); /* Get number of components */ /* Compute head column print width */ /* --------------------------------- */ for (*lpnW0=0,nC=nC0; nC<nXC; nC++) /* Loop over remaining components */ { /* >> */ if /* Displaying physical units? */ ( /* | */ dlp_is_numeric_type_code(CData_GetCompType(_this,nC)) && /* | Numeric component */ dlp_strlen(_this->m_lpCunit) && _this->m_nCinc!=0. /* | Physical units specified */ ) /* | */ { /* >> */ nBuf = _this->m_nCofs + nC*_this->m_nCinc; /* The physical coordinate */ __sprintx(sBuf,&nBuf,T_DOUBLE,_this->m_bExact); /* Print to a string */ } /* << */ else /* String comp. or no phys. units */ __sprintx(sBuf,CData_GetCname(_this,nC),10,_this->m_bExact); /* Print component name to str. */ *lpnW0 = MAX(*lpnW0,(INT32)dlp_strlen(sBuf)); /* Get length of phys. unit / name */ } /* << */ /* Compute component index column print width */ /* --------------------------------- */ nC--; /* Last component to be printed */ __sprintx(sBuf,&nC,T_INT,_this->m_bExact); /* Print greatest comp. index to str.*/ *lpnWI = (INT32)dlp_strlen(sBuf); /* Get length of component index col.*/ /* Compute data vector print width */ /* --------------------------------- */ nTime = dlp_time(); for (*lpnW=0,nR=nR0; nR<nXR; nR++) /* Loop over remaining records */ { /* >> */ /* Determine width of physical unit */ /* - - - - - - - - - - - - - - - - */ if (dlp_strlen(_this->m_lpRunit) && _this->m_lpTable->m_fsr!=0.) /* Displaying physical units? */ { /* >> */ nBuf = _this->m_lpTable->m_ofs + nR*_this->m_lpTable->m_fsr; /* The physical coordinate */ __sprintx(sBuf,&nBuf,T_DOUBLE,_this->m_bExact); /* Print to a string */ *lpnW = MAX((INT32)dlp_strlen(sBuf),*lpnW); /* Aggregate actual print width */ } /* << */ /* Determine width of record index */ /* - - - - - - - - - - - - - - - - */ __sprintx(sBuf,&nR,T_INT,_this->m_bExact); /* Print record index to a string */ *lpnW = MAX((INT32)dlp_strlen(sBuf),*lpnW); /* Aggregate actual print width */ /* Determine greatest component width */ /* - - - - - - - - - - - - - - - - */ for (nC=nC0; nC<nXC; nC++) /* Loop over remaining components */ { /* >> */ __sprintx(sBuf,CData_XAddr(_this,nR,nC), /* Print cell value to a string */ CData_GetCompType(_this,nC),_this->m_bExact); /* | */ if (dlp_is_numeric_type_code(CData_GetCompType(_this,nC))) /* It is a number */ nWn = MAX((INT32)dlp_strlen(sBuf),nWn); /* Aggr. number print width */ else if (dlp_is_symbolic_type_code(CData_GetCompType(_this,nC))) /* It is a string */ nWs = MAX((INT32)dlp_strlen(sBuf),nWs); /* Aggr. string print width */ if (dlp_time()-nTime>__TIMEOUT) break; /* Takes too long -> forget it! */ } /* << */ if (dlp_time()-nTime>__TIMEOUT) break; /* Takes too long -> forget it! */ if ((nR-nR0+2)*((*lpnW)+1)>dlp_maxprintcols()-*lpnWI-*lpnW0-3) break; /* Next vec. would not fit anymore*/ } /* << */ /* If computing data vector print width timed out ... */ /* --------------------------------- */ if (dlp_time()-nTime>__TIMEOUT) /* There was a time out */ for (nC=nC0; nC<nXC; nC++) /* Loop over remaining components */ if (dlp_is_numeric_type_code(CData_GetCompType(_this,nC))) /* It is a number */ nWn = MAX(dlp_printlen(CData_GetCompType(_this,nC)),nWn); /* Use standard print width */ else if (dlp_is_symbolic_type_code(CData_GetCompType(_this,nC))) /* It is a string */ nWs = MAX(dlp_printlen(CData_GetCompType(_this,nC)),nWs); /* Also use std. print width */ /* Aftermath */ /* --------------------------------- */ if (nWs>dlp_maxprintcols()-(*lpnW0)-(*lpnWI)-3) /* Limit string width to line length */ nWs=dlp_maxprintcols()-(*lpnW0)-(*lpnWI)-3; /* ... */ if (nWn<=0) *lpnW = MAX(nWs,*lpnW); /* No numbers -> complete strings */ else *lpnW = MAX(nWn,*lpnW); /* Minimal space req. for numbers */ /*if (nWn>0 && *lpnW+3<nWs) (*lpnW) += 3;*/ /* Print a little more of the strs. */ if (nWn>0 && *lpnW<nWs) *lpnW = MIN(16,nWs); /* Print max. 16 chars. of strings */ return O_K; /* Ok */ }
/* * Resample voiced parts of pitch to match a given mean fundamential frequency. * The length of voiced segments is preserved to avoid loss of synchronization * between pitch and corresponding signal * * @param idPitch Source data instance containing original pitch * @param idNewPitch Target data instance containing new pitch * @param nFFreq Target fundamential frequency (mean over voiced parts) */ INT16 CGEN_PUBLIC CFBAproc::ResamplePitch(CData *idPitch, CData *idNewPitch, INT32 nFFreq) { INT16 bVoiced = FALSE; INT32 i = 0; INT32 k = 0; INT32 nCount = 0; INT32 nStartL = 0; FLOAT32 nTargetPeriodLength = (FLOAT32)m_nSrate/(FLOAT32)nFFreq; FLOAT32 nMeanPeriodLengthL = 0.0; FLOAT32 nMeanPeriodLength = 0.0; CData* idVoiced = NULL; CData* idAux = NULL; // Validation if(idPitch == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if(idPitch->IsEmpty()) return IERROR(idPitch,DATA_EMPTY,idPitch->m_lpInstanceName,0,0); if(nFFreq<50||nFFreq>500) return IERROR(this,FBA_BADARG,nFFreq,"nFFreq","a value between 50 and 500"); if ( idPitch->GetNComps()!=2 || !dlp_is_numeric_type_code(idPitch->GetCompType(0)) || !dlp_is_numeric_type_code(idPitch->GetCompType(1)) ) { return IERROR(this,FBA_BADARG,idPitch,"idPitch","contains invalid data."); } // Initialization CREATEVIRTUAL(CData,idPitch,idNewPitch); ICREATEEX(CData,idVoiced,"~idVoiced",NULL); ICREATEEX(CData,idAux ,"~idAux" ,NULL); idNewPitch->Reset(); idVoiced->AddComp("start",T_INT); idVoiced->AddComp("count",T_INT); idVoiced->AddComp("mplen",T_FLOAT); idVoiced->Alloc(10); // Determine start and length of voiced parts and mean of periods in samples for(i=0; i<idPitch->GetNRecs(); i++) { if(idPitch->Dfetch(i,1)>0) { if(bVoiced==FALSE) // Start of new voiced segment { bVoiced=TRUE; nStartL=i; nMeanPeriodLengthL=0; if(idVoiced->GetNRecs()==idVoiced->GetMaxRecs()) idVoiced->Realloc(idVoiced->GetNRecs()+10); idVoiced->IncNRecs(1); idVoiced->Dstore(i,idVoiced->GetNRecs()-1,0); } nMeanPeriodLength+=(INT32)idPitch->Dfetch(i,0); nMeanPeriodLengthL+=(INT32)idPitch->Dfetch(i,0); nCount++; } else if(bVoiced==TRUE) // End of voiced segment { bVoiced=FALSE; nMeanPeriodLengthL=nMeanPeriodLengthL/(FLOAT32)(i-nStartL); idVoiced->Dstore(i-nStartL,idVoiced->GetNRecs()-1,1); idVoiced->Dstore(nMeanPeriodLengthL,idVoiced->GetNRecs()-1,2); } } nMeanPeriodLength=nMeanPeriodLength/(FLOAT32)nCount; IFCHECK idVoiced->Print(); IFCHECK printf("\n Input mean period length in voiced parts: %f",nMeanPeriodLength); IFCHECK printf("\n Target mean period length: %f",nTargetPeriodLength); // Resample for(i=0,nStartL=0; i<idVoiced->GetNRecs(); i++) { INT32 j = 0; INT32 nSum = 0; INT32 nSumNew = 0; INT32 nDiff = 0; // Copy unvoiced idAux->SelectRecs(idPitch,nStartL,(INT32)idVoiced->Dfetch(i,0)-nStartL); idNewPitch->Cat(idAux); nStartL=(INT32)idVoiced->Dfetch(i,0)+(INT32)idVoiced->Dfetch(i,1); // Resample voiced idAux->SelectRecs(idPitch,(INT32)idVoiced->Dfetch(i,0),(INT32)idVoiced->Dfetch(i,1)); for(j=0,nSum=0;j<idAux->GetNRecs();j++) nSum+=(INT32)idAux->Dfetch(j,0); // Target sum idAux->Resample(idAux,nMeanPeriodLength/nTargetPeriodLength); idAux->Tconvert(idAux,T_FLOAT); idAux->Scalop(idAux,CMPLX(nTargetPeriodLength/nMeanPeriodLength),"mult"); idAux->Tconvert(idAux,T_INT); //DLPASSERT(FALSE); do { nSumNew=0; for(j=0,nSumNew=0;j<idAux->GetNRecs();j++) nSumNew+=(INT32)idAux->Dfetch(j,0); // New sum nDiff=nSumNew-nSum; // Distribute difference IFCHECK printf("\n Distribute difference d=%ld",(long)nDiff); for(j=0;j<idAux->GetNRecs()&&j<abs(nDiff);j++) { INT32 nValue = (INT32)idAux->Dfetch(j,0); if(nDiff<0) nValue+=1; else if(nDiff>0) nValue-=1; idAux->Dstore(nValue,j,0); } } while(nDiff!=0); //idAux->Fill_Int(1.0,0.0,1); for(k=0;k<idAux->GetNRecs();k++) idAux->Dstore(1.0,k,1); idNewPitch->Cat(idAux); } // Append last unvoiced segment nStartL = (INT32)idVoiced->Dfetch(idVoiced->GetNRecs()-1,0)+(INT32)idVoiced->Dfetch(idVoiced->GetNRecs()-1,1); idAux->SelectRecs(idPitch,nStartL,idPitch->GetNRecs()-nStartL); idNewPitch->Cat(idAux); DESTROYVIRTUAL(idPitch,idNewPitch); IDESTROY(idVoiced); IDESTROY(idAux); return O_K; }
INT16 CGEN_PUBLIC CFBAproc::AdjustSpeechRate(CData *idPitch, CData *idNewPitch, CData* idFea, CData* idNewFea, FLOAT32 rate) { INT16 bVoiced = FALSE; INT32 i = 0; INT32 k = 0; INT32 nCount = 0; INT32 nStartL = 0; FLOAT32 nMeanPeriodLengthL = 0.0; FLOAT32 nMeanPeriodLength = 0.0; CData* idVoiced = NULL; CData* idAuxP = NULL; CData* idAuxF = NULL; // Validation if(idPitch == NULL) return IERROR(this,ERR_NULLINST,0,0,0); if(idPitch->IsEmpty()) return IERROR(idPitch,DATA_EMPTY,idPitch->m_lpInstanceName,0,0); if ( idPitch->GetNComps()!=2 || !dlp_is_numeric_type_code(idPitch->GetCompType(0)) || !dlp_is_numeric_type_code(idPitch->GetCompType(1)) ) { return IERROR(this,FBA_BADARG,idPitch,"idPitch","contains invalid data."); } // Initialization CREATEVIRTUAL(CData,idPitch,idNewPitch); CREATEVIRTUAL(CData,idFea,idNewFea); ICREATEEX(CData,idVoiced,"~idVoiced",NULL); ICREATEEX(CData,idAuxP ,"~idAuxP" ,NULL); ICREATEEX(CData,idAuxF ,"~idAuxF" ,NULL); idNewPitch->Reset(); idVoiced->AddComp("start",T_INT); idVoiced->AddComp("count",T_INT); idVoiced->AddComp("mplen",T_FLOAT); idVoiced->Alloc(10); AlignFramesToPitch(idPitch, idFea, idFea); // Determine start and length of voiced parts and mean of periods in samples for(i=0; i<idPitch->GetNRecs(); i++) { if(idPitch->Dfetch(i,1)>0) { if(bVoiced==FALSE) // Start of new voiced segment { bVoiced=TRUE; nStartL=i; nMeanPeriodLengthL=0; if(idVoiced->GetNRecs()==idVoiced->GetMaxRecs()) idVoiced->Realloc(idVoiced->GetNRecs()+10); idVoiced->IncNRecs(1); idVoiced->Dstore(i,idVoiced->GetNRecs()-1,0); } nMeanPeriodLength+=(INT32)idPitch->Dfetch(i,0); nMeanPeriodLengthL+=(INT32)idPitch->Dfetch(i,0); nCount++; } else if(bVoiced==TRUE) // End of voiced segment { bVoiced=FALSE; nMeanPeriodLengthL=nMeanPeriodLengthL/(FLOAT32)(i-nStartL); idVoiced->Dstore(i-nStartL,idVoiced->GetNRecs()-1,1); idVoiced->Dstore(nMeanPeriodLengthL,idVoiced->GetNRecs()-1,2); } } nMeanPeriodLength=nMeanPeriodLength/(FLOAT32)nCount; IFCHECK idVoiced->Print(); IFCHECK printf("\n Input mean period length in voiced parts: %f",nMeanPeriodLength); // Resample for(i=0,nStartL=0; i<idVoiced->GetNRecs(); i++) { INT32 j = 0; INT32 nSum = 0; INT32 nRecOld = 0; INT32 nRecNew = 0; // Copy unvoiced idAuxP->SelectRecs(idPitch,nStartL,(INT32)idVoiced->Dfetch(i,0)-nStartL); idNewPitch->Cat(idAuxP); idAuxF->SelectRecs(idFea,nStartL,(INT32)idVoiced->Dfetch(i,0)-nStartL); idNewFea->Cat(idAuxF); nStartL=(INT32)idVoiced->Dfetch(i,0)+(INT32)idVoiced->Dfetch(i,1); // Resample voiced idAuxP->SelectRecs(idPitch,(INT32)idVoiced->Dfetch(i,0),(INT32)idVoiced->Dfetch(i,1)); nRecOld = idAuxP->GetNRecs(); for(j=0,nSum=0;j<nRecOld;j++) nSum+=(INT32)idAuxP->Dfetch(j,0); // Target sum idAuxP->Resample(idAuxP, rate); nRecNew = idAuxP->GetNRecs(); for(j=0;j<nRecNew;j++) { INT32 tmp = (INT32)idAuxP->Dfetch(j,0); tmp = (INT32)MAX(m_nSrate/500, tmp); tmp = (INT32)MIN(m_nSrate/50, tmp); idAuxP->Dstore(tmp,j,0); } //idAux->Fill_Int(1.0,0.0,1); for(k=0;k<nRecNew;k++) idAuxP->Dstore(1.0,k,1); for(k=0;k<nRecNew;k++) { j = (INT32)((FLOAT64)k * (FLOAT64)nRecOld / (FLOAT64)nRecNew + 0.5); idAuxF->SelectRecs(idFea,j+(INT32)idVoiced->Dfetch(i,0),1); idNewFea->Cat(idAuxF); } idNewPitch->Cat(idAuxP); } // Append last unvoiced segment nStartL = (INT32)idVoiced->Dfetch(idVoiced->GetNRecs()-1,0)+(INT32)idVoiced->Dfetch(idVoiced->GetNRecs()-1,1); idAuxP->SelectRecs(idPitch,nStartL,idPitch->GetNRecs()-nStartL); idNewPitch->Cat(idAuxP); idAuxF->SelectRecs(idFea,nStartL,idPitch->GetNRecs()-nStartL); idNewFea->Cat(idAuxF); DESTROYVIRTUAL(idPitch,idNewPitch); DESTROYVIRTUAL(idFea,idNewFea); IDESTROY(idVoiced); IDESTROY(idAuxP); IDESTROY(idAuxF); return O_K; }
/* * Manual page at statistics.def */ INT16 CGEN_PUBLIC CStatistics_Update ( CStatistics* _this, CData* idVec, INT32 nIcLab, CData* idW ) { INT32 i = 0; /* Update vector loop counter */ INT32 I = 0; /* Number of update vectors */ INT32 c = 0; /* Class of current update vector */ INT32 C = 0; /* Number of classes */ INT32 n = 0; /* Dimension loop counter */ INT32 N = 0; /* Statistics' dimensionality */ FLOAT64 w = 0.; /* Weight of current update vector */ char* lpsLab = NULL; /* Symbolic label of curr. upd. vec. */ FLOAT64* lpX = NULL; /* Vector copy buffer */ INT32 nVecIgnored = 0; /* Number of ignored vectors */ /* Validate */ /* --------------------------------- */ CHECK_THIS_RV(NOT_EXEC); /* Check this pointer */ IF_NOK(CStatistics_Check(_this)) /* Check instance data */ return IERROR(_this,STA_NOTSETUP," ( use -status for details)",0,0); /* ... */ if (CData_IsEmpty(idVec)) return O_K; /* No input vector(s), no service! */ I = CData_GetNRecs(idVec); /* Get number of update vectors */ C = CStatistics_GetNClasses(_this); /* Get number of statitistics classes*/ N = CStatistics_GetDim(_this); /* Get statistics vector dimension */ if (C>1) /* Multiclass statistics needs labels*/ { /* >> */ if (_this->m_idLtb) /* Need symbolic labels */ { /* >> */ if ((nIcLab<0 || nIcLab>=CData_GetNComps(idVec))) /* Symbolic label comp. not spec.*/ for (nIcLab=0; nIcLab<CData_GetNComps(idVec); nIcLab++) /* Seek label component */ if (dlp_is_symbolic_type_code(CData_GetCompType(idVec,nIcLab))) /* ... */ break; /* ... */ if (!dlp_is_symbolic_type_code(CData_GetCompType(idVec,nIcLab))) /* Symbolic label comp. not found*/ return /* -> Error */ IERROR(_this,STA_BADCOMP,"Label",idVec->m_lpInstanceName,"symbolic"); /* | */ } /* << */ else /* Need numeric labels */ { /* >> */ if (!dlp_is_numeric_type_code(CData_GetCompType(idVec,nIcLab)) && /* Numeric label comp. not found */ (nIcLab>=0 || CData_GetNComps(idW)!=C)) /* | */ return /* -> Error */ IERROR(_this,STA_BADCOMP,"Label",idVec->m_lpInstanceName,"numeric"); /* | */ } /* << */ } /* << */ /*else if (nIcLab>=0) IERROR(_this,STA_IGNORE,"label component",0,0); / * Only one class -> ignore labels */ if (dlp_is_numeric_type_code(CData_GetCompType(idVec,nIcLab))) /* Check no. of comps. in idVec ... */ { /* >> */ if (CData_GetNNumericComps(idVec)!=N+1) /* Wrong number of numeric comps. */ IERROR(_this,STA_DIM,idVec->m_lpInstanceName,"numeric components",N+1); /* -> Warning */ } /* << */ else if (CData_GetNNumericComps(idVec)!=N) /* Wrong number of numeric comps. */ IERROR(_this,STA_DIM,idVec->m_lpInstanceName,"numeric components",N); /* -> Warning */ if (idW) /* Weigths passed -> check 'em */ { /* >> */ if (!dlp_is_numeric_type_code(CData_GetCompType(idW,0))) /* Component 0 not numeric */ return /* -> Error */ IERROR(_this,STA_BADCOMP,"Weight",idW->m_lpInstanceName,"numeric"); /* | */ if (CData_GetNComps(idW)!=1 && CData_GetNComps(idW)!=C) /* More than one component */ IERROR(_this,STA_IGNORE,"components in weight sequence",0,0); /* -> Warning */ if (CData_GetNRecs(idW)!=I) /* Not exactly one weight per vec. */ IERROR(_this,STA_DIM,idW->m_lpInstanceName,"records",I); /* -> Warning */ } /* << */ /* Initialize - NO RETURNS BEYOND THIS POINT! - */ /* --------------------------------- */ lpX = (FLOAT64*)dlp_calloc(N,sizeof(FLOAT64)); /* Allocate vector copy buffer */ /* Update statistics */ /* --------------------------------- */ for (i=0; i<I; i++) /* Loop over update vectors */ { /* >> */ /* Get vector label */ /* - - - - - - - - - - - - - - - - */ if (C>1) /* Multiclass stats. needs labels */ { /* >> */ if (_this->m_idLtb) /* idVec contains symbolic labs. */ { /* >> */ INT32 nLIdx = 0; DLPASSERT(dlp_is_symbolic_type_code(CData_GetCompType(idVec,nIcLab))); /* Must be checked before! */ lpsLab = (char*)CData_XAddr(idVec,i,nIcLab); /* Get string ptr. to label */ if(_this->m_bLabel){ nLIdx=strlen(lpsLab)-1; if(nLIdx && lpsLab[nLIdx]==']') nLIdx--; else nLIdx=0; if(nLIdx && lpsLab[nLIdx]>='0' && lpsLab[nLIdx]<='9') nLIdx--; else nLIdx=0; while(nLIdx && lpsLab[nLIdx]>='0' && lpsLab[nLIdx]<='9') nLIdx--; if(nLIdx && lpsLab[nLIdx]=='[') lpsLab[nLIdx]='\0'; else nLIdx=0; } c = CData_Find(_this->m_idLtb,0,C,1,0,lpsLab); /* Look up label -> class idx. */ if(nLIdx) lpsLab[nLIdx]='['; if (c<0) /* Label invalid */ { /* >> */ IERROR(_this,STA_SLAB,i,lpsLab?lpsLab:"(null)",0); /* Warning */ continue; /* Ignore record */ } /* << */ } /* << */ else if(nIcLab>=0) /* idVec contains numeric labs. */ { /* >> */ c = (INT32)CData_Dfetch(idVec,i,nIcLab); /* Fetch label */ if (c<0 || c>=C) /* Label invalid */ { /* >> */ IERROR(_this,STA_NLAB,i,c,0); /* Warning */ continue; /* Ignore record */ } /* << */ } /* << */ else c = 0; /* Default class is 0 */ } /* << */ else c = 0; /* Default class is 0 */ do /* Loop over classes */ { /* >> */ /* Get (weighted) update vector and update statistics */ /* - - - - - - - - - - - - - - - - */ if (idW) /* Using weights */ { /* >> */ w = CData_Dfetch(idW,i,_this->m_idLtb || nIcLab>=0 ? 0 : c); /* Fetch weight for this vector */ if(w==0.) continue; /* Nothing to do if no weight */ _this->m_bWeighted=TRUE; } else w=1.; /* << */ CData_DrecFetch(idVec,lpX,i,N,nIcLab); /* Fetch update vector */ fpclassify(0.); for (n=0; n<N; n++) /* Loop over vector components */ if (fabs(lpX[n])>1E100) /* Check value */ break; /* There's something wrong ... */ if (n<N) { nVecIgnored++; continue; } /* Ignore this vector */ CStatistics_UpdateVector(_this,lpX,c,w); /* Update statistics with vector */ } /* << */ while(!_this->m_idLtb && nIcLab<0 && ++c<C); /* Next class if there is one */ } /* << */ /* Clean up */ /* --------------------------------- */ if (nVecIgnored>0) IERROR(_this,STA_VECIGNORED,nVecIgnored,0,0); /* Error: some vectors ignored */ dlp_free(lpX); /* Free vector copy buffer */ return O_K; /* Done */ }