static Node * decl() { Node *n, *init; char *name; CTy *type, *basety; SrcPos *pos; Sym *sym; Vec *syms; int sclass; pos = &tok->pos; syms = vec(); basety = declspecs(&sclass); while(tok->k != ';' && tok->k != TOKEOF) { type = declarator(basety, &name, &init); switch(sclass){ case SCNONE: if(isglobal()) { sclass = SCGLOBAL; } else { sclass = SCAUTO; } break; case SCTYPEDEF: if(init) errorposf(pos, "typedef cannot have an initializer"); break; } if(!name) errorposf(pos, "decl needs to specify a name"); sym = definesym(pos, sclass, name, type, init); vecappend(syms, sym); if(isglobal() && tok->k == '{') { if(init) errorposf(pos, "function declaration has an initializer"); if(type->t != CFUNC) errorposf(pos, "expected a function"); curfunc = mknode(NFUNC, pos); curfunc->type = type; curfunc->Func.name = name; curfunc->Func.params = vec(); curfunc->Func.stkslots = vec(); fbody(); definesym(pos, sclass, name, type, curfunc); curfunc = 0; goto done; } if(tok->k == ',') next(); else break; } expect(';'); done: n = mknode(NDECL, pos); n->Decl.syms = syms; return n; }
static void test_resampler(void) { std::string fbody("sweep_440-3520_1s"); mcon::Vector<double> input; mfio::Wave wave; wave.Read(fbody + std::string(".wav"), input); const int baseFs = wave.GetSamplingRate(); const int targetFs = 16000; const double fp = 0.35; const double fs = 0.45; masp::Resampler resampler(targetFs, baseFs, fp, fs); resampler.MakeFilterByWindowType(masp::Resampler::HANNING); { mcon::Vector<double> coefs; resampler.GetCoefficients(coefs); LOG("Length=%d\n", static_cast<int>(coefs.GetLength())); } { mcon::Vector<double> output; resampler.Convert(output, input); output *= 32767.0/output.GetMaximumAbsolute(); mfio::Wave w(targetFs, wave.GetNumChannels(), wave.GetBitDepth()); w.Write(fbody + std::string("_resampled1.wav"), output); } const double ripple = 0.01; const double decay = 80; resampler.MakeFilterBySpec(ripple, decay); { mcon::Vector<double> coefs; resampler.GetCoefficients(coefs); LOG("Length=%d\n", static_cast<int>(coefs.GetLength())); } { mcon::Vector<double> output; resampler.Convert(output, input); output *= 32767.0/output.GetMaximumAbsolute(); mfio::Wave w(targetFs, wave.GetNumChannels(), wave.GetBitDepth()); w.Write(fbody + std::string("_resampled2.wav"), output); } // サンプルの数を変更する // ==> 実質的に周波数変換? // ==> 違う気がする... { const int N = 100; const double ratio = 1.5; const double fp = 0.35; const double fs = 0.45; const double ripple = 0.01; const double decay = 80; mcon::Vector<double> src(N); for (int k = 0; k < N; ++k) { src[k] = k; } resampler.Initialize(static_cast<int>(ratio * N), N, fp, fs); resampler.MakeFilterBySpec(ripple, decay); mcon::Vector<double> dst; resampler.Convert(dst, src); mfio::Csv::Write("sample_count_convert.csv", dst); } }