林羽川 2025-05-06 20:13 采纳率: 0%
浏览 9

Psychopy音频相关疑惑

使用Psychopy生成纯音刺激总是报错:

import numpy as np
from psychopy import sound, core, visual, event, data
import random

# === 参数设置 ===
sample_rate = 44100
freq = 1000  # Hz
durations_ms = list(range(30, 201, 10))  # [30, 40, ..., 200]
tone_dict = {}

# === 提前生成多个时长的纯音 ===
for dur_ms in durations_ms:
    dur_sec = dur_ms / 1000.0
    t = np.linspace(0, dur_sec, int(sample_rate * dur_sec), endpoint=False)
    wave = 0.5 * np.sin(2 * np.pi * freq * t)  # 正弦波,振幅0.5
    tone_dict[dur_ms] = wave

# === 创建窗口 ===
win = visual.Window([800, 600])
fixation = visual.TextStim(win, text='+')
prompt = visual.TextStim(win, text="声音在第几次出现?按 1 或 2")

# === QUEST 设置 ===
quest = data.QuestHandler(startVal=60, startValSd=20, pThreshold=0.75,
                          gamma=0.5, beta=3.5, delta=0.01,
                          nTrials=25, minVal=30, maxVal=200)

for stimDur in quest:
    stimDur_ms = int(round(stimDur / 10.0) * 10)  # 四舍五入到 10ms 精度
    stimDur_ms = max(30, min(200, stimDur_ms))   # 边界裁剪

    tone_arr = tone_dict[stimDur_ms]
    correct_interval = random.choice([1, 2])

    # 第一间隔
    fixation.draw(); win.flip(); core.wait(0.5)
    if correct_interval == 1:
        s = sound.Sound(value=tone_arr, sampleRate=sample_rate)
        s.play()
    core.wait(stimDur_ms / 1000.0)
    core.wait(0.5)

    # 第二间隔
    fixation.draw(); win.flip(); core.wait(0.5)
    if correct_interval == 2:
        s = sound.Sound(value=tone_arr, sampleRate=sample_rate)
        s.play()
    core.wait(stimDur_ms / 1000.0)
    core.wait(0.5)

    # 被试响应
    prompt.draw(); win.flip()
    keys = event.waitKeys(keyList=['1', '2', 'escape'])
    if 'escape' in keys:
        break

    response = int(keys[0])
    quest.addResponse(response == correct_interval)

print(f"估计的听觉阈限为:{quest.quantile():.2f} ms")
win.close()
core.quit()


报错:TypeError: cannot unpack non-iterable NoneType object

该怎么办,快要崩溃了。

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-05-06 20:36
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 代码中存在明显的语法错误。从提供的代码片段“impor”可以看出,“import”语句没有完整写完,这会导致Python解释器无法识别后续引入的模块,从而报错。
    2. 解决方案
      - 修正导入语句。完整的代码示例如下:
    import numpy as np
    from psychopy import sound, core, visual, event, data
    
    # 创建一个纯音
    mySound = sound.Sound(440, secs = 0.5)  # 440Hz的纯音,持续0.5秒
    
    # 播放声音
    mySound.play()
    
    # 等待声音播放完毕
    core.wait(mySound.getDuration())
    
    # 关闭窗口等资源
    win = visual.Window(size=(800, 600))
    win.close()
    core.quit()
    
    • 在上述代码中,首先正确导入了所需的模块。然后创建了一个频率为440Hz、持续时间为0.5秒的纯音,并进行播放,最后等待声音播放完毕后关闭窗口和退出程序。
      3. 关于多种解决方案的说明
    • 此问题主要是代码语法错误导致的,解决方法就是修正错误的导入语句,不存在多种本质不同的解决方案。如果代码在其他方面出现问题,比如声音播放效果不符合预期等,可能会有更多的解决思路,例如:
      • 检查声音频率是否在声卡支持的范围内。不同的声卡可能对声音频率有一定的限制。
      • 确保声卡驱动正常安装,没有被其他程序占用。
        4. 总结
    • 要解决Psychopy生成纯音报错的问题,首先要检查代码的语法错误,确保导入语句等代码正确书写。然后根据具体需求设置声音的参数,如频率、时长等,最后按照正确的流程进行声音的播放和程序资源的清理。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月6日