Зацикливание нескольких переменных для применения функции психопатии sound.Sound () - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь применить функцию sound.Sound() к массиву в цикле. В частности, я хочу сделать ниже в цикле. a_wave to d_wave - это массивы numpy.

stim_a = sound.Sound(a_wave)
stim_b = sound.Sound(b_wave)
stim_c = sound.Sound(c_wave)
stim_d = sound.Sound(d_wave)

Я пробовал цикл ниже.

import sys
this = sys.modules[__name__]
import string

letters = list(string.ascii_lowercase)
a_d = letters[:4]
for x in range(len(a_d)):
    setattr(this, 'stim_%s' % a_d[x], sound.Sound('%s_wave' % a_d[x]))

Но в результате я получаю следующую ошибку:

File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\psychopy-1.83.01-py2.7.egg\psychopy\sound.py", line 389, in __init__
    self.setSound(value=value, secs=secs, octave=octave, hamming=hamming)
File "C:\Program Files (x86)\PsychoPy2\lib\site-packages\psychopy-1.83.01-py2.7.egg\psychopy\sound.py", line 146, in setSound
    raise ValueError, "setSound: could not find a sound file named " + value
ValueError: setSound: could not find a sound file named a_wave

Я был бы очень признателен, если бы мог получить совет по этому вопросу. Я вставляю весь код ниже для справки.

from __future__ import division
from psychopy import sound
import sys
this = sys.modules[__name__]
import numpy as np
import string

#generate string lists
letters = list(string.ascii_lowercase)
a_d = letters[:4]

sampling_rate = 44100 #in Hz
target_fq = 200
long_dur = 0.150
short_dur = 0.066
short_blank = 0.066
long_blank = 0.150
double_blank = 0.233

#short
short_index = np.array(range(int(round(short_dur / (1/float(sampling_rate)))-1)))
short_wave = np.sin(2*np.pi*target_fq*(short_index/float(sampling_rate)))
short_blank_wave = np.zeros(short_blank*sampling_rate) #Small fudge factor to bring total stim length to 4410

#long
long_index = np.array(range(int(round(long_dur / (1/float(sampling_rate)))-1)))
long_wave = np.sin(2*np.pi*target_fq*(long_index/float(sampling_rate)))
long_blank_wave = np.zeros(long_blank*sampling_rate)

#double blank
double_blank_wave = np.zeros(double_blank*sampling_rate)

#numpy arrays
a_wave = np.concatenate((long_wave, short_blank_wave, long_wave), axis=0)
b_wave = np.concatenate((short_wave, long_blank_wave, long_wave), axis=0)
c_wave = np.concatenate((long_wave, long_blank_wave, short_wave), axis=0)
d_wave = np.concatenate((short_wave, double_blank_wave, short_wave), axis=0)

for x in range(len(a_d)):
    setattr(this, 'stim_%s' % a_d[x], sound.Sound('%s_wave' % a_d[x]))

1 Ответ

0 голосов
/ 29 августа 2018

Вы (удивительно запутанным образом) просто строите строки (например, 'a_wave'), чтобы перейти к звуковому объекту. Звуковой объект, естественно, интерпретирует их как открываемое имя файла, что не удается. то есть обратите внимание, что строка 'a_wave' не соответствует объекту массива a_wave, к которому вы пытаетесь обратиться.

Вы можете просто сделать что-то вроде этого:

sound_stim = sound.Sound()

for sound_array in (a_wave, b_wave, c_wave, d_wave):

    for entry in sound_array:
        sound_stim.setSound(entry)
        sound_stim.play()
        # probably need some sort of delay loop here, as
        # playing doesn't block execution.

Но так как вы не четко выразили, чего пытаетесь достичь, я просто догадываюсь здесь. Обратите внимание, что массивы a_wave и т. Д. Вовсе не обязательно должны быть просто массивами, они могут быть просто списками Python, что упростит их построение. например,

a_wave = [long_wave, short_blank_wave, long_wave]

В общем, вы чрезмерно дорабатываете свой код. Сохраняйте это простым и Pythonic.

...