Exemplo n.º 1
0
void MRFFT::calc(const float* input, float* output)
{
    // temporary buffers
    std::vector<kiss_fft_scalar> linput(m_size), rinput(m_size);
    std::vector<kiss_fft_cpx> loutput(m_size), routput(m_size);

    for (size_t i=0;i<m_size;++i)
    {
        linput[i] = input[2*i];
        rinput[i] = input[2*i+1];
    }

    if (m_windowed)
    {
        hann(linput);
        hann(rinput);
    }

    // transform channels
    kiss_fftr(m_cfg, &linput[0], &loutput[0]);
    kiss_fftr(m_cfg, &rinput[0], &routput[0]);

    auto&& filter = [&](kiss_fft_cpx& data)
    {
        return sqrt(data.r*data.r+data.i*data.i) * 2.0/m_size * (m_windowed?sqrt(8.0/3.0):1.0);
    };

    // interleave while taking magnitudes and normalizing
    for (size_t i=0;i<m_size/2;++i)
    {
        output[2*i] = filter(loutput[i]);
        output[2*i+1] = filter(routput[i]);
    }
}
Exemplo n.º 2
0
int main(void){
  Arr table[SIZE]; // 基準表
  Arr worktable[SIZE];  // 作業表
  Arr routetable[SIZE];  // 経路表
  int route[SIZE];
  int x, y;   // 表のサイズ
  int ans;   //  答
  scanf("%d %d", &x, &y);
  input(x, y, table);
  init_table(x, y, worktable);
  ans = cal(table, worktable, routetable, x, y);
  route_cal(x, y, routetable, route);
  printf("cal = %d\n", c);
  routput(y, route);
  printf(": %d\n", ans);
  output(x, y, worktable);
  //output(x, y, routetable);
  
  return 0;
}