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