EEG EEG_and_PCA_to_EEG_principalComponents (EEG me, PCA thee, long numberOfComponents) { try { if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) { numberOfComponents = thy numberOfEigenvalues; } numberOfComponents = numberOfComponents > my d_numberOfChannels ? my d_numberOfChannels : numberOfComponents; autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1); autoEEG him = (EEG) Data_copy (me); autoSound pc = Sound_and_PCA_to_Sound_pc_selectedChannels (my d_sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension); for (long i = 1; i <= thy dimension; i++) { long ichannel = channelNumbers[i]; NUMvector_copyElements<double> (pc -> z[i], his d_sound -> z[ichannel], 1, his d_sound -> nx); } EEG_setChannelNames_selected (him.peek(), L"pc", channelNumbers.peek(), thy dimension); return him.transfer(); } catch (MelderError) { Melder_throw (me, ": not projected."); } }
EEG EEG_and_PCA_to_EEG_whiten (EEG me, PCA thee, long numberOfComponents) { try { if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) { numberOfComponents = thy numberOfEigenvalues; } numberOfComponents = numberOfComponents > my numberOfChannels ? my numberOfChannels : numberOfComponents; autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1); autoEEG him = (EEG) Data_copy (me); autoSound white = Sound_and_PCA_whitenSelectedChannels (my sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension); for (long i = 1; i <= thy dimension; i++) { long ichannel = channelNumbers[i]; NUMvector_copyElements<double> (white -> z[i], his sound -> z[ichannel], 1, his sound -> nx); } EEG_setChannelNames_selected (him.peek(), U"wh", channelNumbers.peek(), thy dimension); return him.transfer(); } catch(MelderError) { Melder_throw (me, U": not whitened with ", thee); } }