Example #1
0
/**
 * <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                          */
}
Example #2
0
/**
 * 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;
}