神奇 什么时候试试
几年前我在网络冲浪的过程中就发现了个神奇的东西-清醒梦
能够在做梦的过程中意识自己在做梦,并且在意识到后还能控制梦境
这种真实性目前还没有什么虚拟沉浸式设备能够实现
要实现类似的效果,也通常得服用某些物质
虽然我比较感兴趣,不过实际上并未尝试多少次 [总成功次数大约为10次]
主要是影响睡眠,需要在睡着后5-6小时醒来,然后再让自己清醒15-30分钟,最后再执行类似于冥想的方法睡去。
不过也有不影响睡眠的,就是影响清醒的时候了,需要你在清醒的时候时不时的提醒自己验证是否在梦中,以便在做梦的时候发现自己在做梦。
并且我成功入梦后体验不是很好,要不然是四肢动不了,要不然就是睁眼是漆黑一片,梦中开灯也几乎没亮度,或是清晰度很差,很难撑开眼睛。 只有非常少数的梦能够正常踏出卧室门。
今年暑假想着能不能做个能够监测目前是否在做梦并进行提醒的设备
之前就了解过市售的各种清醒梦眼罩或是手表,全都是通过简单的计时,然后到了理论的快速眼动期或是自己设置的时间后就开始发光或震动
(这个是放置在某个敏感部位 到时间震动 试图诱发春梦或清醒梦 看着挺有意思的)
这类设备可能能够增加清醒梦概率的,不过我需要的是真的能监测到梦境并发送信号的
一开始我看我的小米手环就有睡眠监测功能,能够显示出处于深睡,浅睡或是快速眼动期,说不定能简单的通过心率监测判断出睡眠周期
不过后来我看了一个youtube博主,专门测评手表各种监测功能准确性的,实际上手环的睡眠周期监测并不准确
另外我还谷歌搜索了一下,搜出了这个论文
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
显示EOG,ECG,EMG 的REM Accuracy (准确率) 都很高
EOG,EMG 的REM Sensitivity (灵敏度) Cohen’s Kappa (一致性 ) 都较高
其中EOG是眼电监测,ECG是心电监测,EMG是监测颏下肌的肌电
肌电监测REM是通过监测颏下肌是否比正常状态的信号还要低,这个可能对监测设备的噪音性能有一定要求,先忽略
心电由于看手表测评精度不高,并且在这个论文内其他参数也比较差,先忽略
脑电必须使用某些厂商的脑电芯片或是套件,淘宝常见的就是金牛座的脑电波模块,据介绍会输出原始脑波,然后会提供放松度和专注度数值。 不过我有点不相信这个的准确性,并且看这电路板不像是好调试的。
眼电就简单许多了,只需要监测眼球转动,噪音性能要求应该会比上面所说的肌电脑电小许多。
单纯搜索眼电设备
95db的总增益 5.6万倍的放大
滤波范围 0.02Hz-30Hz
mv单位
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
搜索 眼电图 清醒梦 搜出了一篇9年前的个人网站上的文章,通过监测眼电来实现清醒梦在9年前就有人尝试过了
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
约60db总增益 900倍
滤波范围1Hz-17Hz
既然已经有了先例并且效果看着很不错,那就直接copy过来。
肌电监测设备:
把原电路的集成arduino删掉,然后输入改成使用耳机接口连接导联线,另外AD620 RG电阻修改为680,实际为67db总增益 2200倍放大。
导联线红色为耳机接口的地,接额头。其余两个为耳机接口的左声道右声道,接左右眼的外眦
LMV358是双路运放,可以一路用于放大,一路做电压跟随器
不过原电路图是用的两个双路的LMV358,每个分别做运放和电压跟随器,另外一路单纯悬空,那我也就这样
肌肉电信号放大:
1.通过导联线将信号输入至AD620仪表放大器 放大73.6倍 :
G = 49.4 kΩ/R_G + 1
REF参考电压接入2.5V的虚拟地
2.AD620放大后通过RC高通滤波器 截止频率设置为1hz
fc = 1 / (2πRC)
3.滤波后通过LMV358运放 放大30倍
R4/R3
4.最后通过两个RC低通滤波器 设置截止频率为17HZ,输出最终信号至arduino ADC。
虚拟地:
LMV358做电压跟随器 设置虚拟地为+2.5V,作为肌电信号的中点
PCB部分:
走线弯弯绕绕的也没有铺铜
只是大概确保输入和输出没有上下重叠或平行
设备实物:
arduino开发板是国产的,ad620[25元]和lmv358[0.4元]是淘宝优信买的原装
供电用的是两节18650锂电池,不要用任何源头是220v的电源供电,除了噪音还有安全性。
全部用的杜邦线连接,不是好的连接方式,可能随便碰一碰就会有断触或波动。
[由于睡眠中有翻身之类的操作,有时候会扯到导联线,这个排针就是牵扯导致的弯曲]
心电电极片
如果导联线的纽扣扣上去了,就不能拔出来,要不然可能会导致接触不良
一开始我还以为是元件问题,我去重新焊接了一下RG电阻,重新插上就没用了,我还在想这电子元件这么脆弱吗,然后下单新的AD620
后面我用力按着头上的电极片,波形又正常了。。。
原来是我焊接的时候为了方便把扣上电极的导联线拔出来了
arduino程序部分:
// AI大师写的
#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11);
const int EEPROM_START_ADDRESS = 0;
const int MAX_RECORDS = 1000;
const int MAX_RECORD_SIZE = sizeof(unsigned long) + 1;
int nextRecordAddress = EEPROM_START_ADDRESS;
const byte RECORD_TERMINATOR = 0xFF;
const int SAMPLING_PERIOD = 20;
const float VOLTAGE_THRESHOLD = 2.7;
const int TRIGGER_COUNT_THRESHOLD = 6;
const unsigned long TIME_WINDOW = 80000;
const int CYCLE_COUNT = 16;
unsigned long triggerTimes[TRIGGER_COUNT_THRESHOLD];
int triggerCount = 0;
bool pin2Triggered = false;
enum TriggerState {
IDLE,
PWM_ACTIVE,
LED_FLASHING,
COOLDOWN
};
TriggerState state = IDLE;
unsigned long stateStartTime = 0;
unsigned long lastActionTime = 0;
int cycleStep = 0;
int flashCount = 0;
void setup() {
Serial.begin(9600);
Serial.println("bluetooth is ready!");
BT.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
for (int i = 0; i < TRIGGER_COUNT_THRESHOLD; i++) {
triggerTimes[i] = 0;
}
EEPROM.get(EEPROM_START_ADDRESS + MAX_RECORDS * MAX_RECORD_SIZE, nextRecordAddress);
if (nextRecordAddress < EEPROM_START_ADDRESS || nextRecordAddress >= EEPROM_START_ADDRESS + MAX_RECORDS * MAX_RECORD_SIZE) {
nextRecordAddress = EEPROM_START_ADDRESS;
}
}
void loop() {
unsigned long now = millis();
// ===== Voltage sampling and trigger detection =====
static unsigned long lastSampleTime = 0;
static unsigned long lastDebounceTime = 0;
if (state == COOLDOWN) {
// During cooldown, only check for exiting cooldown
if (now - stateStartTime >= 2UL * 60UL * 1000UL) { // 2 minutes
pin2Triggered = false;
state = IDLE;
triggerCount = 0;
for (int i = 0; i < TRIGGER_COUNT_THRESHOLD; i++) {
triggerTimes[i] = 0;
}
}
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
BT.println(voltage);
return; // Skip all other processing during cooldown
}
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
BT.println(voltage);
if (now - lastSampleTime >= SAMPLING_PERIOD) {
lastSampleTime = now;
bool isTriggered = voltage > VOLTAGE_THRESHOLD;
if (isTriggered && !pin2Triggered) {
if (now - lastDebounceTime < 600) return;
lastDebounceTime = now;
BT.println("move");
digitalWrite(LED_BUILTIN, HIGH);
for (int i = 0; i < TRIGGER_COUNT_THRESHOLD - 1; i++) {
triggerTimes[i] = triggerTimes[i + 1];
}
triggerTimes[TRIGGER_COUNT_THRESHOLD - 1] = now;
triggerCount = min(triggerCount + 1, TRIGGER_COUNT_THRESHOLD);
if (triggerCount >= TRIGGER_COUNT_THRESHOLD) {
unsigned long earliest = triggerTimes[0];
unsigned long latest = triggerTimes[0];
for (int i = 1; i < TRIGGER_COUNT_THRESHOLD; i++) {
if (triggerTimes[i] < earliest) earliest = triggerTimes[i];
if (triggerTimes[i] > latest) latest = triggerTimes[i];
}
if (latest - earliest <= TIME_WINDOW) {
BT.println("dream");
if (nextRecordAddress + MAX_RECORD_SIZE <= EEPROM_START_ADDRESS + MAX_RECORDS * MAX_RECORD_SIZE) {
unsigned long recordTime = now / 1000;
EEPROM.put(nextRecordAddress, recordTime);
EEPROM.write(nextRecordAddress + sizeof(unsigned long), RECORD_TERMINATOR);
EEPROM.put(EEPROM_START_ADDRESS + MAX_RECORDS * MAX_RECORD_SIZE, nextRecordAddress += MAX_RECORD_SIZE);
Serial.println(recordTime);
} else {
nextRecordAddress = EEPROM_START_ADDRESS;
}
triggerCount = 0;
for (int i = 0; i < TRIGGER_COUNT_THRESHOLD; i++) triggerTimes[i] = 0;
pin2Triggered = true;
state = PWM_ACTIVE;
stateStartTime = now;
cycleStep = 0;
analogWrite(3, 0);
}
}
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
}
// ===== State machine for PWM and LED flashing =====
switch (state) {
case PWM_ACTIVE:
if (now - stateStartTime >= 2000UL * cycleStep) {
if (cycleStep < CYCLE_COUNT * 2) {
if (cycleStep % 2 == 0) {
analogWrite(3, 30);
digitalWrite(4, HIGH);
} else {
analogWrite(3, 0);
digitalWrite(4, LOW);
}
cycleStep++;
} else {
analogWrite(3, 0);
digitalWrite(4, LOW);
state = LED_FLASHING;
stateStartTime = now;
flashCount = 0;
lastActionTime = now;
}
}
break;
case LED_FLASHING:
if (now - lastActionTime >= (flashCount % 2 == 0 ? 2000 : 1000)) {
digitalWrite(4, flashCount % 2 == 0 ? HIGH : LOW);
flashCount++;
lastActionTime = now;
}
if (flashCount >= 2) {
digitalWrite(4, LOW);
state = COOLDOWN;
stateStartTime = now;
}
break;
case COOLDOWN:
// Handled at the start of loop
break;
case IDLE:
default:
break;
}
}一开始是单纯的daly,触发了2.7v就记录移动然后delay一会,如果触发了超过几次就触发for循环,用delay延迟,开灯关灯开蜂鸣器关蜂鸣器
后面需要记录波形,就不能用delay了,要不然会阻塞
达到一定电压就记录移动一次,记录后延迟一段时间确保单次上升波形不重复触发
眼动的波形不一定像理想的在一定时间内"上升 到顶 下降 过中点 继续下降到底点 回中"
目前就是单纯的达到电压就触发,可以加个与前一次数据差值太大就忽略掉
80秒内记录6次就判断为在做梦
设计有两个周期,第一个周期蜂鸣器 led都触发,第二个周期单纯触发led
为了不那么容易唤醒又能有一定的提醒效果,不过实际上用不上
另外我的笔记本漏电严重 ,用手摸没事,但是如果用arduino连接笔记本usb插入和拔出的瞬间,就会遭受电击,电击瞬间眼睛的画面会发生变化,我记得那个时候眼前会出现闪光。
解决办法就是拔掉笔记本充电器,或是进行接地
我把在同一个插线排的台式机接地了[一端鳄鱼夹接显卡的支撑挡板,一端接窗户],效果也很不错
之后还买了个蓝牙模块[HC05],一开始买错了,买成BLE蓝牙了。。。
虽然模块标注RX,TX只支持3.3v的信号输入输出,不过实际上输入5V 输出3.3V也没问题,
并且蓝牙的RX,TX是不能接到arduino的RX,TX接口上,怎么试蓝牙都没反应
我看许多教程都是这么接的,并且我用示波器测试通过USB串口发送消息,RX是有对应的方波的,也是相同的波特率
[那个arduino的RX,TX引脚和USB的是同一路]
这问题折腾我半天
最后我看有的是用SoftwareSerial库,使用别的引脚作为串口,我照着写就可以了。。。
肌电校准方法:
两手握着一个校准纸,两手臂伸直, 盯着中点一会后迅速将眼神转向左或右'触发点',然后返回'中点'
检查是否触发眼球运动检测 ,如果没触发调低阈值,
校准完毕后可再将眼神转向左或右'不触发点',检查是否未触发。
目前我这个灵敏度大概是触发点离中点8cm
然后就是爆照
video_20250912_002221.mp4 点击下载
lv_0_20250914212020.mp4 点击下载
使用的串口调试软件是Serial Studio Pro,这个软件显示的波形是经过类似平滑处理过的,并不是实际波形
往哪边转就产生对应的正向或反向电压
触发效果:
video_20250912_005242.mp4 点击下载
市售的一般都是做成眼罩,然后led直接贴着眼睛
不过我测试贴着和远距离的感受都差不多,都是眼前一片亮光,只是功率需要大些
蓝牙接收程序:
# AI大师写的
import serial
import datetime
import time
import threading
from playsound import playsound
def connect_serial(com_port, baudrate):
"""尝试连接串口"""
try:
ser = serial.Serial(
port=com_port,
baudrate=baudrate,
timeout=0.1 # 减小超时时间,提高响应性
)
print(f"Connected to {com_port} at {baudrate} baud")
return ser
except Exception as e:
print(f"Failed to connect to {com_port}: {str(e)}")
return None
def play_music(music_file):
"""在独立线程中播放音乐"""
try:
print(f"Playing music: {music_file}")
playsound(music_file)
print("Music playback finished")
except Exception as e:
print(f"Error playing music: {str(e)}")
def main():
# 用户输入COM端口
com_port = input("Please enter COM port (e.g., COM3): ").strip()
baudrate = 9600
data_timeout = 15 # println数据可能有间隔,适当延长超时时间
music_file = "path/to/your/music.mp3" # 音乐文件路径
# 生成带时间戳的输出文件名
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"serial_data_{timestamp}.txt"
ser = None
reconnect_delay = 5 # 重连延迟
last_data_time = time.time()
music_thread = None
# 数据缓冲区,用于累积不完整的数据
data_buffer = ""
try:
with open(output_file, 'a', encoding='utf-8') as f:
while True:
# 确保串口连接有效
if not ser or not ser.is_open:
ser = connect_serial(com_port, baudrate)
if ser:
print(f"Saving data to {output_file}")
last_data_time = time.time()
data_buffer = "" # 重连时清空缓冲区
else:
print(f"Retrying connection in {reconnect_delay} seconds...")
time.sleep(reconnect_delay)
continue
try:
# 检查是否有数据可读
if ser.in_waiting > 0:
# 读取所有可用数据
raw_data = ser.read(ser.in_waiting)
last_data_time = time.time()
try:
# 解码数据并添加到缓冲区
new_text = raw_data.decode('utf-8', errors='replace')
data_buffer += new_text
# 处理println发送的完整行(以\n或\r\n结尾)
while '\n' in data_buffer:
line_end = data_buffer.find('\n')
complete_line = data_buffer[:line_end]
data_buffer = data_buffer[line_end + 1:] # 保留剩余数据
# 清理println数据(去除\r和多余空白字符)
clean_line = complete_line.rstrip('\r\n\t ')
# 处理非空的println输出
if clean_line: # println可能输出空行,这里过滤掉
timestamp = datetime.datetime.now().strftime("%m-%d %H:%M:%S.%f")[:-3]
output = f"{timestamp}\t{clean_line}"
print(output)
f.write(output + '\n')
f.flush()
# 检查是否收到"dream"指令
if clean_line.lower() == "dream":
if music_thread is None or not music_thread.is_alive():
# music_thread = threading.Thread(target=play_music, args=(music_file,))
# music_thread.start()
pass
# 如果缓冲区中的数据太长且没有换行符(异常情况)
# 这可能表示println数据被严重分割或存在传输问题
if len(data_buffer) > 500: # println通常不会太长
print(f"Warning: Unusually long line detected ({len(data_buffer)} chars)")
if data_buffer.strip():
timestamp = datetime.datetime.now().strftime("%m-%d %H:%M:%S.%f")[:-3]
output = f"{timestamp}\t[INCOMPLETE] {data_buffer.strip()}"
print(output)
f.write(output + '\n')
f.flush()
data_buffer = ""
except UnicodeDecodeError:
# 处理二进制数据
timestamp = datetime.datetime.now().strftime("%m-%d %H:%M:%S.%f")[:-3]
output = f"{timestamp}\t[HEX] {raw_data.hex()}"
print(output)
f.write(output + '\n')
f.flush()
data_buffer = "" # 清空缓冲区
# 检查数据接收超时
if time.time() - last_data_time > data_timeout:
print(f"No data received for {data_timeout} seconds. Attempting to reconnect...")
if ser and ser.is_open:
ser.close()
ser = None
data_buffer = "" # 超时时清空缓冲区
time.sleep(reconnect_delay)
continue
time.sleep(0.005) # 短暂休眠,println数据需要更快响应
except (serial.SerialException, OSError) as e:
print(f"Serial error: {str(e)}. Attempting to reconnect...")
if ser and ser.is_open:
ser.close()
ser = None
data_buffer = "" # 错误时清空缓冲区
time.sleep(reconnect_delay)
except KeyboardInterrupt:
print("\nStopping data collection")
break
except Exception as e:
print(f"Unexpected error: {str(e)}")
break
except Exception as e:
print(f"Failed to initialize: {str(e)}")
finally:
if ser and ser.is_open:
ser.close()
print("Serial port closed")
# 等待音乐线程结束
if music_thread and music_thread.is_alive():
music_thread.join()
if __name__ == "__main__":
main()使用的serial库,一开始我想找专门操作蓝牙的库,找到的都太老了不支持高版本的python
后面我知道这个windows蓝牙是怎么用的了
连接这个COM6串口相当于执行"连接已配对过的HC-05的蓝牙"。
有触发dream电脑同步播放自定义音频的功能不过从未实际使用过
数据可视化程序:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.dates as mdates
import tkinter as tk
from datetime import datetime
import pandas as pd
import os
# 设置matplotlib中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
def load_data_pandas(file_path):
"""使用pandas快速加载数据"""
try:
df = pd.read_csv(file_path, sep='\t', header=None, names=['timestamp', 'value'])
df['datetime'] = pd.to_datetime(df['timestamp'], format='%m-%d %H:%M:%S.%f', errors='coerce')
event_mask = df['value'].isin(['move', 'dream'])
events_df = df[event_mask].copy()
numeric_df = df[~event_mask].copy()
numeric_df['value'] = pd.to_numeric(numeric_df['value'], errors='coerce')
numeric_df = numeric_df.dropna()
mask = (numeric_df['value'] > 1) & (numeric_df['value'] < 5) & (numeric_df['value'] != 2.00)
float_mask = numeric_df['timestamp'].str.contains(r'\.', na=False)
numeric_df = numeric_df[mask & float_mask]
return (numeric_df['datetime'].values,
numeric_df['value'].values,
events_df['datetime'].values,
events_df['value'].values)
except Exception as e:
print(f"Error loading file: {e}")
return None, None, None, None
def smart_time_format(ax):
"""智能设置时间轴格式,根据当前显示范围自动调整"""
try:
# 获取当前x轴显示范围
xlim = ax.get_xlim()
start_date = mdates.num2date(xlim[0])
end_date = mdates.num2date(xlim[1])
# 计算时间跨度(秒)
time_span = (end_date - start_date).total_seconds()
# 根据时间跨度智能选择刻度间隔和格式
if time_span <= 30: # 30秒内
ax.xaxis.set_major_locator(mdates.SecondLocator(interval=5))
ax.xaxis.set_minor_locator(mdates.SecondLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
elif time_span <= 120: # 2分钟内
ax.xaxis.set_major_locator(mdates.SecondLocator(interval=10))
ax.xaxis.set_minor_locator(mdates.SecondLocator(interval=5))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
elif time_span <= 600: # 10分钟内
ax.xaxis.set_major_locator(mdates.SecondLocator(interval=30))
ax.xaxis.set_minor_locator(mdates.SecondLocator(interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
elif time_span <= 1800: # 30分钟内
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=2))
ax.xaxis.set_minor_locator(mdates.MinuteLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
elif time_span <= 3600: # 1小时内
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=5))
ax.xaxis.set_minor_locator(mdates.MinuteLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
elif time_span <= 10800: # 3小时内
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=15))
ax.xaxis.set_minor_locator(mdates.MinuteLocator(interval=5))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
elif time_span <= 86400: # 1天内 - 使用10分钟刻度
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=10))
ax.xaxis.set_minor_locator(mdates.MinuteLocator(interval=5))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
elif time_span <= 259200: # 3天内
ax.xaxis.set_major_locator(mdates.HourLocator(interval=2))
ax.xaxis.set_minor_locator(mdates.HourLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
elif time_span <= 604800: # 1周内
ax.xaxis.set_major_locator(mdates.HourLocator(interval=6))
ax.xaxis.set_minor_locator(mdates.HourLocator(interval=2))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
elif time_span <= 2592000: # 1个月内
ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
ax.xaxis.set_minor_locator(mdates.HourLocator(interval=12))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
else: # 更长时间
# 根据时间跨度动态调整天数间隔
days = int(time_span / 86400)
if days <= 90: # 3个月内
interval = max(1, days // 30)
elif days <= 365: # 1年内
interval = max(7, days // 30)
else: # 超过1年
interval = max(30, days // 12)
ax.xaxis.set_major_locator(mdates.DayLocator(interval=interval))
ax.xaxis.set_minor_locator(mdates.DayLocator(interval=max(1, interval//3)))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
# 设置刻度标签旋转角度
plt.setp(ax.xaxis.get_majorticklabels(), rotation=45, ha='right')
except Exception as e:
print(f"时间轴格式化出错: {e}")
# 如果出错,使用默认格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation=45, ha='right')
def create_plot(timestamps, values, event_timestamps, events):
"""创建绘图界面"""
root = tk.Tk()
root.title("数据可视化工具")
# 设置tkinter中文字体
try:
import tkinter.font as tkFont
default_font = tkFont.nametofont("TkDefaultFont")
default_font.configure(family="Microsoft YaHei")
root.option_add("*Font", default_font)
except:
pass
# 创建控制面板
control_frame = tk.Frame(root)
control_frame.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
# 创建matplotlib图形
fig, ax = plt.subplots(figsize=(15, 8))
def on_xlims_change(ax):
"""x轴范围改变时的回调函数"""
smart_time_format(ax)
fig.canvas.draw_idle()
def update_plot():
"""更新图形"""
ax.clear()
print(f"\n显示数据点数: {len(timestamps):,}")
# 绘制波形
ax.plot(timestamps, values, '-', linewidth=0.5, alpha=0.8,
label='数据波形', color='blue')
# 绘制事件标记
if event_timestamps is not None and len(event_timestamps) > 0:
move_plotted = False
dream_plotted = False
for event_time, event_type in zip(event_timestamps, events):
if hasattr(event_time, 'to_pydatetime'):
event_time = event_time.to_pydatetime()
# 在显示数据中找最近点
if len(timestamps) > 0:
if hasattr(timestamps[0], 'to_pydatetime'):
time_diffs = np.abs([(t.to_pydatetime() - event_time).total_seconds()
for t in timestamps])
elif isinstance(timestamps[0], np.datetime64):
event_time_np = np.datetime64(event_time)
time_diffs = np.abs((timestamps - event_time_np) / np.timedelta64(1, 's'))
else:
time_diffs = np.abs([(t - event_time).total_seconds() for t in timestamps])
closest_idx = np.argmin(time_diffs)
y_value = values[closest_idx]
if event_type == 'move':
label = '移动' if not move_plotted else ""
ax.plot(event_time, y_value, 'bo', markersize=5, alpha=0.8, label=label)
move_plotted = True
elif event_type == 'dream':
label = '梦境' if not dream_plotted else ""
ax.plot(event_time, y_value, 'ro', markersize=5, alpha=0.8, label=label)
dream_plotted = True
ax.set_xlabel('时间')
ax.set_ylabel('数值')
title = f'数据可视化\n'
title += f'数据点: {len(timestamps):,}点 | 事件: {len(events) if events is not None else 0}'
ax.set_title(title)
ax.grid(True, alpha=0.3)
# 设置初始时间轴格式
smart_time_format(ax)
# 注册x轴范围变化的回调函数
ax.callbacks.connect('xlim_changed', on_xlims_change)
ax.legend()
plt.tight_layout()
canvas.draw()
# 更新按钮
update_btn = tk.Button(control_frame, text="更新图形", command=update_plot,
bg='lightgreen', font=('Arial', 10, 'bold'))
update_btn.pack(side=tk.RIGHT, padx=10)
# 嵌入matplotlib到Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# 添加导航工具栏
from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
# 状态信息
status_frame = tk.Frame(root)
status_frame.pack(side=tk.BOTTOM, fill=tk.X)
event_count = len(events) if events is not None and len(events) > 0 else 0
status_text = f"数据: {len(timestamps):,} 点 | 事件: {event_count} | 支持智能时间轴缩放"
status_label = tk.Label(status_frame, text=status_text)
status_label.pack()
# 初始绘图
print("开始初始化图形...")
update_plot()
root.mainloop()
def get_file_path():
"""获取文件路径,支持拖拽输入"""
print("=" * 60)
print("数据可视化工具 - 文件路径输入")
print("=" * 60)
print()
print("请将文件拖拽到此窗口,然后按回车:")
print("(支持直接拖拽,会自动处理路径中的引号和空格)")
file_path = input().strip()
# 处理拖拽文件路径中的引号
if file_path.startswith('"') and file_path.endswith('"'):
file_path = file_path[1:-1]
elif file_path.startswith("'") and file_path.endswith("'"):
file_path = file_path[1:-1]
# 验证文件是否存在
if not os.path.exists(file_path):
print(f"\n
错误: 文件不存在 - {file_path}")
print("请检查文件路径是否正确")
return None
# 显示文件信息
file_size = os.path.getsize(file_path) / (1024 * 1024) # MB
print(f"\n
文件验证成功:")
print(f" 路径: {file_path}")
print(f" 大小: {file_size:.2f} MB")
print()
return file_path
def main():
print("启动数据可视化工具...")
# 获取文件路径
file_path = get_file_path()
if file_path is None:
input("按任意键退出...")
return
print(f"\n开始加载数据: {os.path.basename(file_path)}")
print("=" * 50)
start_time = datetime.now()
print("使用 Pandas 快速加载...")
timestamps, values, event_timestamps, events = load_data_pandas(file_path)
load_time = datetime.now() - start_time
print("=" * 50)
print(f"
数据加载完成,耗时: {load_time.total_seconds():.2f}秒")
if timestamps is not None and len(timestamps) > 0:
event_count = len(events) if events is not None and len(events) > 0 else 0
print(f"
成功加载:")
print(f" 数据点: {len(timestamps):,} 个")
print(f" 事件数: {event_count} 个")
print(f" 时间范围: {timestamps[0]} 到 {timestamps[-1]}")
print()
print("
启动图形界面...")
print()
create_plot(timestamps, values, event_timestamps, events)
else:
print("
未能加载数据,可能的原因:")
print(" 1. 文件格式不正确")
print(" 2. 文件内容为空")
print(" 3. 数据格式不符合要求")
print()
print("要求的数据格式:")
print(" 时间戳\\t数值")
print(" 例: 01-01 12:30:45.123\\t2.56")
input("\n按任意键退出...")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n程序被用户中断")
except Exception as e:
print(f"\n
程序出现错误: {e}")
input("按任意键退出...")
去除了所有等于2.00v的数据,如果不去除的话就会这样,我怀疑是arduino adc的问题,差不多每几分钟就有一次,什么时候可以用示波器监测一下看看是哪个的问题
确认与眼球运动有关的波形参考:
9月15日 包括身体运动或是眼球转动的
快速眼动期眼球实际运动参考视频:
REM sleep - Rapid Eye Movement Sleep - REMS.mp4 点击下载
小姑娘的快速眼动睡眠_p1.mp4 点击下载
如果使用红外摄像头近距离拍摄,使用某些现成的能够识别出眼部区域的模型,将眼部区域单独截取出来。然后自己标注训练一个能够识别闭眼眼球运动的模型,这样是不是就可以做出一个无接触式快速眼动期识别设备
。。。。。搜了一下 已经有了
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
每晚的眼电图:
目前没一个成功,中途闪光+蜂鸣器也是照样睡着,没有被唤醒也不记得梦里有什么闪光或蜂鸣器的声音
我有尝试蜂鸣器声音调的很高,为了唤醒以确认刚才是不是在做梦,不过那个时候我醒来立马就又睡着了,不太记得了,最近可以再重新尝试下
我现在可能还缺个监控摄像头,看看触发是否是因为我在那个时间段运动导致的,并且看看设备在那个时间到底有没有成功执行
暑假[7/10]到现在中途有一个清醒梦不过与这个设备无关
等什么时候成功了再整理下这个眼电图,现在就随便放点
触发红色dream标记后有冷却期 冷却期内波形正常记录但是不会触发move蓝色标记
前4.5小时不开启蜂鸣器和头顶灯光,为了保证前4.5个小时的重要睡眠,并且通常生动及印象深刻的梦都出现在后半段
黄色为小米手环显示清醒时段
绿色为根据眼电图手动标注的快速眼动期时段
蓝色为小米手环显示快速眼动期时段
9月15号 5:10 开启了蜂鸣器 以及头顶灯光
手环显示的第二次清醒的时候我把肌电拔了,然后又迷迷糊糊的睡着了
起床后想起做了一个比较长的梦 不记得梦里有眼前闪光或是蜂鸣器的声音
大概是与我开三轮车去摩托车驾校 然后找不到摩托车驾校 回家 翻叠在一起的纸质资料 看见xxx然后xxxx
具体些包括 真实的三轮车结构 挂挡 拧油门 声音 差点出车祸 手机 导航 小卖部 人 xxxxx
这个梦可能与蜂鸣器有些关联,因为有点类似车辆喇叭声 但是主要应该是因为我现实在考三轮车驾照
我就不标记非常零星的红色了
通常一晚的快速眼动期会越来越长
5:10闹钟时间 起来喝水然后上了个厕所
拔导联线接头前
总体
躺回去后
6:40闹钟时间
第一个标注疑似快速眼动期的部分截图
第二个标注疑似快速眼动期的部分截图
第三个标注疑似rem的部分截图
超过4v的信号 针对这种过于笔直,与上次电压差值非常大的可以进行过滤
这个波形正常一些没有这么笔直
8月3日
2:33 可能是噪音干扰
5:40那段时间的 根据波形来看 确实是眼睛移动了
7:41 一样
8月12日
9月13日用错误的9月11日的小米手环标注 碰巧入睡时间差17分钟 清醒时间差1分钟 [中间睡觉的时候拉扯到眼电设备了,电源断掉了]
睡觉的时候拉扯到设备,设备电源线被扯掉了
9月13日用9月13日的小米手环标注
9月14日
截取9月14日 3:39左右的噪音强度 2.55v中点 最高2.63v波动 大概3%的波动
截取9月14日 9:49左右的噪音强度 2.55v中点 最高2.58v波动 大概1.1%的波动
之前的截图
坐在凳子上
躺在床上
1.09Gb压成31Mb了 不愧是一大堆重复内容的文本
应该选择怎么样的外部刺激才容易进入到梦境:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
另外分享一个我知道的一个研究清醒梦的网站
很多有关清醒梦的新闻或是论文都是来源于这些人
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Transferring of music from lucid dreams into reality.mp4 点击下载
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
原理大概就是规定 左手握拳等于这个声音 右手握拳等于那个声音
在梦中握拳也能在现实中检测到肌肉电信号的变化
关于清醒梦的危害:
有可能影响睡眠,可能发生于某些熟练者身上,正常睡眠过程中容易不可控的意识到是在做梦,从而导致一晚的睡眠质量都不好
还有可能不可控的遭受比较真实的恐怖体验或各种不适的体验,相当于做噩梦
另外还有些报告者没有主观上造假的,但是可能并不代表对应部位有真实的问题或损伤:
醒来心脏不舒服
梦中受伤疼痛的部位醒来也有疼痛感
最后虽然没有成功将梦转为清醒梦
但是可能可以用于进入清醒梦后让现实捕捉到你在做清醒梦并且执行你预先设定的一些东西
比如播放一些环境音,看看在清醒梦中对梦境环境的构建有没有什么影响
还有一些睡觉不会完全闭眼的人,我在想如果在做梦的时候,在他眼前合适的距离播放视频,他的梦境会不会受视频影响
楼主注意安全。医疗设备有严格的电气安全要求,这是因为医疗设备的接触通常具有很低的接触电阻,例如你用的心电电极。如果通过这些电极触电,只需要十几伏就可能要命。我记得医疗设备要求电源必须是隔离的,并且只有市电侧直接接地,人体侧必须是经大电阻浮地,对地电阻至少是1MΩ。我的记忆可能不准确,时间有限就不帮你查了,但可以肯定笔记本电脑不符合医疗设备的要求,通过USB连接线最终与人体电极非物理隔离的连接,是严重违规操作。
楼主注意安全。医疗设备有严格的电气安全要求,这是因为医疗设备的接触通常具有很低的接触电阻,例如你用的心电电极。如果通过这些电极触电,只需要十几伏就可能要命。我记得医疗设备要求电源必须是隔离的,并且只有...
确实不安全,我用过最安全最不漏电的220v转直流的设备大概就只有大厂的手机充电器了[当然也不能用于此类用途]
其他的就没有不漏电的,电脑电源或是笔记本充电器,或是那种小黑盒的电源适配器,以及电烙铁
如果在焊接led的时候,手触摸了焊接的另一端led就会有些亮光
同一个插线板的台式机器可以在鳄鱼夹接触的瞬间产生非常微弱的白色电弧亮光,用万用表测的电流为0.33ma
用比较粗糙干燥的手触摸没有任何反应,但是如果是通过敏感部位并且接触电阻低就有明显的被电击的感觉
被电是最开始的两三次,然后就把悬空的地线接地了,然后还有直接拔笔记本充电器,转而用笔记本本身的锂电供电了
蓝牙模块到了后就几乎只有烧录程序的时候会连接usb了,任何长时间的监控都是使用的两节锂电池供电和蓝牙传输的
论坛内有个关于直流电击大脑的帖子
另外看看我家的神奇接线
每个插座好像地线都不是并联在一起了,而是相互独立的,我之前将电脑插座附近的另一个插座进行接地,电脑外壳通过人体对地依然是相同的电压,换成同一个插线排的就没问题了,插线排还是没有偷工减料的,有地线铜排,地都连在一起
总闸处也很厉害
右边那三根红 蓝 黄绿的粗线应该是入户线,其中蓝线居然是火线对地有235V的电压,红线居然是零线对地0v
不过好在通过漏保的线对应颜色又恢复正常了,黄线是火线,蓝线是零线了,具体到插座零火方向我记得是没问题的
入户的地线也是很厉害,接在了左边的铜排上,右边铜排就是插座的地线,直接实现了入户和插座地线隔离
这两个铜排的原本作用应该是一个做零线排,一个做地线排
左边地线和右边地线的压差差不多是70V
右边的插座地线也是虚接的,我用钳表测电流的时候拉扯了一下,直接从接线端子那里脱落了
入户地线应该是真的接地了,对我没电压,对零线我记得也是没电压,对火线有正常的235V电压
这应该有两拨电工师傅的操作
一个是小区电工,负责整个小区的布线 这个入户线应该就是这个电工干的
另一个是装修电工,负责具体的房间各个插座接线
这两个电工技术都是一流的,为他们点赞
家庭的话,可简单买铅酸蓄电池搭建实验供电环境。
为防止自己作死,可以充电、放电使用同一个DC插头:想充电,必须先拔下实验装置线缆;想做实验,必须先拔下充电器。
。
根据实验特性,还可以用干电池、纽扣电池搭建其他种类的“本安”电源。
做过几次清醒梦,梦里内容也特别玄幻,有飞到大气层玩的,也有带颜色的,不过操作感极差,少数能自由操控的梦也因为梦境的结束不可控,导致体验感极差,会有很大的心里落差感。这种梦醒来就能知道在梦里做了什么,也同样跟其他梦一样容易忘记。
为数不多的几次清醒梦总结出来一个经验,即使你意识到了自己是在做清醒梦,也要立马隐瞒这个意识,甚至隐瞒的想法也不能太强。实测如果自己明显知道自己在清醒梦中,梦境会很快坍塌,再次入眠也很难进入原本的梦里。
再说我小时候还有梦游的经历,如有跑到另一个房间把乐高拆了,在床上站起来转圈,半夜无意识去上厕所走错房间,还好我妈把握拉到了厕所,,(因为小时候是跟父母一块睡的,所以才知道梦游,不过长大了就没有了)
可能说的有点离谱,但是是亲身经历
做过几次清醒梦,梦里内容也特别玄幻,有飞到大气层玩的,也有带颜色的,不过操作感极差,少数能自由操控的梦也因为梦境的结束不可控,导致体验感极差,会有很大的心里落差感。这种梦醒来就能知道在梦里做了什么,也...
我也分享一下清醒梦的体验
最近一次好像是在8月23日
定了个6小时后的闹钟,醒来让自己清醒15分钟了然后再躺下
睡觉过程中感到下坠感,下坠感就是提示进入梦中的一种信号
感到下坠感后就动了动,然后睁开眼睛又是几乎睁不开眼睛,那种感觉就像是盯着强光然后用力睁开眼睛但是睁不开
躺着面朝天花板轻微睁开眼睛的时候可以看见和现实天花板差不多一样的吸顶灯
然后面朝墙壁,看到的画面还是和看天花板一样的画面
看自己的手掌也看不到
之后尝试着走出卧室到客厅,行走的过程中也比较吃力,勉强走到客厅后就醒了
醒了后我通常可以马上再次进入梦境,再次感受到下坠感
第二次进入清醒梦的画面清晰度就正常许多了,行动也没有阻力感
一手抱着枕头增加梦中的触感,然后就往外走
走到拐角我就尝试想象拐角后是个XX场景,不过没有任何效果,拐角后依然是和现实一样的场景
然后开始下楼,开始下楼的时候从口袋里面掏出了一个'维持清醒梦'的药水喝了下去
下楼的时候从外面通过猫眼尝试看看别人家里长什么样,不记得具体看出什么了
到楼下后也没看见任何一个人
尝试从楼下的一个阶梯处往下跳,有一些失重感
闭眼想象我在某个地方,睁眼也没有任何变化
好像在这个时候我就醒了,也没能再次进入了
更早之前的清醒梦很多都带有让人不适的元素
比如进入梦境后轻微的睁眼,保持比较窄的视野
看见一个白色连衣裙在床尾,就像是贞子的服装,不过只看到了底下一部分。由于我担心看到脸部,就没有继续增大眼睛,又闭上了眼睛,开始单纯的触摸和想象了,比如尝试从口袋里面掏出什么东西,或者在床上摸出什么东西
或是进入梦境后动不了,睁开眼睛看见一个婴儿在床上,然后爬着往我怀里钻,那种往我怀里钻感觉非常真实,挣扎了一会后就醒了
或是进入梦境后 听见天上有直升机在飞,然后感觉有东西从下往上经过我的胸口
或是进入梦境后 持续不断的下坠感
在梦境中我在闭眼的情况下也是无法在眼前想象出任何画面,这与我现实一样(心盲症)
在梦境中我也需要通过睁眼这个行为,才会看见由大脑想象出来的画面
在午睡的时候刻意的维持自己意识清醒,有的时候眼前就会不由自主的浮现出一些画面
我记得浮现出的画面几乎都是些网页内容或是app界面
其中印象最深刻的就是浮现出的bilibili的app画面,我还默读出了那个视频评论区的一个评论
那个评论感觉上是个完整的有正常意思的句子,不过每个字的顺序都被打乱了
具体的评论内容完全不记得了,好像当时读完后就不记得了
我还尝试过在可能的rem周期播放一些白噪音,不过只测试过一两次,没感觉对梦境有什么影响
有次醒来刚好音频在播放,在醒来的一小段时间里我都不知道这个声音是什么以及哪里来的
dream_audio.mp313.82MB立即下载
[战争白噪音]
课堂老师讲课的白噪音我记得我下载了不过好像没尝试,最近可以再试试
上文中“先有那个物体的触感”,是想象出来的触感吗,这中想象能力在清醒时是否也具备。还有前面说的下楼,跳下台阶等,都是梦境吧,也就是说,并不是真的爬起来下了楼。
我遇到过一个大佬,特别爱谈论他研究和实践清醒梦的经历,并且把它神话了,像个民科。能用科学思维来对待还是不错的,其实也有一堆科学家想弄清楚神经生物学机制。
上文中“先有那个物体的触感”,是想象出来的触感吗,这中想象能力在清醒时是否也具备。还有前面说的下楼,跳下台阶等,都是梦境吧,也就是说,并不是真的爬起来下了楼。我遇到过一个大佬,特别爱谈论他研究和实践清...
主观上没有具体想象或者说是思考 掏出来的东西应该是什么形状,什么触感,什么材质之类的
可以说只是单纯的想出了一句话 “我要掏出一个药水”
然后往口袋里面摸就能很自然的摸出来,就像它原来就在里面一样
我记得我摸出来的药水形状像是"我的世界" 里面的药水
清醒状态下想象不出我在触摸什么东西,没有相关的触感
我记得有的时候睡觉的时候,可以感觉到放松状态下的自然弯曲的手掌握着一个什么东西,其中一次感觉像是握着一个鼠标
是自发产生的幻觉,不是我主观上想象出来的
且我好像是不能将 感觉握着鼠标 变成 感觉握着其他东西
午睡中途眼前不受控的出现画面的时候,感觉有点像是在另一个空间或者说是与外界隔绝 感官都被屏蔽了
没有外界的声音,没有身体与床接触的那种感觉
不过如果动一下的话就立马正常了
午睡的时候那个画面我好像也是不能控制的
并且在我意识到眼前的画面后就会很快的消失,大多数可能是在意识到后两三秒钟,最长可能不超过10秒钟
下楼跳下台阶都是在梦中做的事情
进入清醒梦有明显的信号, 比如耳鸣的嗡嗡声音,又或是下坠感
根据他人的描述 这个信号需要达到一定强度才代表着进入了清醒梦,
如果强度不够,睁开眼睛就是睁开的现实中的眼睛,移动胳膊就是移动是现实中的胳膊
只有达到了一定强度,睁开的眼睛就是梦中的眼睛,移动胳膊就是移动的梦中的胳膊
这可能代表在那几秒钟的时间里,就失去了身体的'控制权'
我是单纯在这个信号出现后过一会再尝试睁眼或移动,没有出现过睁眼是睁开现实中的眼睛
据他人描述 如果在梦中眼睛很难睁开,去使劲的尝试睁开梦中的眼容易变成现实中的眼睛睁开
用于判断是否处于梦中的常见方法:
捏住鼻子试试能不能呼吸
掰手指看看能不能把手指掰到手背
常见的稳定梦境的方法:
搓手
或是蹲下来摸地,或是直接趴下 增加触感
或是转换场景
或是赋予某个东西一个能够稳定梦境的功效
比如赋予药水一个稳定梦境的功效,然后喝下去
效果我好像没感觉出来
常见的转换场景的方法:
转角
开门
跳井盖
开门之前想象 门后是xxxxx (据说越详细成功率越高)
然后开门就会看见想象的场景或事物
实际可能不一定能看见所想的那个场景或事物
比如想着具体看见某个人
结果确实看见了一个'人',不过这个人的高矮胖瘦甚至乎性别都有有可能与想的那个人不一样
也有可能没有任何效果
开门后原来该是什么就是什么
跳井盖就直接掉到下水道了
国内的有关清醒梦清明梦的主要在百度贴吧
国外的就在reddit的LucidDreaming板块 好像还有些专门的论坛
百度贴吧有很多记录梦境的 其中就有测试自己在梦里是否有'神通'的记录
比如测试回忆能力
在梦里看看书的书签被放在哪一页了,与现实的对比
又或是尝试记住梦中人物的联系方式 试图现实中联系上对方的
尝试记住梦中彩票号码去买彩票 等等.....
基本上都是未能成功的
除了大量测试出没有'神通'的 当然也有很少部分蹦出来说有'神通'
说是现实中联系上了梦中的人物
或是说自己和另一个人在梦中联机 之类的可信度低的内容
录了一晚上的睡眠,通过5米长的USB连接到电脑进行记录的,实际只记录了5个小时,后面磁盘空间不足丢失了。
5m长的usb得买质量好的,要不然从红外灯灯珠未开启切换为开启可能会产生一个比较大的压降,会出现一小会的掉线,识别不到摄像头设备
这个相机是用来拍摄我面朝左侧睡觉时的情况,我也尝试过拍摄过平躺姿势,但发现我平躺时是睡不着的,必须侧躺才能睡着
我按照华为显示的快速眼动期所对应的时间进行检索,发现在对应时间段里,我只有身体运动,没有明显眼动,这个应该改名叫快速运动期
运动大概就是挠头发,挠面部,转一下身,手臂动几下之类的常见动作
我看了拍摄视频才略微的想起来,我在睡觉的时候似乎好像真的有做过这些动作,我中途好像的确醒来过,不过很快就又睡着了,华为显示为0清醒
睡眠途中我还笑了一下,从视频看有些诡异
由于睡姿经常变动,有时低头睡,有时平躺,有时朝右躺,有时斜45度躺,有时手臂放在面前,所以我只找到了一处有明显且持续眼睛运动的片段
而在我处于眼部运动的时候,华为app上显示我正处于浅睡的状态中。看起来睡眠监测好像的确不怎么准确
这拍出来太丑了还是打一下码吧
App 的睡眠部分我基本不看,无论是华为还是小米
因为app显示的分数不能代表醒来后的感受;睡眠时间也不能代表;中途清醒次数同样也不能代表
睡6个小时,中途醒三次,睡眠分数超过30%的人,完全可以醒来后不困,精力旺盛
而8个小时睡眠,中途不醒,睡眠分数超越96%的人,醒来也有可能比较困,精力不旺盛
不过情绪健康监测我感觉还是比较准的,愉悦比较多的时候确实可以算是脸上挂着笑容,不愉悦较多的时候是在干一些无聊,繁琐,还需要等待的事情
压力值就都差不多,从开始戴华为手表到现在,一个中等或偏高压力都没有,实际上我也没经历什么压力偏高非常紧张的事情
HRV,静息心率也都差不多,可能得等什么时候不小心发烧,然后看一看有没有什么变化,当然还是应该尽量不生病好
我之前还测试了一下午休状态下能否判断是否处于睡眠状态。
以及在处于睡眠状态时,能不能通过现实中的一些音频刺激进行干预,影响梦境内容。
通常来说,除了晚上睡觉的时候会做梦,在午休的时候也常常会做梦。
并且感觉在午休时,只要一旦睡着了,就会开始做梦,而并不像晚上睡觉一样,会经历好几个不同的睡眠周期。
所以,在午休中判断是否在做梦可以直接通过检测是否入睡来判定,简单了非常多。
不过,午休的梦和晚上睡觉的梦还是有些不同的,感觉上午休的梦可能更不那么生动,清晰和深沉。
(我大概在8分钟内就能睡着并且做梦)
检测午休时是否入睡的方式很简单。
使用一个有线静音鼠标(它的按键按压力度通常更小),并通过5m的延长线连接到电脑,在午休的时候握着鼠标,并且按住右键。
当快要睡着,失去意识的时候,手部肌肉就会放松,右键也会随之松开。
也可以同时搭配着华为智能手表,开启心率广播,获得每秒更新的心率数据,然后进行辅助判断。
我现在没有采集数据原文件了,只有华为运动健康app上的记录。
华为运动健康app上的心率图实际上是经过处理的,如果是通过心率广播获取的数据,可以看到明显的被叫醒后的瞬间的心率上升。
通过以上两个判断方法就很轻松的实现了午休的睡眠检测,我实际测试是比较准确的,可以检测到睡着做梦然后唤醒,或是干一些其他操作。
我测试过播放一些音频,不过一点用都没有。
梦里完全不会受到影响,只会有两个状态:什么反应都没有,或被音频吵醒。
并且我有一个问题,就是只要午休一旦睡着了,再醒来就会感觉头有点晕,感觉有点脑子不清晰。
所以,我并没有测试多少次,之前也几乎不午休。
这个整体实现起来难度较低,不需要折腾硬件,只需要写几个脚本,感兴趣的可以自己尝试一下。
可以把有线鼠标换成无线的,或是换成电容式的按钮。小米手环或是其他智能手表应该都有心率广播。
顺便分享以前的经历:
有时候在醒来后的几秒钟内,眼前可以看到某些画面,但是完全无法操控。
至少8个月前的一次午休,我有意识的尽可能维持自己清醒。
之后,看见了眼前出现了一个手机屏幕。
手机屏幕上是哔哩哔哩的app,我还能看见那个视频的评论,每个字都好像能看见,并且能看懂,但是语序混乱。
我在梦中好像是不会出现看不清文字的情况。
还有一次晚上做梦,我梦见我在课堂上写数学试卷、上面的数字,公式,根号清晰可见,我都能在梦里算出来,但是之后老师告诉我说:这个答案是错的。
最后就是相关论文,原文页数非常多
以下是ai讲解:
《Incubating Dreams, Awakening Creativity》
作者:Adam Jedidiah Haar Horowitz
时间:2019 年 8 月
核心项目:Dormio
核心问题:能不能用技术在“刚刚入睡”的几分钟里,把指定的主题植入梦境,然后利用这种梦境状态提升之后的创造力?
这篇论文真正有意思的地方,不只是“梦境研究”,而是它试图建立一个完整的闭环:
检测你正在入睡 → 在这个状态给你一个提示 → 让提示进入梦境/催眠入睡体验 → 立即唤醒并记录梦 → 重复多轮 → 再测试你的创造力。
作者最终认为,实验结果支持这样一个观点:创造力提升不仅可能来自“睡眠这个脑状态”,还与睡眠时具体想到了什么、梦到了什么有关。 不过论文自己也明确列出了相当多限制,因此不能把它简单理解成“科学已经证明做梦能让人变聪明”。
下面我按照整篇论文的逻辑详细拆开。
作者最初的问题其实非常简单:
我们能不能主动利用睡眠中的思维,而不是把睡眠看成完全被动的过程?
传统上,人们虽然知道睡眠与记忆、情绪和认知表现有关,但梦境本身常常被当作一种伴随现象:大脑在睡眠中工作,恰好产生了梦;真正产生认知收益的可能是后台神经过程,而不是“梦这个体验”本身。
作者不同意这种看法。
他的核心假设是:
梦境本身可能就是一种特殊的思维形式。
既然梦也是一种“思考”,那么它是不是可以利用清醒时不容易产生的联想方式?
因此作者特别关注一个状态:
也就是:
清醒 → 刚开始睡着 → 真正进入较深睡眠
之间的那几分钟。
论文把它描述成一种介于清醒与睡眠之间的“半清醒状态”。
这个状态特别重要,因为此时:
一方面,你的大脑已经开始进入睡眠;
另一方面,你又没有完全失去意识,可以在被叫醒之后比较容易描述刚才发生了什么。
论文认为这比后半夜的深度睡眠甚至 REM 梦境更适合进行实验。
这是整篇论文最重要的理论基础之一。
作者认为 Hypnagogia 有三个特别有价值的特点。
N1 是入睡初期阶段。
论文给出的典型特征包括:
Alpha 活动下降
Theta 活动增加,大约 3–7 Hz
肌肉张力下降
呼吸变浅
心率下降
血压下降
有时出现 hypnic jerk,也就是入睡抽动
会出现视觉、听觉、身体感觉等类似幻觉的体验
典型的 N1 大约持续 1–7 分钟。
所以作者把它理解成:
大脑正在从清醒思维模式切换到梦境思维模式。
而且这个切换过程不是瞬间完成的,而是渐进的。
因为它似乎处于一个很特殊的认知区间:
你的执行控制比较强:
我应该想什么
→ 我应该怎么做
→ 这个想法合理吗
→ 这个东西有没有意义
因此思维比较受约束。
联想非常自由,但执行控制又下降太多:
什么都可能发生
但你很难主动观察和控制。
处在两者之间。
作者非常看重这一点:
部分执行控制正在消失,但意识还没有完全消失。
因此你可以:
观察自己的思维逐渐失控
看到图像开始自动生成
感觉不同记忆开始混合
出现非常奇怪的联想
同时又能在被唤醒后描述这些内容
论文甚至认为,这种状态可以观察“自我感”“身体感”“时间感”“认知控制”逐渐发生变化。
论文还专门挑战了一个传统认知:
REM = 做梦
作者认为这已经太过简单。
研究表明:
NREM 期间也会产生梦
NREM 被唤醒时也经常可以报告梦境
梦境体验可以贯穿不同睡眠阶段
REM 和梦并不是严格的一一对应关系
论文引用的研究中甚至提到,NREM 唤醒可以获得相当高比例的梦境报告。不同睡眠阶段的梦境,只是“体验形式”不同:有的更像思考,有的更像视觉故事。
所以这篇论文使用的是一个更宽泛的观点:
梦境不是单独属于 REM 的东西,而是一个从“思考式体验”到“高度沉浸式故事”的连续谱。
这对 Dormio 很重要,因为 Dormio 的目标主要是抓住 N1 / Hypnagogia,而不是让用户进入 REM。
一个很有意思的来源是 Edison 的“钢球技术”。
论文介绍了一种历史上的方法:
人在坐着打瞌睡的时候,手里拿一个金属球。
进入睡眠后肌肉放松,金属球掉落。
“哐”的一声把自己叫醒。
这样就能抓住:
刚刚进入梦境/入睡状态时的大脑内容。
Edison 曾有意识地在思考一个问题之后进行这种小睡,并试图在 Hypnagogia 中找到解决方案。
论文把这个状态称为:
“genius gap”
即所谓“天才间隙”。
作者希望把 Edison 的一次性、手工方法变成一个:
自动化、可重复、多轮、可实验控制的系统。
这就是论文最核心的工程成果。
Dormio 可以理解成:
一个能够检测“你快睡着了没有”的可穿戴设备 + 音频刺激系统 + 梦境报告系统。
它不是一个普通睡眠手环。
核心机制是:
检测睡眠 → 播放声音 → 影响梦境 → 唤醒 → 记录 → 再睡 → 再提示。
论文把这种方法命名为:
与传统“睡前告诉你一次”不同。
它会重复进行:
提示
↓
入睡
↓
叫醒
↓
报告梦境
↓
再入睡
↓
再提示
↓
再叫醒
这样一个睡眠周期内可以获得多次 Hypnagogia。
论文明确认为这是 Dormio 的关键创新之一。
这里其实非常有意思。
Dormio 不依赖传统实验室那套庞大的 PSG。
实验室 PSG 通常需要:
EEG
EOG
EMG
心率
呼吸等
Dormio 希望把设备做到足够便宜、轻量、可穿戴。
它主要监测三个信号:
判断身体是否开始进入睡眠状态。
也就是皮肤电活动。
用于观察自主神经系统变化。
通过手指弯曲/肌肉运动等变化判断:
你是不是开始失去肌肉控制。
设备采样频率为:
100 Hz。
原型使用:
nRF51 Cortex-M0
Bluetooth Low Energy
3.7V 锂电池
Pulse Sensor
Flex Sensor
EDA 电极
设备设计在手腕、手指位置工作。
它还有一个 iOS App。
用户可以设定:
梦境主题
提示语
报告次数
什么时候唤醒
Hypnagogia 的目标深度
系统有两种模式:
使用 Dormio 的传感器实时检测。
没有 Dormio 硬件时,直接根据估算的入睡时间工作。
甚至可以利用手机掉落检测来模拟 Edison 的钢球技术。
论文实际上做了不止一个实验。
最重要的是:
以及:
Pilot 很小。
核心实验分析只有:
n = 6
另外有 2 人无法正常进入实验要求的睡眠状态,因此被排除。
实验使用两个词:
Rabbit
Fork
受试者会被提示:
“Remember to think of a rabbit.”
或者:
“Remember to think of a fork.”
然后比较:
只是闭眼休息、保持清醒。
VS
让自己进入睡眠。
之后分别进行创造力测试。
首先是创造性故事任务。
睡眠条件下,受试者平均写:
530 秒
清醒条件:
371.5 秒
差异达到统计显著:
p = 0.01
而且:
睡眠之后,有 4/6 的人使用了图画+文字混合形式;
控制条件则是 6/6 都只写文字。
作者把这看作创造力和投入程度增加的初步证据,但也承认这一轮的创造力评估还不够标准化。
一个受试者连续经历多轮 Rabbit 提示后,报告了完全不同类型的兔子:
childhood pet rabbit
aluminium rabbit head
dissected rabbit
rabbit warren
也就是说:
提示词相同,但是每一次进入 Hypnagogia 时,梦境会生成完全不同的联想。
这说明 Hypnagogia 并不是机械地重复:
“Rabbit → Rabbit → Rabbit”
而更像:
Rabbit → 记忆 → 图像 → 奇怪联想 → 新故事
这正是作者认为它有创造力价值的地方。
正式实验扩大到了:
n = 50
不过最终具体分析中不同变量存在少量缺失,所以有些分析使用 48/49 名左右的数据;论文自己在摘要和各章节中也分别出现了 n=48、n=50 的表述。
正式实验核心是一个:
两个维度:
Sleep
vs
Wake
Tree Incubation
vs
No Incubation
于是形成四组:
条件 | 状态 | 是否提示 Tree |
|---|---|---|
1 | 睡眠 | Tree |
2 | 睡眠 | No Incubation |
3 | 清醒 | Tree |
4 | 清醒 | No Incubation |
这是整篇论文最重要的实验结构。
因为 Tree 足够简单。
它又可以产生很多不同语义:
tree
forest
branch
root
plant
wood
leaf
grow
shadow
这样可以观察:
人究竟是在机械重复“Tree”,还是开始产生更广泛的语义联想?
这个实验的结果非常明确。
67 个梦境报告:
45 个,也就是 67%
包含直接 Tree 相关内容。
69 个梦境报告:
只有:
1 个,也就是 1.4%
出现直接 Tree。
56 个清醒报告:
29 个,也就是 52%
包含 Tree。
48 个报告:
0 个
出现 Tree。
这是非常重要的结果。
因为它说明:
Dormio 确实能够明显提高目标主题进入睡眠中主观体验的概率。
而且:
睡眠中的植入效果比清醒状态更强。
作者进行了统计检验。
Tree Incubation vs No Incubation:
p = 4.295 × 10⁻⁷
也就是非常显著。
睡眠条件:
Tree:
0.70 ± 0.35
No Incubation:
0.01 ± 0.05
p = 0.001。
所以:
Dormio 并不是“偶尔让人想到 Tree”,而是明显改变了 Hypnagogic experience 的内容。
论文里的梦境报告很有意思。
一个受试者连续四次报告:
树
↓
周末请客,同时想到树
↓
儿童时期后院的树
↓
树裂成无数碎片
↓
沙漠、萨满、树、南美……
这意味着:
一个简单的外部提示,在睡眠状态下会被吸收到个人记忆、当前问题和梦境叙事中。
作者因此认为:
Dormio 不只是“让你记住一个单词”。
它可能让这个词变成:
一个联想网络的“入口”。
结果非常强:
25/25 睡眠受试者都至少能够回忆出一个 Hypnagogic dream。
也就是说:
100%
至少报告过一次。
清醒组也是:
24/24
都至少能够报告一次清醒状态的思维内容。
这支持了 Dormio 的另一个核心目的:
不只是“控制梦”,还要“捕获梦”。
这才是论文最终想证明的东西。
作者用了三种主要创造力测量:
根据 Tree 写故事。
评价包括:
Overall Creativity
Plot Continuity
Fantasy
Descriptiveness
Semantic Flexibility
Imagery
Emotiveness
Humor
Writing Time
并且让多个评分者进行盲评。
Overall Creativity:
5.24 ± 1.26
4.14 ± 1.38
差异:
p = 0.003
也就是说:
睡眠组写出来的故事,整体创造力评分显著更高。
更关键的是:
5.74 ± 0.99
4.64 ± 1.29
p = 0.0397
也就是说:
即使都睡着了,加入 Tree 梦境主题后,创造力仍然进一步提高。
这是整篇论文最核心的数据之一。
Sleep:
4.46
Wake:
3.28
p = 0.002
而:
Sleep + Tree:
4.95
Wake + Tree:
3.47
p = 0.006
因此睡眠状态明显增加了故事的幻想性。
Semantic Flexibility 是论文特别重视的一项。
Sleep:
3.82
Wake:
2.94
p = 0.028
更关键:
Sleep + Tree:
4.49
Sleep + No Tree:
3.03
p = 0.0086
也就是说:
睡眠 + Tree 梦境植入
不仅让故事更好,还让概念之间的连接更加灵活。
这是效果很明显的一项。
Sleep:
4.40
Wake:
2.97
p = 0.007
Tree Incubation:
4.78
No Incubation:
2.98
p = 0.001
最重要的是:
Sleep + Tree:
4.86
Sleep + No Incubation:
3.62
p = 0.036
而且:
睡眠条件下的人明显更容易主动画图。
Sleep vs Wake:
p = 0.008。
这与论文对 Hypnagogia 的基本判断非常一致:
睡眠初期的思维高度视觉化。
这是心理学经典的:
例如给你一个物体:
“砖头有什么不同用途?”
普通答案:
建房子
创造性答案:
书挡
雕塑
门挡
花盆
……
测试的是:
发散思维 / 非常规联想能力。
论文发现:
Hypnagogia 条件下产生的 alternative uses 数量比控制条件:
高 18%。
正式实验还进一步发现:
Sleep + Tree
在:
Individual Use Creativity
Snapshot Creativity
Semantic Distance
等指标上明显优于多个清醒组。
这是理解论文理论的重要指标。
例如看到:
Tree
如果你马上想到:
leaf
语义距离比较近。
如果你想到:
spaceship
距离就非常远。
作者的思路是:
创造力不仅是想到更多东西,更重要的是能够从原始概念跳到距离较远的概念。
实验发现:
睡眠状态下,人更少直接重复:
“Tree”
而更容易产生距离更远的联想。
比如:
Tree → paint → shadow → travel → architecture……
论文把这解释成:
也就是:
概念激活从一个节点扩散到更远的语义节点。
当然论文自己也承认这一解释仍然需要更多分析,因为产生答案数量差异可能造成混杂。
VGT 给参与者一个名词:
Tree / Leaf / Bird / Forest / Root……
然后要求:
产生一个有创意的动词。
例如:
Tree:
growing
这比较普通。
更远的:
sheltering
甚至更不常规的:
wandering
等等。
他们不是简单统计正确率,而是计算:
即:
名词和生成动词之间的语义距离。
实验发现:
Sleep:
0.86 ± 0.06
Wake:
0.84 ± 0.06
p = 0.034
说明睡眠状态下生成的关联总体更“远”。
也就是:
“我认为自己是不是一个有创造力的人?”
实验之前:
四组之间没有显著差异。
实验之后:
睡眠组对自己的创造性评价明显更高。
例如:
Sleep:
7.84 ± 1.77
Wake:
6.64 ± 1.84
p = 0.009
而且:
“Flexible Thinker”的前后变化也显著偏向睡眠条件。
也就是说这个效果不只是:
“别人觉得你写得更有创意。”
而是:
你自己也更觉得自己有创造力。
作者认为这可能会形成长期的创造自我效能提升。
作者最想区分的其实是两个东西:
睡眠状态本身提高创造力。
睡眠中梦到某个特定主题提高创造力。
因此才需要:
Sleep + Tree
Sleep + No Tree
进行直接比较。
如果:
Sleep + Tree > Sleep + No Tree
那么说明:
不仅仅是睡眠状态重要,睡眠中的“内容”也可能重要。
实验确实发现:
Sleep + Tree 在多个指标上高于 Sleep + No Incubation。
所以论文提出:
这一点非常重要。
不只是比较:
有没有播放 Tree
而是进一步看:
你实际梦到了多少 Tree?
结果:
在睡眠组中:
Tree 出现得越多 → 创造力表现越高
尤其与:
Story Overall Creativity
Semantic Flexibility
AUT Snapshot
等指标存在正相关。
这比单纯比较“播放过 Tree”和“没有播放 Tree”更有意思。
因为它开始暗示:
不是声音本身导致效果,而是声音真正进入了梦境体验之后,效果更明显。
作者正是根据这一点进一步提出:
conscious dream content 本身可能是创造力提升的一个驱动因素。
这里必须非常谨慎。
作者在讨论部分的表述很大胆:
这是第一个在控制实验中支持“梦境本身对创造力有积极影响”的证据。
而且作者认为结果支持:
dream content,而不是单纯 sleep state。
但是:
这并不等于现代科学意义上的“已经完全证明梦境因果改善创造力”。
因为作者自己列出了非常明确的限制。
Dormio 并不是标准 PSG。
作者承认:
Dormio-defined sleep onset
和传统:
PSG-defined N1
并不完全是一回事。
正式论文没有做到每次实验都使用完整 PSG 金标准。
只有一个后续 Pilot PSG 验证。
结果:
65 分钟的实验过程中,受试者主要处于:
Wake + light N1
而没有进入:
N2
N3
REM
所以至少证明:
Dormio 可以帮助反复进入浅 N1,而不会轻易进入更深睡眠。
但是作者仍然认为:
未来需要更严格 PSG 验证。
这是一个非常重要的定义问题。
因为 Dormio 主要研究:
Hypnagogic hallucinations
也就是:
入睡时的幻觉/梦样体验。
有人会认为:
N1 的这些体验还不应该叫“真正的梦”。
所以作者自己也没有完全回避这个问题。
未来需要继续研究:
Hypnagogia 中植入的内容,是否会延续进入后面的 REM 梦境?
如果能证明:
N1 的 Tree → 后面 REM 也继续出现 Tree
那么才更有力地说明:
Dormio 是真正的“dream incubation machine”。
这个问题非常现实。
假设实验人员不断对你说:
Tree
Tree
Tree
然后问:
你刚才梦到什么?
受试者很容易想:
“是不是应该说 Tree?”
因此可能存在:
即:
受试者为了符合研究期待而报告 Tree。
作者自己明确意识到了这一点。
他们认为报告里的 Hypnagogic phenomenology 很真实,一般人很难伪造,所以认为这种偏差不足以完全解释结果。
但他们仍然认为未来需要更多控制。
例如:
你听到:
Tree
然后第二天创造力更强。
可能是:
Tree 真的进入梦境,然后梦境改变了创造力。
也可能是:
声音本身让你的大脑发生某些激活,梦只是伴随现象。
作者认为他们通过:
Sleep Tree
vs
Sleep No Tree
以及:
梦中真正出现 Tree 的数量
做出了较强的区分。
但是作者依旧认为不能彻底解决这个问题。
论文提出两个可能性:
真正的梦境体验本身是必要的。
即:
你真的经历这个梦
→ 创造力提升
梦只是睡眠中更深层的神经处理过程的“可见界面”。
即:
后台大脑活动
→ 创造力提升
而梦只是:
后台处理活动的主观表现
当前实验无法完全区分这两种机制。
作者特别强调:
过去很多睡眠研究只做:
睡觉前测试
→ 睡觉
→ 睡觉后再次测试
但是:
不收集梦境报告。
这样即便:
睡眠之后成绩提升
研究者也不知道:
睡眠中到底发生了什么主观体验。
而 Dormio 希望把:
也重新纳入睡眠科学。
也就是说:
“我在睡觉的时候经历了什么?”
不应该被当成纯粹无关紧要的信息。
这也是作者所谓的:
即:
睡眠研究应该认真研究 sleeping mind,而不只是 sleeping brain。
作者进行了:
不是每次都说:
Tree
而是:
第 1 次:
Volcano
受试者报告:
mountain,我在爬山
第 2 次:
Go inside the mountain
报告:
山里有房子
第 3 次:
Go inside the house
报告:
房子里有人……
第 4 次:
Go out of the house
报告:
我正在变成火……
也就是说:
提示 → 梦 → 下一次提示基于刚才的梦 → 新梦
最终形成连续的梦境故事。
理论上未来可以做成:
人睡觉
AI:
“你现在看到什么?”
人:
“一座山。”
AI:
“进入山里面。”
人:
“里面有一座房子。”
AI:
“走进房子。”
……
这实际上就变成:
也就是:
人和 AI 在半睡眠状态下进行对话。
论文甚至明确提出:
dream-guide chatbot
可以使用:
语言模型 + Text-to-Speech
进行这种实时梦境引导。
从今天的角度看,这一部分尤其值得注意。
作者真正想建立的概念是:
也就是:
Engineering + Neuroscience + HCI + Dreams
通过技术主动:
测量梦
记录梦
影响梦
研究梦
使用梦
论文甚至组织了 Dream Engineering Symposium,将睡眠科学家、工程师、艺术家等聚集到一起。
作者提出了大量方向:
写作、设计、艺术创作、头脑风暴。
例如:
PTSD / 噩梦
通过梦境内容干预尝试帮助患者。
在睡眠中辅助记忆相关内容。
例如语言学习。
诱导清醒梦。
利用 Hypnagogia 对问题进行非线性探索。
研究:
自我
身体
时间
记忆
情绪
视觉
语义
如何在意识转换时发生改变。
论文明确提到实验参与者自己也提出:
therapy
memorization
lucid dreaming
empathy building
等应用。
这是论文后半段非常重要的内容。
因为这个技术意味着:
你不完全清醒的时候,有人可以影响你的思维。
因此理论上可能出现:
作者甚至提到,自己在研究过程中已经接触过对“品牌梦境”的企业兴趣。
所以:
梦境可能成为广告、政治、商业影响的新战场。
因为 Hypnagogia 最大特点就是:
半清醒。
受试者经常还知道:
“我正在做实验。”
而 Dormio 每次提示之后都会提高警觉度。
也就是说:
你随时可以拒绝继续进入睡眠。
因此它比完全睡着之后长期播放刺激更加容易形成用户控制。
作者的设计原则其实是:
让用户自己选择输入,而不是让第三方替用户选择。
作者还提出了一个特别值得注意的问题:
类似:
“为什么要面对现实?
我可以一直活在梦里。”
因此未来如果真的出现成熟的梦境接口,可能面临:
现实逃避
对梦境的依赖
自我认知问题
创伤记忆重新激活
情绪干扰
所以论文认为:
如果未来规模化,必须加入临床心理/精神医学方面的合作。
作者自己列得很清楚。
Dormio 并没有完整达到 PSG 金标准。
未来要验证是否能影响后续 REM 梦境。
受试者可能知道:
研究人员想听到 Tree。
因此可能有报告偏差。
到底是:
梦境体验
还是:
睡眠期间后台神经处理
导致创造力提升?
无法完全区分。
实验时研究人员一直在房间内,以避免设备误判。
所以当时的 Dormio:
还没有做到完全自主。
这篇论文主要测的是发散性/联想型创造力。
没有充分测试:
convergent creativity
也就是:
找唯一正确答案、逻辑问题解决等类型的创造力。
作者提出这些可能与创造力变化有关,但本研究没有直接实验验证。
这其实是最值得记住的一张“逻辑图”:
外部声音提示
↓
Dormio 检测到入睡
↓
进入 Hypnagogia
↓
Tree / Rabbit / Fork 等主题被反复提示
↓
主题进入睡眠中的思维和梦境
↓
唤醒
↓
立即记录梦境
↓
再次进入 Hypnagogia
↓
多轮 Serial Incubation
↓
完成创造力测试
↓
发现:
Sleep > Wake
并且:
Sleep + Tree > Sleep + No Tree
同时:
梦中 Tree 越多 → 某些创造力指标越高
↓
作者因此提出:
这就是全文最核心的论证链。
我建议把结论分成三个层级理解。
Dormio 可以明显影响入睡初期的主观体验内容。
这一点证据相当强:
Sleep + Tree:
67% 报告包含 Tree
Sleep + No Incubation:
1.4%
差异极大。
进入 Hypnagogia 后,创造力测试表现比单纯清醒休息更好。
例如 Story Overall Creativity:
5.24 vs 4.14,p=.003。
AUT、VGT、Creative Self-Efficacy 也出现支持结果。
具体梦境内容本身可能是导致创造力提升的原因。
这就是论文最激进的理论主张。
支持它的证据包括:
Sleep Tree > Sleep No Incubation
以及:
梦中 Tree 的数量与创造力指标正相关。
但是论文自身也承认还有因果机制问题和实验限制。
如果从技术角度来看,我认为这篇论文最重要的创新可以概括为:
传统 AI / HCI:
人处于清醒状态
↓
输入
↓
系统响应
Dormio:
检测用户意识状态
↓
判断用户进入某种特殊状态
↓
在这个状态做不同的交互
↓
再检测状态变化
↓
调整下一步刺激
所以它实际上是一个:
即:
闭环人机交互。
不是:
“每隔五分钟播放一次声音。”
而是:
“当系统判断你进入目标意识状态时,才进行刺激。”
这一思想实际上比“梦境”本身更具有工程意义。
论文最后的愿景并不是:
“做一个睡眠监测手环。”
而是:
即:
计算机不应该只和“清醒的你”交互。
而应该能够和:
清醒状态
放松状态
入睡状态
梦境状态
半清醒状态
进行不同形式的交互。
作者把人定义成:
24 小时周期中的思考者。
所以最终目标其实是:
把“睡眠中的人”也纳入人机交互系统。
如果只留下一个结论:
这篇 MIT 论文尝试证明:在刚刚入睡的 Hypnagogia 阶段,通过 Dormio 用声音反复提示一个目标主题,可以让该主题明显进入睡眠中的梦样体验;而这种睡眠状态以及尤其是与任务相关的梦境内容,可能进一步提高之后的创造性表现。
但必须同时加上第二句话:
这是一项非常有意思的早期受控实验,而不是“已经证明可以通过梦境稳定地提高智力/创造力”的最终结论;作者自己明确承认 PSG 验证、报告偏差、梦境定义、因果机制、样本与创造力测量等方面仍存在明显限制。
这 168 页其实可以看成 7 个核心部分:
① Introduction
为什么睡眠、梦境和创造力值得研究。
② Background
睡眠阶段、REM/NREM、梦境、Hypnagogia、创造力理论。
③ Dormio Device
硬件、传感器、算法、App、Serial Incubation。
④ Experiments
Pilot + 约 50 人正式实验。
⑤ Results
梦境控制、梦境回忆、创造力、AUT、VGT、自我效能。
⑥ Discussion
为什么作者认为“梦境内容”本身可能影响创造力。
⑦ Ethics + Limitations + Conclusion
梦境操控可能带来的广告、政治操纵、心理风险,以及未来研究方向。
尤其值得注意的是,作者自己还提出了一个非常超前的方向:
未来可以让 AI chatbot 根据你刚刚报告的梦实时生成下一条提示,从而与正在做梦的人进行连续互动。