bool FrameTokenizer::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;

    if (in.size > 1)
    {
        cerr << "ERROR: input of FrameTokenizer should be of size 1" << endl;
        return false;
    }
    m_blockSize = getIntParam("blockSize", params);
    if (m_blockSize<=0) {
    	cerr << "ERROR: invalid blockSize parameter !" << endl;
    }
    m_stepSize = getIntParam("stepSize", params);
    if (m_stepSize<=0) {
    	cerr << "ERROR: invalid stepSize parameter !" << endl;
    	return false;
    }

    outStreamInfo().add(StreamInfo());
	StreamInfo& outInfo = outStreamInfo()[0].data;
	outInfo.sampleRate = in.sampleRate;
	outInfo.frameLength = m_blockSize * in.frameLength;
	outInfo.sampleStep = m_stepSize * in.sampleStep;
	outInfo.size = m_blockSize;

    return true;
}
bool Variation::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;
	outStreamInfo().add(StreamInfo(in,1));
    return true;
}
Example #3
0
  bool MelFilterBank::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
  {
    assert(inp.size()==1);
    const StreamInfo& in = inp[0].data;

    // build mel filter bank
    m_size = in.size;
    int nbMelFilters = getIntParam("MelNbFilters",params);
    double sampleRate = in.sampleRate;
    double freqMin = getDoubleParam("MelMinFreq",params);
    double freqMax = getDoubleParam("MelMaxFreq",params);
    // set freqMax to Nyquist frequency if greater than nyquist frequency
    freqMax = min(freqMax, sampleRate/2.0);
    double melFreqMin = 1127 * log(1 + freqMin / 700);
    double melFreqMax = 1127 * log(1 + freqMax / 700);

    VectorXd melPeak(nbMelFilters+2);
    VectorXd freqs(nbMelFilters+2);

    melPeak = VectorXd::LinSpaced(nbMelFilters+2,melFreqMin,melFreqMax);
    freqs = ((melPeak / 1127).array().exp() - 1.0) * 700.0;
    VectorXd fftFreqs(m_size);
    fftFreqs = VectorXd::LinSpaced(m_size,0,m_size-1) * sampleRate / ((m_size-1)*2);
    for (int b=1;b<nbMelFilters+1;b++)
    {
      double norm = 2.0 / (freqs(b+1)-freqs(b-1));
      VectorXd fullfilt(m_size);
      //		fullfilt.setZero(m_size);
      //		firstIndex i;
      //		fullfilt += where((fftFreqs(i)>freqs(b-1)) && (fftFreqs(i)<=freqs(b)),norm*(fftFreqs(i)-freqs(b-1))/(freqs(b)-freqs(b-1)),0.0);
      //		fullfilt += where((fftFreqs(i)>freqs(b)) && (fftFreqs(i)<freqs(b+1)),norm*(freqs(b+1)-fftFreqs(i))/(freqs(b+1)-freqs(b)),0.0);
      double ffmin = freqs(b-1);
      double ffmiddle = freqs(b);
      double ffmax = freqs(b+1);
      for (int i=0;i<m_size;i++) {
        if ((fftFreqs(i)<ffmin) || (fftFreqs(i)>ffmax)) {
          fullfilt(i) = 0;
          continue;
        }
        if (fftFreqs(i)<ffmiddle)
          fullfilt(i) = norm*(fftFreqs(i)-ffmin)/(ffmiddle-ffmin);
        else
          fullfilt(i) = norm*(ffmax-fftFreqs(i))/(ffmax-ffmiddle);
      }

      int fStart=0;
      while (fullfilt(fStart)==0.0) fStart++;
      int fEnd=fStart+1;
      while ((fEnd<m_size) && (fullfilt(fEnd)!=0.0)) fEnd++;
      m_filterStart.push_back(fStart);
      m_filters.push_back(RowVectorXd());
      m_filters.back() = fullfilt.segment(fStart,fEnd-fStart);
    }

    outStreamInfo().add(StreamInfo(in, m_filters.size()));
    return true;
  }
bool AC2LPC::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;

	m_nbCoeffs = getIntParam("LPCNbCoeffs",params);
	outStreamInfo().add(StreamInfo(in,m_nbCoeffs));
    return true;
}
Example #5
0
bool Flux::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;

	m_onlyIncrease = (getStringParam("FluxSupport",params)=="Increase");
    outStreamInfo().add(StreamInfo(in,1));
    return true;
}
bool Difference::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;

	m_nbCoeffs = getIntParam("DiffNbCoeffs",params);
	if (m_nbCoeffs==0)
		m_nbCoeffs = in.size - 1;
	if (m_nbCoeffs > in.size-1)
	{
		cerr << "Warning: cannot compute " << m_nbCoeffs << " difference coefficients from input of size " << in.size << endl;
		m_nbCoeffs = in.size - 1;
		cerr << "take only " << m_nbCoeffs << " coefficients" << endl;
	}

	outStreamInfo().add(StreamInfo(in,m_nbCoeffs));
    return true;
}
bool SpectralCrestFactorPerBand::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;
    m_inSize = in.size;

    double fs = in.sampleRate;
    int blockSize = (in.size-1)*2; // assume input is spectrum

    double hiedge = floor(fs/2);
    double loedge = hiedge * pow(2,round(log2(250.0/hiedge)));

    int k = 0;
    while (true)
    {
        k++;
        double f_lo_nom = loedge * pow(2,(double)(k-1)/4.0);
        double f_hi_nom = loedge * pow(2,(double)k/4.0);
        double f_lo = f_lo_nom * (1 - OVERLAP);
        double f_hi = f_hi_nom * (1 + OVERLAP);
        int i_lo = (int) round(f_lo / (fs/blockSize));
        int i_hi = (int) round(f_hi / (fs/blockSize));

        if (f_lo_nom >= hiedge) break;
        if (f_hi > fs/2) break;

        int grpsize = 1;
        if (f_lo_nom >= 1000)
        {
            grpsize = (int) round(pow(2, floor(log2(f_lo_nom/500.0))));
            i_hi = (int) round((double)(i_hi-i_lo+1)/grpsize)*grpsize + i_lo-1;
        }

    	bandinfo bi;
    	bi.start = i_lo;
    	bi.end = i_hi+1;
    	bi.group = grpsize;
        m_band.push_back(bi);
    }

    outStreamInfo().add(StreamInfo(in,m_band.size()));
    return true;
}
Example #8
0
  bool Cepstrum::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
  {
    assert(inp.size()==1);
    const StreamInfo& in = inp[0].data;

    m_ignoreFirst = getIntParam("CepsIgnoreFirstCoeff",params);
    m_nbCoeffs = getIntParam("CepsNbCoeffs",params);
    if (m_nbCoeffs+m_ignoreFirst>in.size)
    {
      cerr << "Warning: cannot compute " << m_nbCoeffs << " for input of size " << in.size << endl;
      m_nbCoeffs = in.size - m_ignoreFirst;
      cerr << "compute only " << m_nbCoeffs << " coefficients" << endl;
    }

    m_dctPlan.resize(in.size,in.size);
    for (int j=0;j<in.size;j++)
      m_dctPlan(0,j) = 1.0 / sqrt((double)in.size);
    for (int i=1;i<in.size;i++)
      for (int j=0;j<in.size;j++)
        m_dctPlan(i,j) = sqrt(2.0 / in.size) * cos(PI * (j + 0.5) * i / in.size);

    outStreamInfo().add(StreamInfo(in, m_nbCoeffs));
    return true;
  }
Example #9
0
  bool SpecificLoudness::init(const ParameterMap& params, const Ports<StreamInfo>& inp)
  {
    assert(inp.size()==1);
    const StreamInfo& in = inp[0].data;

    // assume in->info().size is fft size
    // assume in->info().frameLength is frame size
    m_blockSize = in.frameLength;
    m_fftSize = in.size;
    m_bkBdLimits = new int[NB_BARK_BANDS+1];

    double tmp[m_fftSize];
    for (int i = 0; i < m_fftSize; i++)
    {
      tmp[i] = i * in.sampleRate / (double) m_blockSize;
      tmp[i] = 13 * atan(tmp[i] / 1315.8) + 3.5 * atan(pow(
            (tmp[i] / 7518), 2));
    }

    m_bkBdLimits[0] = 0;
    double currentBandEnd = tmp[m_fftSize-1] / NB_BARK_BANDS;
    int currentBarkBand = 1;
    for (int i = 0; i < m_fftSize; i++)
    {
      while (tmp[i] > currentBandEnd)
      {
        m_bkBdLimits[currentBarkBand++] = i;
        currentBandEnd = currentBarkBand * tmp[m_fftSize-1] / NB_BARK_BANDS;
      }
    }
    assert(currentBarkBand == NB_BARK_BANDS);
    m_bkBdLimits[NB_BARK_BANDS] = m_fftSize-1; // ignore last coeff

    outStreamInfo().add(StreamInfo(in,NB_BARK_BANDS));
    return true;
  }
bool AdvancedFrameTokenizer::init(const YAAFE::ParameterMap& params, const YAAFE::Ports<YAAFE::StreamInfo>& inp)
{
	assert(inp.size()==1);
	const StreamInfo& in = inp[0].data;

    if (in.size > 1)
    {
        cerr << "ERROR: input of AdvancedFrameTokenizer should be of size 1" << endl;
        return false;
    }

	m_outSampleRate = getDoubleParam("outSampleRate",params);
	m_blockSize = getIntParam("blockSize",params);
	m_outStepSize = getIntParam("outStepSize",params);

	StreamInfo out;
	out.frameLength = (int) floor(in.frameLength*m_blockSize*m_outSampleRate/in.sampleRate + 0.5);
	out.sampleRate = m_outSampleRate;
	out.sampleStep = m_outStepSize;
	out.size = m_blockSize;
	outStreamInfo().add(out);

	return true;
}
Example #11
0
  bool AudioFileReader::init(const ParameterMap& params, const Ports<StreamInfo>& in)
  {
    m_resample = (getStringParam("Resample", params)=="yes");
    m_removemean = (getStringParam("RemoveMean",params)=="yes");
    m_scaleMax = getDoubleParam("ScaleMax",params);
    m_sampleRate = 	getIntParam("SampleRate",params);
    string filename = getStringParam("File", params);
    string timeStart = getStringParam("TimeStart",params);

    if (timeStart[timeStart.size()-1]=='s')
    {
      m_startSecond = atof(timeStart.substr(0,timeStart.size()-1).c_str());
    } else {
      cerr << "ERROR: invalid TimeStart parameter !" << endl;
      return false;
    }
    string timeLimit = getStringParam("TimeLimit",params);
    if (timeLimit[timeLimit.size()-1]=='s')
    {
      m_limitSecond = atof(timeLimit.substr(0,timeLimit.size()-1).c_str());
    } else {
      cerr << "ERROR: invalid TimeLimit parameter !" << endl;
      return false;
    }

    m_bufferSize = DataBlock::preferedBlockSize();
    m_readBuffer = new double[2*m_bufferSize]; // enough to read stereo if needed

    if (!openFile(filename))
      return false;
    
    // find mean and max if needed
    m_mean = 0;
    m_factor = 1;
    if (m_removemean || m_scaleMax>0)
    {
      m_rescale = true;

      int count = 0;
      double smean = 0;
      double smin = 0;
      double smax = 0;
      while (true) {
        int nbRead = readFramesIntoBuffer();
        if (nbRead==0)
          break;
        for (int i=0;i<nbRead;i++)
        {
          smean += m_readBuffer[i];
          if (m_readBuffer[i]<smin)
            smin = m_readBuffer[i];
          if (m_readBuffer[i]>smax)
            smax = m_readBuffer[i];
        }
        count += nbRead;
      }

      if (m_removemean)
        m_mean = smean / count;
      if (m_scaleMax>0)
        m_factor = m_scaleMax / max(abs( (smax-m_mean) ),abs( (smin-m_mean) ));

      int res = sf_seek(m_sndfile,0,SEEK_SET);
      if (res!=0)
      {
        cerr << "ERROR: cannot seek start in audio file !" << endl;
        return false;
      }

      if (verboseFlag)
        cerr << "INFO: remove mean of input signal (" << m_mean << ") and scale to " << m_scaleMax << endl;
      closeFile();
      if (!openFile(filename)) {
        cerr << "ERROR: cannot re-open file " << filename << " !" << endl; 
        return false;
      }
    }

    if ((!m_resample) && (m_sfinfo.samplerate != m_sampleRate)) {
      cerr << "ERROR: resampling is disabled and file has sample rate " << m_sfinfo.samplerate << " Hz. Expecting " << m_sampleRate << " Hz !" << endl;
      return false;
    }

    outStreamInfo().add(StreamInfo());
    StreamInfo& outInfo = outStreamInfo()[0].data;
    outInfo.size = 1;
    outInfo.sampleRate = m_sampleRate;
    outInfo.sampleStep = 1;
    outInfo.frameLength = 1;
    return true;
  }