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]); } }
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; }