// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> bool AmplitudeProcessor_Mjma::deconvolveData(Response *resp, DoubleArray &data, int numberOfIntegrations) { Math::Restitution::FFT::TransferFunctionPtr tf = resp->getTransferFunction(numberOfIntegrations); if ( tf == NULL ) { setStatus(DeconvolutionFailed, 0); return false; } Math::SeismometerResponse::Seismometer5sec paz(Math::Velocity); Math::Restitution::FFT::PolesAndZeros seis5sec(paz); Math::Restitution::FFT::TransferFunctionPtr cascade = *tf / seis5sec; // Remove linear trend double m,n; Math::Statistics::computeLinearTrend(data.size(), data.typedData(), m, n); Math::Statistics::detrend(data.size(), data.typedData(), m, n); return Math::Restitution::transformFFT(data.size(), data.typedData(), _stream.fsamp, cascade.get(), _config.respTaper, _config.respMinFreq, _config.respMaxFreq); }
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> bool AmplitudeProcessor_Md::deconvolveData(Response* resp, DoubleArray& data, int numberOfIntegrations) { if ( numberOfIntegrations < -1 ) return false; SEISCOMP_DEBUG("Inside deconvolve function"); double m, n; Math::Restitution::FFT::TransferFunctionPtr tf = resp->getTransferFunction(numberOfIntegrations < 0 ? 0 : numberOfIntegrations); if ( !tf ) return false; Math::GroundMotion gm; if ( numberOfIntegrations < 0 ) gm = Math::Displacement; else gm = Math::Velocity; Math::Restitution::FFT::TransferFunctionPtr cascade; Math::SeismometerResponse::WoodAnderson woodAndersonResp(gm, _config.woodAndersonResponse); Math::SeismometerResponse::Seismometer5sec seis5sResp(gm); Math::SeismometerResponse::L4C_1Hz l4c1hzResp(gm); Math::Restitution::FFT::PolesAndZeros woodAnderson(woodAndersonResp); Math::Restitution::FFT::PolesAndZeros seis5sec(seis5sResp); Math::Restitution::FFT::PolesAndZeros l4c1hz(l4c1hzResp); SEISCOMP_DEBUG("SEISMO = %d", aFile.SEISMO); switch ( aFile.SEISMO ) { case 1: cascade = *tf / woodAnderson; break; case 2: cascade = *tf / seis5sec; break; case 9: SEISCOMP_INFO("%s Applying filter L4C 1Hz to data", AMPTAG); cascade = *tf / l4c1hz; break; default: cascade = tf; SEISCOMP_INFO("%s No seismometer specified, no signal reconvolution performed", AMPTAG); return false; break; } // Remove linear trend Math::Statistics::computeLinearTrend(data.size(), data.typedData(), m, n); Math::Statistics::detrend(data.size(), data.typedData(), m, n); return Math::Restitution::transformFFT(data.size(), data.typedData(), _stream.fsamp, cascade.get(), _config.respTaper, _config.respMinFreq, _config.respMaxFreq); }