/** * <p id=dlm_fft_C>Computes the complex (inverse) fast Fourier transform.</p> * * @param C * Pointer to an array containing the input, will be * overwritten with the result. * @param nXL * Length of signals. If length not power of 2 {@link dlm_dftC} will be * executed. * @param bInv * If non-zero the function computes the inverse complex Fourier * transform * @return <code>O_K</code> if successfull, a (begative) error code otherwise * * <h4>Remarks</h4> * <ul> * <li>The function creates the tables by its own, stores them in static arrays and * reuses them for all subsequent calls with the same value of * <code>nXL</code>.</li> * </ul> */ INT16 dlm_fftC ( COMPLEX64* C, INT32 nXL, INT16 bInv ) { register INT32 i; INT16 ret = O_K; FLOAT64* RE = (FLOAT64*)dlp_calloc(nXL, sizeof(FLOAT64)); FLOAT64* IM = (FLOAT64*)dlp_calloc(nXL, sizeof(FLOAT64)); for(i = nXL-1; i >= 0; i--) { RE[i] = C[i].x; IM[i] = C[i].y; } if((ret = dlm_fft(RE,IM,nXL,bInv)) == O_K) { for(i = nXL-1; i >= 0; i--) { C[i].x = RE[i]; C[i].y = IM[i]; } } dlp_free(RE); dlp_free(IM); return ret; /* All done */ }
/** * Analyse * * Derived instances of FBAproc should override method * Analyse() to add the desired functionality * * @return O_K if successfull, NOT_EXEC otherwise */ INT16 CGEN_PUBLIC CCPproc::AnalyzeFrame() { INT16 ret = O_K; if(!strcmp(m_lpsType, "MelFilter")) { CData* idCep = NULL; CData* idMel = NULL; ICREATEEX(CData, idCep, "~idCep", NULL); ICREATEEX(CData, idMel, "~idMel", NULL); if((ret = CMELproc::AnalyzeFrame()) != O_K) return ret; idMel->Select(m_idRealFrame, 0, m_nCoeff); if((ret = Mf2mcep(idMel, idCep, m_nCoeff)) != O_K) return ret; dlp_memmove(m_idRealFrame->XAddr(0, 0), idCep->XAddr(0, 0), m_nCoeff * sizeof(FLOAT64)); IDESTROY(idMel); IDESTROY(idCep); } else { if(!strcmp(m_lpsWarptype, "time")) { if(!strcmp(m_lpsType, "BurgLPC")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, 0.0, -m_nMinLog, DLM_CALCCEP_METHOD_S_MLPC_BURG_MCEP); } else if(!strcmp(m_lpsType, "LevinsonLPC")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, 0.0, -m_nMinLog, DLM_CALCCEP_METHOD_S_MLPC_LEVI_MCEP); } else if(!strcmp(m_lpsType, "Uels")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nLen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, 0.0, -m_nMinLog, DLM_CALCCEP_METHOD_S_MCEP_UELS); } else if(!strcmp(m_lpsType, "LogFFT")) { dlp_memset(m_idImagFrame->XAddr(0, 0), 0L, m_nLen * sizeof(FLOAT64)); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0),(FLOAT64*)m_idImagFrame->XAddr(0, 0),m_nLen,FALSE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } LN(); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0), (FLOAT64*)m_idImagFrame->XAddr(0, 0), m_nLen, TRUE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } for(INT32 i = 1; i < m_nCoeff; i++) { ((FLOAT64*)m_idRealFrame->XAddr(0, 0))[i] *= 2.0; } } else { IERROR(this,ERR_NULLINST,0,0,0); return NOT_EXEC; } } else { if(!strcmp(m_lpsType, "BurgLPC")) { if(!strcmp(m_lpsWarptype, "lpc")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, m_nPfaLambda, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_BURG_MLPC_MCEP); } else if(!strcmp(m_lpsWarptype, "cepstrum")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, m_nPfaLambda, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_BURG_CEP_MCEP); } else if(!strcmp(m_lpsWarptype, "none")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, 0.0, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_BURG_CEP); } else { IERROR(this, CP_WARPTYPE, m_lpsWarptype, 0, 0); return NOT_EXEC; } } else if(!strcmp(m_lpsType, "LevinsonLPC")) { if(!strcmp(m_lpsWarptype, "lpc")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, m_nPfaLambda, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_LEVI_MLPC_MCEP); } else if(!strcmp(m_lpsWarptype, "cepstrum")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen / 2, m_nPfaLambda, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_LEVI_CEP_MCEP); } else if(!strcmp(m_lpsWarptype, "none")) { dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nWlen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, 0.0, -m_nMinLog, DLM_CALCCEP_METHOD_S_LPC_LEVI_CEP); } else { IERROR(this, CP_WARPTYPE, m_lpsWarptype, 0, 0); return NOT_EXEC; } } else if(!strcmp(m_lpsType, "Uels")) { if((ret = dlm_calcmcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nLen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, m_nPfaLambda, exp(-m_nMinLog), DLM_CALCCEP_METHOD_S_MCEP_UELS)) != O_K) { return NOT_EXEC; } } else if(!strcmp(m_lpsType, "LogFFT")) { dlp_memset(m_idImagFrame->XAddr(0, 0), 0L, m_nLen * sizeof(FLOAT64)); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0), (FLOAT64*)m_idImagFrame->XAddr(0, 0), m_nLen, FALSE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } LN(); if(!strcmp(m_lpsWarptype, "lpc")) { IERROR(this, CP_WARPTYPE, m_lpsWarptype, 0, 0); return NOT_EXEC; } else if(!strcmp(m_lpsWarptype, "cepstrum")) { dlp_memset(m_idImagFrame->XAddr(0, 0), 0L, m_nLen * sizeof(FLOAT64)); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0), (FLOAT64*)m_idImagFrame->XAddr(0, 0), m_nLen, TRUE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } dlm_cep2mcep((FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nLen, (FLOAT64*)m_idRealFrame->XAddr(0, 0), m_nCoeff, m_nPfaLambda, NULL); } else if(!strcmp(m_lpsWarptype, "spectrum")) { WARP(); dlp_memset(m_idImagFrame->XAddr(0, 0), 0L, m_nLen * sizeof(FLOAT64)); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0), (FLOAT64*)m_idImagFrame->XAddr(0, 0), m_nLen, TRUE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } } else if(!strcmp(m_lpsWarptype, "none")) { dlp_memset(m_idImagFrame->XAddr(0, 0), 0L, m_nLen * sizeof(FLOAT64)); if((ret = dlm_fft((FLOAT64*)m_idRealFrame->XAddr(0, 0), (FLOAT64*)m_idImagFrame->XAddr(0, 0), m_nLen, TRUE)) != O_K) { if(ret == ERR_MDIM) IERROR(this, FBA_BADFRAMELEN, m_nLen, "FFT", 0); return NOT_EXEC; } } else { IERROR(this,ERR_NULLINST,0,0,0); } for(INT32 i = 1; i < m_nCoeff; i++) { ((FLOAT64*)m_idRealFrame->XAddr(0, 0))[i] *= 2.0; } } else if(strcmp(m_lpsWarptype, "none")) { IERROR(this,ERR_NULLINST,0,0,0); } } } return O_K; }