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