MAT多时间尺度适应性阈值模型 non_reseting Neuron

论文地址:https://www.frontiersin.org/articles/10.3389/neuro.10.009.2009/full
MAT神经元模型,在我看来就是一个变动阈值一个模型,所以对于他的细胞膜电压不会有发放或者不发放的时候。
在这里插入图片描述
这个就是神经元细胞膜电压的变动公式,类似LIF,但是这个模型跟LIF的区别在于,它不重置,所以在这个公式里面就没有重置电势。
对比一下:
在这里插入图片描述
这是LIF的电势变动。
先上一下结果图:
在这里插入图片描述
从这个图里可以看见,是适应性阈值在碰到模型电势之后阈值往上抬,然后在按照一定规则下降,再次碰到细胞膜电势之后再阈值抬高。现在开始解释阈值变动规则。
在这里插入图片描述
其中ω是阈值的初始设定值,H(t)是变动值,tk是上个脉冲的发放时间,所以它是阈值是越来越小的。
在这里插入图片描述
指数函数的图像,已知e是大于1的数且τj是时间常数大于0。αj是权重
在这里插入图片描述
上代码!

import sys
import subprocess
import matplotlib.pyplot as plt


#Parameters for MAT parameters
tau = 5.0   #τm 5ms
R = 50.0    #电源电阻
E_L = -65   #静息电位
v = E_L     #膜电位电势


#parameters for Adaptive Threshold  适应性阈值的参数
#修改参数把神经元改成 RS神经元、IB神经元、FS神经元以及CH神经元,下面这一种神经元是RS神经元
t_f = 0; t_ref = 20 #不应期
x = [0, 0]
tau_1 = 10; tau_2 = 200 #τ1 = 10ms τ2 = 200ms
alpha = [30,2.0]
omega = -45


#Simulation Parameters 仿真参数 dt是时间间隙
num = 0; dt = 0.1


with open("current_sample.txt", 'r') as f_cur:  #读取text文件
    data = list(map(float, f_cur.read().splitlines()))
    print(data)


num = len(data)
print(num)


f_volt = open('voltage.txt', 'w', encoding='UTF-8')
f_sp = open('spiketime.txt', 'w', encoding='UTF-8')


y_list = []     # List of recorded voltage
v_th_list = []  # List of threshold


for i in range(num):
    I_ex = data[i]
    #v = (1 - 1.0/tau*dt) * v + (R/tau) * dt * I_ex
    v = v + (R*I_ex - (v - E_L))/tau * dt


    #Adapting Threshold
    x[0] = (1 - 1.0/tau_1*dt) * x[0] #Fast $B!' (Btau_1= 10 ms
    x[1] = (1 - 1.0/tau_2*dt) * x[1] #Slow: tau_2= 200 ms
    v_th = omega + x[0] + x[1]
    y = v
    #Condition for Spike Generation (v_th: threshold, t_ref: reflactory period)
    if v_th < v and t_f + t_ref < i + 1:
        x[0] += alpha[0]
        x[1] += alpha[1]
        t_f = i + 1
        f_volt.write('{:.6f} 0\n'.format(i*dt)) #Output Voltage  输出的电压
        f_sp.write('{:.6f}\n'.format(t_f*dt)) #Output SpikeTime  脉冲的发放时间
        y = 0
    else:
        f_volt.write('{:.6f} {:.6f}\n'.format(i*dt, v))
    y_list.append(y)
    v_th_list.append(v_th)

time = [i*dt for i in range(num)]
fig = plt.figure()
plt.plot(time, y_list, label="voltage")
plt.plot(time, v_th_list, label="threshold")
plt.xlabel("time [ms]")
plt.ylabel("voltage [mV]")
plt.legend(loc='upper left', bbox_to_anchor=(1, 1))
plt.tight_layout()
plt.show()
fig.savefig("spike.eps")
fig.savefig("spike.png")




f_volt.close()
f_sp.close()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
class vbase_test extends uvm_test; `uvm_component_utils(vbase_test) env m_env; vseqr m_vseqr; int unsigned simSeed; function new(string name, uvm_component parent); super.new(name, parent); endfunction : new extern function void build_phase (uvm_phase phase); extern function void connect_phase (uvm_phase phase); extern task reset_phase(uvm_phase phase); extern task reset_reg_model(); extern function void end_of_elaboration_phase(uvm_phase phase); extern function void start_of_simulation_phase(uvm_phase phase); extern task main_phase(uvm_phase phase); // report test result extern virtual function void report_phase(uvm_phase phase); endclass : vbase_test function void vbase_test::build_phase (uvm_phase phase); super.build_phase(phase); m_env = env::type_id::create(.name("m_env"), .parent(this)); // virtual sequencer m_vseqr = vseqr::type_id::create(.name("m_vseqr"), .parent(this)); uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vBaseSeq::type_id::get()); //uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vUniBaseSeq#()::type_id::get()); endfunction : build_phase function void vbase_test::connect_phase (uvm_phase phase); m_vseqr.p_rm = m_env.m_reg_model; m_vseqr.i2c_seqr = m_env.m_i2c_agent.m_seqr; endfunction : connect_phase task vbase_test::reset_phase(uvm_phase phase); //`uvm_info(get_type_name(), {"REGISTER MODEL:\n", m_reg_model.sprint()}, UVM_MEDIUM) reset_reg_model(); super.reset_phase(phase); endtask task vbase_test::reset_reg_model(); forever begin wait (tb_top.reset_n == 0); m_env.m_reg_model.reset(); `uvm_info(get_type_name(), "Reseting Complete", UVM_MEDIUM) wait (tb_top.reset_n == 1); end endtask function void vbase_test::end_of_elaboration_phase(uvm_phase phase); int handle; $system("rm -rf TEST_RUNNING"); simSeed = $get_initial_random_seed(); handle = $fopen($psprintf("TEST_RUNNING_%0d",simSeed),"w"); $fclose(handle); handle = $fopen("caseSeed","w"); $fwrite(handle,"%0d",simSeed); $fclose(handle); if($test$plusargs("uvm_tree")) uvm_top.print_topology(); endfunction : end_of_elaboration_phase function void vbase_test::start_of_simulation_phase(uvm_phase phase); `uvm_info(get_type_name(), {"start of simulation for ", get_full_name()}, UVM_HIGH); endfunction : start_of_simulation_phase task vbase_test::main_phase(uvm_phase phase); phase.phase_done.set_drain_time(this, 200ns); endtask : main_phase // report test result function void vbase_test::report_phase(uvm_phase phase); uvm_report_server server; int handle; int unsigned err_num; super.report_phase(phase); server = get_report_server(); err_num = (server.get_severity_count(UVM_ERROR) + server.get_severity_count(UVM_FATAL)); simSeed = $get_initial_random_seed(); $display("\n********************************************************************************************\n"); if (err_num != 0) begin $display("TEST CASE FAILED!!!"); handle = $fopen($psprintf("TEST_FAILED_%0d",simSeed),"w"); end else begin $display("TEST CASE PASSED!!!"); handle = $fopen($psprintf("TEST_PASSED_%0d",simSeed),"w"); end $fclose(handle); $display("\n********************************************************************************************\n"); $system("rm -rf TEST_RUNNING*"); endfunction `endif
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值