CrossCorrelationTable EEG_to_CrossCorrelationTable (EEG me, double startTime, double endTime, double lagTime, const wchar_t *channelRanges) { try { // autowindow if (startTime == endTime) { startTime = my xmin; endTime = my xmax; } // don't allow times outside domain if (startTime < my xmin) { startTime = my xmin; } if (endTime > my xmax) { endTime = my xmax; } autoEEG thee = my f_extractPart (startTime, endTime, true); long numberOfChannels; autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy d_numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1); autoSound soundPart = Sound_copyChannelRanges (thy d_sound, channelRanges); autoCrossCorrelationTable him = Sound_to_CrossCorrelationTable (soundPart.peek(), startTime, endTime, lagTime); // assign channel names for (long i = 1; i <= numberOfChannels; i++) { long ichannel = channels[i]; wchar_t *label = my d_channelNames[ichannel]; TableOfReal_setRowLabel (him.peek(), i, label); TableOfReal_setColumnLabel (him.peek(), i, label); } return him.transfer(); } catch (MelderError) { Melder_throw (me, ": no CrossCorrelationTable calculated."); } }
Sound EEG_to_Sound_modulated (EEG me, double baseFrequency, double channelBandwidth, const wchar_t *channelRanges) { try { long numberOfChannels; autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my d_numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1); double maxFreq = baseFrequency + my d_numberOfChannels * channelBandwidth; double samplingFrequency = 2 * maxFreq; samplingFrequency = samplingFrequency < 44100 ? 44100 : samplingFrequency; autoSound thee = Sound_createSimple (1, my xmax - my xmin, samplingFrequency); for (long i = 1; i <= numberOfChannels; i++) { long ichannel = channelNumbers[i]; double fbase = baseFrequency;// + (ichannel - 1) * channelBandwidth; autoSound si = Sound_extractChannel (my d_sound, ichannel); autoSpectrum spi = Sound_to_Spectrum (si.peek(), 1); Spectrum_passHannBand (spi.peek(), 0.5, channelBandwidth - 0.5, 0.5); autoSpectrum spi_shifted = Spectrum_shiftFrequencies (spi.peek(), fbase, samplingFrequency / 2, 30); autoSound resampled = Spectrum_to_Sound (spi_shifted.peek()); long nx = resampled -> nx < thy nx ? resampled -> nx : thy nx; for (long j = 1; j <= nx; j++) { thy z[1][j] += resampled -> z[1][j]; } } Vector_scale (thee.peek(), 0.99); return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": no playable sound created."); } }
CrossCorrelationTables EEG_to_CrossCorrelationTables (EEG me, double startTime, double endTime, double lagTime, long ncovars, const wchar_t *channelRanges) { try { // autowindow if (startTime == endTime) { startTime = my xmin; endTime = my xmax; } // don't allow times outside domain if (startTime < my xmin) { startTime = my xmin; } if (endTime > my xmax) { endTime = my xmax; } autoEEG thee = my f_extractPart (startTime, endTime, true); long numberOfChannels; autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy d_numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1); autoSound soundPart = Sound_copyChannelRanges (thy d_sound, channelRanges); autoCrossCorrelationTables him = Sound_to_CrossCorrelationTables (soundPart.peek(), startTime, endTime, lagTime, ncovars); return him.transfer(); } catch (MelderError) { Melder_throw (me, ": no CrossCorrelationTables calculated."); } }
autoCrossCorrelationTableList EEG_to_CrossCorrelationTableList (EEG me, double startTime, double endTime, double lagStep, long ncovars, const char32 *channelRanges) { try { // autowindow if (startTime == endTime) { startTime = my xmin; endTime = my xmax; } // don't allow times outside domain if (startTime < my xmin) { startTime = my xmin; } if (endTime > my xmax) { endTime = my xmax; } autoEEG thee = EEG_extractPart (me, startTime, endTime, true); long numberOfChannels; autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy numberOfChannels, & numberOfChannels, nullptr, U"channel", true), 1); autoSound soundPart = Sound_copyChannelRanges (thy sound.get(), channelRanges); autoCrossCorrelationTableList him = Sound_to_CrossCorrelationTableList (soundPart.get(), startTime, endTime, lagStep, ncovars); return him; } catch (MelderError) { Melder_throw (me, U": no CrossCorrelationTables calculated."); } }
EEG EEG_to_EEG_bss (EEG me, double startTime, double endTime, long ncovars, double lagTime, const wchar_t *channelRanges, int whiteningMethod, int diagonalizerMethod, long maxNumberOfIterations, double tol) { try { // autowindow if (startTime == endTime) { startTime = my xmin; endTime = my xmax; } // don't allow times outside domain if (startTime < my xmin) { startTime = my xmin; } if (endTime > my xmax) { endTime = my xmax; } long numberOfChannels; autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my d_numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1); autoEEG thee = my f_extractPart (startTime, endTime, true); if (whiteningMethod != 0) { bool fromCorrelation = whiteningMethod == 2; autoPCA pca = EEG_to_PCA (thee.peek(), thy xmin, thy xmax, channelRanges, fromCorrelation); autoEEG white = EEG_and_PCA_to_EEG_whiten (thee.peek(), pca.peek(), 0); thee.reset (white.transfer()); } autoMixingMatrix mm = Sound_to_MixingMatrix (thy d_sound, startTime, endTime, ncovars, lagTime, maxNumberOfIterations, tol, diagonalizerMethod); autoEEG him = EEG_copyWithoutSound (me); his d_sound = Sound_and_MixingMatrix_unmix (my d_sound, mm.peek()); EEG_setChannelNames_selected (him.peek(), L"ic", channelNumbers.peek(), numberOfChannels); // Calculate the cross-correlations between eye-channels and the ic's return him.transfer(); } catch (MelderError) { Melder_throw (me, ": no independent components determined."); } }