diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..002fe32 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/Users/morteza/miniconda3/bin/python" +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..002fe32 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/Users/morteza/miniconda3/bin/python" +} \ No newline at end of file diff --git a/icom/encoder.py b/icom/encoder.py index 9b6336b..1887b8b 100644 --- a/icom/encoder.py +++ b/icom/encoder.py @@ -1,23 +1,47 @@ +#%% import numpy as np - +import matplotlib.pyplot as plt # encode a message using poisson rate coding def encode_message(symbol: str, signal_rate: float, - noise_rate: float, - duration: int, # in seconds + duration: int, **kwargs): codebook = kwargs.get("codebook",None) + noise_rate = kwargs.get("noise_rate", 0) if codebook is None: raise TypeError("Invalid code book.") - #TODO - spikes = np.random.poisson(lam=signal_rate, size=duration) - spikes = [np.sum(spikes[1:i]) for i in range(len(spikes))] - print(np.mean(spikes)) + rate = signal_rate + noise_rate + + # generate spikes more than the required size. + isi = np.random.poisson(lam=rate, size= 2 * rate * duration) + spikes = np.cumsum(isi) # convert intervals to a train + spikes = spikes * (2*duration/spikes[-1]) # normalize # add leak spikes + + # cull spikes + spikes = spikes[np.where(spikes<=duration)] return spikes -encode_message("1", 5, .3, 10, codebook=[]) +# generate spike train with signal rate of 2 and noise rate of 2. +spikes = encode_message("A", 2, duration=10, codebook=['A','B'],noise_rate=2) + + +#%% [markdown] + +# the following code plots signal train alognside the noise spikes. + +# generate signal spikes +spikes = encode_message("A", 2, duration=10, codebook=['A','B']) + +# generate noise spikes +noise_spikes = encode_message("", 2, duration=10, codebook=[]) + +plt.eventplot(spikes, color='white') +plt.eventplot(noise_spikes, color='red') +plt.show() + +#%% diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..002fe32 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/Users/morteza/miniconda3/bin/python" +} \ No newline at end of file diff --git a/icom/encoder.py b/icom/encoder.py index 9b6336b..1887b8b 100644 --- a/icom/encoder.py +++ b/icom/encoder.py @@ -1,23 +1,47 @@ +#%% import numpy as np - +import matplotlib.pyplot as plt # encode a message using poisson rate coding def encode_message(symbol: str, signal_rate: float, - noise_rate: float, - duration: int, # in seconds + duration: int, **kwargs): codebook = kwargs.get("codebook",None) + noise_rate = kwargs.get("noise_rate", 0) if codebook is None: raise TypeError("Invalid code book.") - #TODO - spikes = np.random.poisson(lam=signal_rate, size=duration) - spikes = [np.sum(spikes[1:i]) for i in range(len(spikes))] - print(np.mean(spikes)) + rate = signal_rate + noise_rate + + # generate spikes more than the required size. + isi = np.random.poisson(lam=rate, size= 2 * rate * duration) + spikes = np.cumsum(isi) # convert intervals to a train + spikes = spikes * (2*duration/spikes[-1]) # normalize # add leak spikes + + # cull spikes + spikes = spikes[np.where(spikes<=duration)] return spikes -encode_message("1", 5, .3, 10, codebook=[]) +# generate spike train with signal rate of 2 and noise rate of 2. +spikes = encode_message("A", 2, duration=10, codebook=['A','B'],noise_rate=2) + + +#%% [markdown] + +# the following code plots signal train alognside the noise spikes. + +# generate signal spikes +spikes = encode_message("A", 2, duration=10, codebook=['A','B']) + +# generate noise spikes +noise_spikes = encode_message("", 2, duration=10, codebook=[]) + +plt.eventplot(spikes, color='white') +plt.eventplot(noise_spikes, color='red') +plt.show() + +#%% diff --git a/py/poisson_generator.py b/py/poisson_generator.py index 3feab60..1bb04df 100644 --- a/py/poisson_generator.py +++ b/py/poisson_generator.py @@ -36,6 +36,7 @@ #poi = [i-j for i,j in zip(poi[:-1],poi[1:])] poi2 = [np.sum(poi[1:i]) for i in range(len(poi))] +# or poin2=np.cumsum(poi) print(poi2) #poi = np.diff(poi) # alternative numpy solution for inter-interval durations #plt.plot(poi2) @@ -55,4 +56,6 @@ rate = 5 ks = np.arange(20) ps = events_prob(5,20,ks) -print(np.argmax(ps), np.max(ps)) \ No newline at end of file +print(np.argmax(ps), np.max(ps)) + +#%%