long double fft_rmse(const VT1 &fftbuf, const VT2 &timebuf) { long double totalpower = 0; long double difpower = 0; long double pi = acos((long double)-1); for (size_t k0 = 0; k0 < (size_t)fftbuf.size(); ++k0) { complex<long double> acc = 0; long double phinc = -2. * k0 * pi / timebuf.size(); for (size_t k1 = 0; k1 < (size_t)timebuf.size(); ++k1) { acc += promote(timebuf[k1]) * exp(complex<long double>(0, k1 * phinc)); } totalpower += norm(acc); complex<long double> x = promote(fftbuf[k0]); complex<long double> dif = acc - x; difpower += norm(dif); // cerr << k0 << "\t" << acc << "\t" << x << "\t" << sqrt(norm(dif)) << endl; } cerr << "rmse:" << sqrt(difpower / totalpower) << endl; return sqrt(difpower / totalpower); }
long double dif_rmse( const VT1 buf1,const VT2 buf2) { long double totalpower=0; long double difpower=0; size_t n = min( buf1.size(),buf2.size() ); for (size_t k=0;k<n;++k) { totalpower += (norm( buf1[k] ) + norm(buf2[k]) )/2.; difpower += norm(buf1[k] - buf2[k]); } return sqrt(difpower/totalpower); }