void PulseProcessor::update(double value, double time, bool filter)
{
    if(filter) {
        v_raw[curpos] = value;
        if(std::abs(time - m_dTms) < m_dTms) {
            v_time[curpos] = time;
        } else {
            v_time[curpos] = m_dTms;
        }

        double mean = 0.0;
        double sko = 0.0;

        for(int i = 0; i < m_interval; i++) {
            mean += v_raw[__loop(curpos - i)];
        }
        mean /= m_interval;
        int pos = 0;
        for(int i = 0; i < m_interval; i++) {
            pos = __loop(curpos - i);
            sko += (v_raw[pos] - mean)*(v_raw[pos] - mean);
        }
        sko = std::sqrt( sko/(m_interval - 1));
        if(sko < 0.01) {
            sko = 1.0;
        }
        v_X[__seek(curpos)] = (v_raw[curpos] - mean)/ sko;

        double integral = 0.0;
        for(int i = 0; i < m_filterlength; i++) {
            integral += v_X[i];
        }

        v_Y[curpos] = ( integral + v_Y[__loop(curpos - 1)] )  / (m_filterlength + 1.0);
    } else {
        v_Y[curpos] = value;
        v_time[curpos] = time;
    }
	
	if(pt_peakdetector != 0)
        pt_peakdetector->update(v_Y[curpos], v_time[curpos]);

    curpos = (curpos + 1) % m_length;
}
int main(int argc, char **argv)
{
	char *remote_name;
	struct sockaddr_in proxy_addr;
	unsigned short local_port, remote_port;
	struct hostent *h;
	int arg_idx = 1, proxy_fd;
	
	if (argc != 4)
	{
		fprintf(stderr, "Usage %s <remote-target> <remote-target-port> "
			"<local-port>\n", argv[0]);
		exit(1);
	}

	remote_name = argv[arg_idx++];
	remote_port = atoi(argv[arg_idx++]);
	local_port = atoi(argv[arg_idx++]);

	/* Lookup server name and establish control connection */
	if ((h = gethostbyname(remote_name)) == NULL) {
		fprintf(stderr, "gethostbyname(%s) failed %s\n", remote_name, 
			strerror(errno));
		exit(1);
	}
	memset(&remote_addr, 0, sizeof(struct sockaddr_in));
	remote_addr.sin_family = AF_INET;
	memcpy(&remote_addr.sin_addr.s_addr, h->h_addr_list[0], sizeof(in_addr_t));
	remote_addr.sin_port = htons(remote_port);
	
	/* open up the TCP socket the proxy listens on */
	if ((proxy_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
		fprintf(stderr, "socket error %s\n", strerror(errno));
		exit(1);
	}
	/* bind the socket to all local addresses */
	memset(&proxy_addr, 0, sizeof(struct sockaddr_in));
	proxy_addr.sin_family = AF_INET;
	proxy_addr.sin_addr.s_addr = INADDR_ANY; /* bind to all local addresses */
	proxy_addr.sin_port = htons(local_port);
	if (bind(proxy_fd, (struct sockaddr *) &proxy_addr, 
			sizeof(proxy_addr)) < 0) {
		fprintf(stderr, "bind error %s\n", strerror(errno));
		exit(1);
	}

	listen(proxy_fd, MAX_LISTEN_BACKLOG);

	__loop(proxy_fd);

	return 0;
}
int PulseProcessor::getLastPos() const
{
    return __loop(curpos - 1);
}
double PulseProcessor::getSignalSampleValue() const
{
    return v_Y[__loop(curpos-1)];
}
double PulseProcessor::computeFrequency()
{
    unsigned int _zeros = 0;
    double *pt = v_datamat.ptr<double>(0);
    for(int i = 0; i < m_length; i++) {
        pt[i] = v_Y[__loop(curpos - 1 - i)];
        if(std::abs(pt[i]) <= 0.01) {
            _zeros++;
        }
    }
    if(_zeros > 0.5 * m_length) {
        m_snr = -10.0;
        return m_Frequency;
    }
    //cv::blur(v_datamat,v_datamat,cv::Size(3,1));
    cv::dft(v_datamat, v_dftmat);
    const double *v_fft = v_dftmat.ptr<const double>(0);

    // complex-conjugate-symmetrical array
    v_FA[0] = v_fft[0]*v_fft[0];
    if((m_length % 2) == 0) { // Even number of counts
        for(int i = 1; i < m_length/2; i++)
            v_FA[i] = v_fft[2*i-1]*v_fft[2*i-1] + v_fft[2*i]*v_fft[2*i];
        v_FA[m_length/2] = v_fft[m_length-1]*v_fft[m_length-1];
    } else { // Odd number of counts
        for(int i = 1; i <= m_length/2; i++)
            v_FA[i] = v_fft[2*i-1]*v_fft[2*i-1] + v_fft[2*i]*v_fft[2*i];
    }

    // Count time
    double time = 0.0;
    for (int i = 0; i < m_length; i++)
        time += v_time[i];

    int bottom = (int)(m_bottomFrequencyLimit * time / 1000.0);
    int top = (int)(m_topFrequencyLimit * time / 1000.0);
    if(top > (m_length/2))
        top = m_length/2;
    int i_maxpower = 0;
    double maxpower = 0.0;
    for (int i = bottom + 2 ; i <= top - 2; i++)
        if ( maxpower < v_FA[i] ) {
            maxpower = v_FA[i];
            i_maxpower = i;
        }

    double noise_power = 0.0;
    double signal_power = 0.0;
    double signal_moment = 0.0;
    for (int i = bottom; i <= top; i++) {
        if ( (i >= i_maxpower - 2) && (i <= i_maxpower + 2) ) {
            signal_power += v_FA[i];
            signal_moment += i * v_FA[i];
        } else {
            noise_power += v_FA[i];
        }
    }

    m_snr = 0.0;
    if(signal_power > 0.01 && noise_power > 0.01) {
        m_snr = 10.0 * std::log10( signal_power / noise_power );
        double bias = (double)i_maxpower - ( signal_moment / signal_power );
        m_snr *= (1.0 / (1.0 + bias*bias));
    }
    if(m_snr > 2.5)
        m_Frequency = (signal_moment / signal_power) * 60000.0 / time;

    return m_Frequency;
}