コード例 #1
0
ファイル: mufco_demo.cpp プロジェクト: Robolabo/gridSim
void CMUFCO_demo::_evaluateFFT ( TVFreqCmp* input ){
	/* ORDER PARAMETER */
	TVGridSCmp* tmp_GCmp = m_pcGrid->getSCmp();	
	// Generate empty vectors
	TVFloat  tmp_real, tmp_img, tmp_Gnrm;
	TVInt    tmp_pop;
	for ( int i = 0 ; i < m_sSimCnf->nFFTsize/2 + 1 ; i++ ){
		tmp_real.push_back ( 0.0 );
		tmp_img.push_back  ( 0.0 );
		tmp_Gnrm.push_back ( 0.0 );
		tmp_pop.push_back  ( 0 );
	}
	// Get non-controllable arguments
	for ( int i = 0 ; i < tmp_GCmp->size() ; i++ ){
		tmp_real [ tmp_GCmp->at(i).cmp ] = tmp_GCmp->at(i).amp * cos ( tmp_GCmp->at(i).arg );
		tmp_img  [ tmp_GCmp->at(i).cmp ] = tmp_GCmp->at(i).amp * sin ( tmp_GCmp->at(i).arg );	
		tmp_Gnrm [ tmp_GCmp->at(i).cmp ] = tmp_GCmp->at(i).amp;    
	}						
	// Get oscillators arguments	
	TVFloat tmp_status;
	for ( int i = 0 ; i < m_vCtr->size() ; i++ ){
		tmp_status = m_vCtr->at(i)->getStatus();
		tmp_real[ m_vCtr->at(i)->getCmp() ] += cos ( tmp_status[0] );
		tmp_img [ m_vCtr->at(i)->getCmp() ] += sin ( tmp_status[0] );
		tmp_pop [ m_vCtr->at(i)->getCmp() ]++;
	}
	// Calculate R and Phi
	m_sFFTst.R.clear();
	m_sFFTst.Phi.clear();
	m_sFFTst.Nrm.clear();
	for ( int i = 0 ; i < m_sSimCnf->nFFTsize/2 + 1 ; i++ ){
		m_sFFTst.Nrm.push_back( float(tmp_pop[i]) + tmp_Gnrm[i] );
		if ( m_sFFTst.Nrm.back() > 1e-3 ){ 
			tmp_real[i] /= ( m_sFFTst.Nrm.back() );
			tmp_img [i] /= ( m_sFFTst.Nrm.back() );
			complex<float> tmp_complex ( tmp_real[i] , tmp_img[i] );
			m_sFFTst.R.push_back   ( abs( tmp_complex ) );
			m_sFFTst.Phi.push_back ( arg( tmp_complex ) );								
		}
		else{			
			m_sFFTst.R.push_back(0.0);
			m_sFFTst.Phi.push_back(0.0);
		}		
	}
	/* FORM FACTOR EQUATION */
	//m_sFFTst.FFTmax = 0.0; // ERROR MUST BE GLOBAL
	for ( int i = m_nFCreject + 1 ; i < input->size() ; i++ ){
		if ( input->at(i).amp > m_sFFTst.FFTmax )
			m_sFFTst.FFTmax   = input->at(i).amp;
	}	
	m_sFFTst.FFTrel = 0.0;
	for ( int i = m_nFCreject + 1 ; i < input->size() ; i++ ){
		m_sFFTst.FFTrel +=  pow ( input->at(i).amp , 4 );
	}	
	m_sFFTst.FFTrel /= float( input->size() - m_nFCreject - 1 ) * pow( m_sFFTst.FFTmax  , 4 ); 
	return;
};
コード例 #2
0
ファイル: mufco_demo.cpp プロジェクト: Robolabo/gridSim
void CMUFCO_demo::_SignalFFT ( void ){	
	m_vFreqSignal.clear();
	m_vFreqSignal_amp.clear();
	sFreqCmp         tmp_freqcmp;

	int nFFTsize = 2048;

	/* There are enough samples */
	if ( m_vSampForFFT.size() >= nFFTsize ){			
		double time_domain  [nFFTsize][2];
		double frec_domain  [nFFTsize][2];							
		for ( int j = 0 ; j < nFFTsize ; j++ ){
			time_domain[j][0] = m_vSampForFFT[ m_vSampForFFT.size() - j - 1 ];
			time_domain[j][1] = 0.0;						
		}								
		m_pcFFT->fft ( nFFTsize, &time_domain[0], &frec_domain[0] );							
		for (int j = 0 ; j < (nFFTsize)/2 + 1 ; j++){
			complex<double> tmp_complex (frec_domain[j][0],frec_domain[j][1]);					
			if ( j == 0 ){
				tmp_freqcmp.amp      = abs(tmp_complex)/float(nFFTsize);
				tmp_freqcmp.period   = 0.0;
				tmp_freqcmp.phs      = 0.0;
			}
			else{
				tmp_freqcmp.amp      = 2.0 * abs(tmp_complex)/float(nFFTsize);	
				tmp_freqcmp.period   = float(nFFTsize)/float(j);	
				tmp_freqcmp.phs      = - arg(tmp_complex);					
			}
			m_vFreqSignal.push_back     ( tmp_freqcmp );	
			m_vFreqSignal_amp.push_back ( tmp_freqcmp.amp );							
		}					
	}
	/* There are not enough samples  */
	else{			
		tmp_freqcmp.amp      = 0.0;
		tmp_freqcmp.period   = 0.0;
		tmp_freqcmp.phs      = 0.0;
		for (int j = 0 ; j < (nFFTsize)/2 + 1 ; j++){
			m_vFreqSignal.push_back     ( tmp_freqcmp );	
			m_vFreqSignal_amp.push_back ( tmp_freqcmp.amp );
		}		
	}	
	return;
};
コード例 #3
0
ファイル: simulator.cpp プロジェクト: mccagigal/mufco
void CSimulator::_calculateMF   ( void ){
	TVFloat  tmp_real, tmp_img;
	TVInt    tmp_pop;
	TVFloat* EArg = m_pcEnvironment->getNCSignalArg();
	TVFloat* EAmp = m_pcEnvironment->getNCSignalAmp();
	for ( int i = 0 ; i < m_nFFTsize/2 ; i++ ){
		tmp_real.push_back ( (*EAmp)[i] * cos ( (*EArg)[i] ) );
		tmp_img.push_back  ( (*EAmp)[i] * sin ( (*EArg)[i] ) );
		tmp_pop.push_back  ( 0 );				
	}
	for ( int i = 0 ; i < m_vpcOscillators.size() ; i++ ){
		tmp_real[m_vpcOscillators[i]->getCmp()] += cos ( m_vpcOscillators[i]->getArgument() );
		tmp_img [m_vpcOscillators[i]->getCmp()] += sin ( m_vpcOscillators[i]->getArgument() );
		tmp_pop [m_vpcOscillators[i]->getCmp()]++;
	}				
	m_vR.clear();
	m_vPhi.clear();
	m_vTheta.clear();
	for ( int i = 0 ; i < m_nFFTsize/2 ; i++ ){
		if ( ( float(tmp_pop[i]) + (*EAmp)[i] ) > 1e-3 ){ 
			tmp_real[i] /= ( float(tmp_pop[i]) + (*EAmp)[i] );
			tmp_img [i] /= ( float(tmp_pop[i]) + (*EAmp)[i] );
			complex<float> tmp_complex ( tmp_real[i] , tmp_img[i] );
			m_vR.push_back     ( abs( tmp_complex ) );
			m_vPhi.push_back   ( arg( tmp_complex ) );								
		}
		else{
			tmp_real[i] = 0.0;
			tmp_img [i] = 0.0;
			m_vR.push_back(0.0);
			m_vPhi.push_back(0.0);
		}
		float tmp_theta = 0.0;	
		if ( i != 0 )
			tmp_theta = m_vPhi.back() - fmod ( ( TWO_PI * float ( m_nSimStep) / ( m_nSampling * float( m_nFFTsize  )/float(i) ) ) , TWO_PI );
		if ( tmp_theta > M_PI )
			tmp_theta -= TWO_PI;
		else if ( tmp_theta < -M_PI )
			tmp_theta += TWO_PI;
		m_vTheta.push_back ( tmp_theta );
	}
	return;
};
コード例 #4
0
ファイル: environment.cpp プロジェクト: mccagigal/mufco
void CEnvironment::_signalFFT ( TVFloat* input , TVFreqCmp* fft_out , TVFloat* fft_amp_out ){	
	fft_out->clear();
	fft_amp_out->clear();
	SFreqCmp    tmp_freqcmp;
	/* There are enough samples */
	if ( input->size() >= m_nFFTsize ){				
		double time_domain  [m_nFFTsize][2];
		double frec_domain  [m_nFFTsize][2];							
		for ( int j = 0 ; j < m_nFFTsize ; j++ ){
			time_domain[j][0] = (*input)[ input->size() - j - 1 ]; // Realign time domain values
			time_domain[j][1] = 0.0;				
		}						
		m_pcFFT->fft ( m_nFFTsize, &time_domain[0], &frec_domain[0] );							
		for (int j = 0 ; j < m_nhalfFFTsize + 1 ; j++){
			complex<double> tmp_complex (frec_domain[j][0],frec_domain[j][1]);			
			if ( j == 0 ){
				tmp_freqcmp.amp      = abs(tmp_complex)/float(m_nFFTsize);
				tmp_freqcmp.period   = 0.0;
				tmp_freqcmp.phs      = 0.0;
			}
			else{
				tmp_freqcmp.amp      =   2.0 * abs(tmp_complex)/float(m_nFFTsize);	
				tmp_freqcmp.period   =   float( m_nFFTsize  )/float(j);
				tmp_freqcmp.phs      = - arg  ( tmp_complex );						
			}
			fft_out->push_back     ( tmp_freqcmp );	
			fft_amp_out->push_back ( tmp_freqcmp.amp );							
		}
		m_bNewFFT = true;			
	}
	/* There are not enough samples  */
	else{			
		tmp_freqcmp.amp      = 0.0;
		tmp_freqcmp.period   = 0.0;
		tmp_freqcmp.phs      = 0.0;
		for (int j = 0 ; j < m_nhalfFFTsize + 1 ; j++){
			fft_out->push_back     ( tmp_freqcmp );	
			fft_amp_out->push_back ( tmp_freqcmp.amp );
		}
		m_bNewFFT = false;
	}	
	return;
};