예제 #1
0
def test_read_write_wav():
    """Test reading and writing WAV files
    """
    fname = op.join(tempdir, 'temp.wav')
    data = np.r_[np.random.rand(1000), 1, -1]
    fs = 44100

    # Use normal 16-bit precision: not great
    write_wav(fname, data, fs)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 4)

    # test our overwrite check
    assert_raises(IOError, write_wav, fname, data, fs)

    # test forcing fs dtype to int
    with warnings.catch_warnings(record=True) as w:
        warnings.simplefilter('always')
        write_wav(fname, data, float(fs), overwrite=True)
        assert_equal(len(w), 1)

    # Use 64-bit int: not supported
    assert_raises(RuntimeError, write_wav, fname, data, fs, dtype=np.int64,
                  overwrite=True)

    # Use 32-bit int: better
    write_wav(fname, data, fs, dtype=np.int32, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

    if _has_scipy_version('0.13'):
        # Use 32-bit float: better
        write_wav(fname, data, fs, dtype=np.float32, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

        # Use 64-bit float: perfect
        write_wav(fname, data, fs, dtype=np.float64, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_equal(data[np.newaxis, :], data_read)
    else:
        assert_raises(RuntimeError, write_wav, fname, data, fs,
                      dtype=np.float32, overwrite=True)

    # Now try multi-dimensional data
    data = np.tile(data[np.newaxis, :], (2, 1))
    write_wav(fname, data[np.newaxis, :], fs, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data, data_read, 4)

    # Make sure our bound check works
    assert_raises(ValueError, write_wav, fname, data * 2, fs, overwrite=True)
예제 #2
0
def test_read_write_wav(tmpdir):
    """Test reading and writing WAV files."""
    fname = op.join(str(tmpdir), 'temp.wav')
    data = np.r_[np.random.rand(1000), 1, -1]
    fs = 44100

    # Use normal 16-bit precision: not great
    write_wav(fname, data, fs)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 4)

    # test our overwrite check
    pytest.raises(IOError, write_wav, fname, data, fs)

    # test forcing fs dtype to int
    with pytest.warns(UserWarning, match='rate is being cast'):
        write_wav(fname, data, float(fs), overwrite=True)

    # Use 64-bit int: not supported
    pytest.raises(RuntimeError, write_wav, fname, data, fs, dtype=np.int64,
                  overwrite=True)

    # Use 32-bit int: better
    write_wav(fname, data, fs, dtype=np.int32, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

    if _has_scipy_version('0.13'):
        # Use 32-bit float: better
        write_wav(fname, data, fs, dtype=np.float32, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

        # Use 64-bit float: perfect
        write_wav(fname, data, fs, dtype=np.float64, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_equal(data[np.newaxis, :], data_read)
    else:
        pytest.raises(RuntimeError, write_wav, fname, data, fs,
                      dtype=np.float32, overwrite=True)

    # Now try multi-dimensional data
    data = np.tile(data[np.newaxis, :], (2, 1))
    write_wav(fname, data[np.newaxis, :], fs, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data, data_read, 4)

    # Make sure our bound check works
    pytest.raises(ValueError, write_wav, fname, data * 2, fs, overwrite=True)
 def run_trial(ti, feedback=False):
     """Run a trial, optionally with feedback"""
     samples = read_wav(op.join(stim_dir, p['stim_names'][ti]))[0]
     ec.load_buffer(samples)
     id_ = decimals_to_binary(p['cond_mat'][ti], [1, 2, 2, 1])
     ec.identify_trial(ec_id=id_, ttl_id=id_, el_id=id_)
     ec.listen_presses()
     t0 = ec.start_stimulus(flip=False)
     wait_dur = p['trial_durs'][ti]
     wait_dur -= p['inter_trial_dur'] - 0.5 if feedback else 0
     presses = ec.wait_for_presses(wait_dur, relative_to=t0)
     ec.stop()
     ec.trial_ok()
     correct = True
     if feedback:
         press_times = [pp[1] for pp in presses]
         p['targ_pos'][ti][0]
         t = p['stim_times'][p['cond_mat'][ti][3]][2:]
         targ = t[p['targ_pos'][ti][0].astype(bool)]
         foil = t[p['targ_pos'][ti][1].astype(bool)]
         hmfc = press_times_to_hmfc(press_times, targ, foil, tmin, tmax)
         correct = (hmfc[1] == hmfc[2] == hmfc[4] == 0)
         if correct:
             msg = 'Correct!\n\n'
         else:
             msg = 'Incorrect:\n'
             if hmfc[1] > 0:
                 pl = 's' if hmfc[1] != 1 else ''
                 msg += '\n    - Missed %s target "O"%s\n' % (hmfc[1], pl)
             x = hmfc[2] + hmfc[4]
             if x > 0:
                 pl = 's' if x != 1 else ''
                 msg += '\n    - Pressed to %s non-target "O"%s' % (x, pl)
         ec.screen_prompt(msg + continue_msg, color=fcolor)
         fix.draw()
         ec.flip()
     return correct
예제 #4
0
    bi = get_keyboard_input('Enter block number (%s): ' % 1, 1, int) - 1
    session = int(ec.session) - 1 if ec.session != '' else 0
    while 0 <= bi < len(p['block_trials']):
        # start of each block
        ec.start_noise()
        ec.set_visible(True)
        ec.write_data_line('block', bi)
        fix.draw()
        ec.flip()
        ec.wait_for_presses(5.0)

        # each trial
        trials = p['block_trials'][p['blocks'][session][bi]]
        for ti in trials:
            # stimulus
            samples = read_wav(op.join(stim_dir, p['stim_names'][ti]))[0]
            ec.load_buffer(samples)
            stamp = np.concatenate([p['cond_mat'][ti], p['which_targ'][ti]])
            id_ = decimals_to_binary(stamp, [1, 2, 2, 1, 2, 2])
            ec.identify_trial(ec_id=id_, ttl_id=id_)
            ec.listen_presses()

            fix.draw()
            t0 = ec.start_stimulus()

            # response
            fix.draw()
            circ.draw()
            targ_text.draw()
            ec.flip(t0 + p['resp_onset'])
            ec.stamp_triggers([2])
예제 #5
0
assert n_dpc + n_npc == n_tpc

##############################################################################
# Load letter WAV files

all_spatials = [s.split('x') for s in spatials]
for s in all_spatials[1:]:
    all_spatials[0] += s
all_spatials = all_spatials[0]
all_spatials = list(np.unique([float(s) for s in all_spatials]))

letter_dir = op.join(work_dir, 'letters')
wavs = np.zeros((len(talkers), len(letters), len(all_spatials), 2, letter_ns))
for li, letter in enumerate(letters):
    for ti, talker in enumerate(talkers):
        data, fs_in = read_wav(op.join(letter_dir, talker, '%s.wav' % letter),
                               verbose=False)
        data = resample(data[0], fs, fs_in)
        for si, angle in enumerate(all_spatials):
            dd = convolve_hrtf(data, fs, angle)
            dd *= 0.01 / np.mean(rms(data))
            idx = min(dd.shape[1], letter_ns)
            wavs[ti, li, si, :, :idx] = dd[:, :idx]

##############################################################################
# Randomization

n_trials = n_tpc * len(attns) * run_matrix.sum() * len(gap_durs)
trial_dur = (letter_dur * (n_cue_let + n_targ_let) + cue_targ_gap +
             np.mean(gap_durs) + inter_trial_dur)
exp_dur = trial_dur * n_trials
print('Experiment duration: %s min (%s blocks)' %
    def demo_trial(ti, title, tstr):
        ec.screen_prompt(demo_instr, color=fcolor)
        samples = read_wav(op.join(stim_dir, p['stim_names'][ti]))[0]
        ec.load_buffer(samples)
        these_letters = [[p['letters'][ii] for ii in row]
                         for row in p['letter_mat'][ti]]

        # init and draw letters
        let_times = p['stim_times'][p['cond_mat'][ti][3]]
        xs = (let_times - let_times[0]) / (let_times[-1] - let_times[0])
        xs = xs / 2.
        ys = [0.1, -0.1]
        let_colors = [(0.25, ) * 3, 'w', (0., 1., 0.)]
        sw_trial = (p['cond_mat'][ti, 0] == sw_id)
        assert tstr in ('male', 'female')
        strs = ['Male:', 'Female:'] if tstr == 'male' else ['Female:', 'Male:']
        cues = [
            visual.Text(ec,
                        s, [-0.1, y],
                        anchor_x='right',
                        font_size=48,
                        color=let_colors[1 - ii])
            for ii, (s, y) in enumerate(zip(strs, ys))
        ]
        title = visual.Text(ec,
                            title, [-0.1, 0.4],
                            font_size=36,
                            color='w',
                            anchor_x='left')
        for ii, y in enumerate(ys):
            for jj, x in enumerate(xs):
                if ii == 0 or jj >= p['n_cue_let']:
                    if jj >= p['n_cue_let']:
                        let = these_letters[ii][jj]
                    else:
                        let = 'A' if jj == 0 or not sw_trial else 'U'
                    letters[ii][jj] = visual.Text(ec,
                                                  let, [x, y],
                                                  font_size=48,
                                                  anchor_x='left',
                                                  color=let_colors[0])
                    letters[ii][jj].draw()
        title.draw()
        [c.draw() for c in cues]
        ec.flip()
        ec.wait_secs(2.0)  # show stim for a bit
        for tidx, t in enumerate(let_times):
            color = let_colors[1]
            ii = 0
            if tidx >= p['n_cue_let'] and \
                    p['targ_pos'][ti][0][tidx-p['n_cue_let']]:
                color = let_colors[2]
            if sw_trial and tidx >= p['n_cue_let'] + p['gap_after']:
                ii = 1
            letters[ii][tidx].set_color(color)

            for jj in range(len(let_times)):
                for ii in range(2):
                    if ii == 0 or jj >= p['n_cue_let']:
                        letters[ii][jj].draw()
            title.draw()
            [c.draw() for c in cues]

            if tidx == 0:
                t0 = ec.start_stimulus(flip=True, start_of_trial=False)
            else:
                ec.flip(t0 + t)
        ec.flip(t0 + p['trial_durs'][ti])
        ec.stop()
        ec.screen_prompt('Press a button to continue.', color=fcolor)
예제 #7
0
파일: runKexp.py 프로젝트: kdmarrett/kexp
def recordTrial(wheel_matrix_info, preblock, block_ind, bnum, instr, ec,
        stimdir, final_datadir, record_pupil, record_correct,
        save_correct):

    """ Takes the indice of all current condition types and the binary
    name of the condition to find the trial wav.  Displays instructions
    according to instr() and plays stimuli while recording and logging
    pupillometry data.  """

    # identify paradigm and trial number
    #start_time = timeit.default_timer()
    trial_vars = getTrialInfo(block_ind, bnum)
    #elapsed = timeit.default_timer() - start_time
    #print 'load mat ' + str(elapsed) + '\n'
    data_file_name = 'b' + str(bnum) + '_tr' + str(block_ind[bnum]) 
    stim_file_name = 'b' + str(bnum) + '_tr' + str(block_ind[bnum]) + '.wav'
    trial_stim_path = op.join(stimdir, stim_file_name)

    # UNLOAD TRIAL VARS (AVOIDS AWKWARD INDEXING)
    # Creates dict of vars: 'target_letter', 'target_time',
    # 'tot_wav_time', 'paradigm', 'possible_letters' 'tot_cyc'
    target_cycles = trial_vars['target_cycles']
    id_list = trial_vars['trial_id'][0].tolist()
    target_letter = trial_vars['target_letter'][0][0][0].encode('ascii')
    possible_letters = trial_vars['possible_letters'][0]
    final_vars = dict()
    final_vars['trial_id'] = id_list
    # load WAVs for this block
    #start_time = timeit.default_timer()
    stims = []
    stims.append(read_wav(trial_stim_path)[0])  # ignore fs
    stim_dur = stims[0].shape[-1] / ec.stim_fs
    #elapsed = timeit.default_timer() - start_time
    ec.clear_buffer()
    ec.load_buffer(stims[0])
    #elapsed = timeit.default_timer() - start_time
    #print 'load stimuli ' + str(elapsed) + '\n'
    # draw visual primer
    drawPrimer(wheel_matrix_info, target_letter, possible_letters)

    # make screenshots
    #screenshot = ec.screenshot()
    #screen_obj = op.join(edf_outputdir, str(block_ind[bnum]) +
            #'screenshot.obj')
    #screenshot_file = open(screen_obj, 'w')
    #pck.dump(screenshot, screenshot_file)

    # edf stamped for epoch starts
    ec.identify_trial(ec_id=id_list, el_id=id_list, ttl_id=id_list)
    #if record_pupil:
        #ec.identify_trial(ec_id=id_list, el_id=id_list, ttl_id=id_list)
    #else:
        #try:
            #ec.identify_trial(ec_id=id_list, ttl_id=id_list)
        #except:
            #ec.identify_trial(ec_id=id_list, el_id=id_list, ttl_id=id_list)
    ec.start_stimulus(flip=True)  # the visual primer is displayed
    if debug:
        ec.wait_secs(2)
    else:
        ec.wait_secs(vPrimerLen)
    # Draw fixation dot to visual buffer
    fix = visual.FixationDot(ec, colors=['whitesmoke', 'whitesmoke'])
    fix.draw()
    ec.flip()  # the fixation dot is displayed
    if debug:
        ec.wait_secs(1)  
    else:
        # wait until stim has finished
        ec.wait_secs(stim_dur - vPrimerLen)  
        ec.wait_secs(postblock)
    # clear screen
    ec.flip()
    #write all pertinent data as a safety
    if record_pupil:
        ec.write_data_line('target_letter', target_letter)
        ec.write_data_line('target_cycles', target_cycles)

    ec.stop()
    ec.trial_ok()
    # update indexer
    block_ind[bnum] += 1
    if (record_correct):
        response = promptResponse(ec)
        if (response == target_cycles):
            correct = 1
        else:
            correct = 0
        ec.write_data_line('correct: ', correct)
        if save_correct:
            final_dfn = data_file_name + 'final'
            # save with other edf files for exp
            out_path = op.join(edf_outputdir, final_dfn)
            # add in an extra 'correct' data field
            final_vars['correct'] = correct
            sio.savemat(out_path, final_vars)

        return correct
    else:
        return 0
예제 #8
0
파일: test_wav.py 프로젝트: nordme/genz
def test_read_write_wav():
    """Test reading and writing WAV files
    """
    fname = op.join(tempdir, 'temp.wav')
    data = np.r_[np.random.rand(1000), 1, -1]
    fs = 44100

    # Use normal 16-bit precision: not great
    write_wav(fname, data, fs)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 4)

    # test our overwrite check
    assert_raises(IOError, write_wav, fname, data, fs)

    # test forcing fs dtype to int
    with warnings.catch_warnings(record=True) as w:
        warnings.simplefilter('always')
        write_wav(fname, data, float(fs), overwrite=True)
        assert_equal(len(w), 1)

    # Use 64-bit int: not supported
    assert_raises(RuntimeError,
                  write_wav,
                  fname,
                  data,
                  fs,
                  dtype=np.int64,
                  overwrite=True)

    # Use 32-bit int: better
    write_wav(fname, data, fs, dtype=np.int32, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

    if _has_scipy_version('0.13'):
        # Use 32-bit float: better
        write_wav(fname, data, fs, dtype=np.float32, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_almost_equal(data[np.newaxis, :], data_read, 7)

        # Use 64-bit float: perfect
        write_wav(fname, data, fs, dtype=np.float64, overwrite=True)
        data_read, fs_read = read_wav(fname)
        assert_equal(fs_read, fs)
        assert_array_equal(data[np.newaxis, :], data_read)
    else:
        assert_raises(RuntimeError,
                      write_wav,
                      fname,
                      data,
                      fs,
                      dtype=np.float32,
                      overwrite=True)

    # Now try multi-dimensional data
    data = np.tile(data[np.newaxis, :], (2, 1))
    write_wav(fname, data[np.newaxis, :], fs, overwrite=True)
    data_read, fs_read = read_wav(fname)
    assert_equal(fs_read, fs)
    assert_array_almost_equal(data, data_read, 4)

    # Make sure our bound check works
    assert_raises(ValueError, write_wav, fname, data * 2, fs, overwrite=True)