model of DCN pyramidal neuron
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.2 KiB

"""
Test sounds and plot waveforms.
This script tests the sound waveform generator for a variety of sounds
"""
import numpy as np
import pyqtgraph as pg
from cnmodel.util import sound
from collections import OrderedDict
import scipy.signal
import sys
try:
import PySounds
HAVE_PYSOUNDS = True
except ImportError:
HAVE_PYSOUNDS = False
def play():
if len(sys.argv) >= 2:
stimarg = sys.argv[1]
else:
exit()
plots = True
if HAVE_PYSOUNDS:
PS = PySounds.PySounds()
cf = 2e3
Fs = 44100 # sample frequency
level = 80.0
seed = 34978
fmod = 20.0
dmod = 20.0
if plots:
# waveforms
win = pg.GraphicsWindow()
pipwin = win.addPlot(title="sound pip", row=0, col=0)
pipmodwin = win.addPlot(title="100 \% SAM modulated pip", row=1, col=0)
noisewin = win.addPlot(title="WB noise", row=2, col=0)
noisemodwin = win.addPlot(title="100 \% SAM Modulated WB Noise", row=3, col=0)
clickwin = win.addPlot(title="clicks", row=4, col=0)
fmwin = win.addPlot(title="fmsweep", row=5, col=0)
# spectra
pipwins = win.addPlot(title="sound pip Spec", row=0, col=1)
pipmodwins = win.addPlot(title="100 \% SAM modulated pip", row=1, col=1)
noisewins = win.addPlot(title="WB noise", row=2, col=1)
noisemodwins = win.addPlot(title="100 \% SAM Modulated WB Noise", row=3, col=1)
clickwins = win.addPlot(title="click spec", row=4, col=1)
fmwins = win.addPlot(title="fmsweep spec", row=5, col=1)
else:
pipwin = None
pipmodwin = None
noisewin = None
noisemodwin = None
clickwin = None
pipwins = None
pipmodwins = None
noisewins = None
noisemodwins = None
clickwins = None
fmwins = None
stims = OrderedDict(
[
("pip", (pipwin, sound.TonePip)),
("pipmod", (pipmodwin, sound.SAMTone)),
("noise", (noisewin, sound.NoisePip)),
("noisemod", (noisemodwin, sound.SAMNoise)),
("clicks", (clickwin, sound.ClickTrain)),
("fmsweep", (fmwins, sound.FMSweep)),
]
)
specs = OrderedDict(
[
("pip", (pipwins, sound.TonePip)),
("pipmod", (pipmodwins, sound.SAMTone)),
("noise", (noisewins, sound.NoisePip)),
("noisemod", (noisemodwins, sound.SAMNoise)),
("clicks", (clickwins, sound.ClickTrain)),
("fmsweep", (fmwins, sound.FMSweep)),
]
)
if stimarg == "all":
stimlist = list(stims.keys())
else:
stimlist = [stimarg]
for stim in stimlist:
print(stim)
if stim in ["clicks"]:
wave = stims[stim][1](
rate=Fs,
duration=1.0,
dbspl=level,
click_duration=1e-4,
click_starts=1e-3 * np.linspace(10, 500, 10),
)
elif stim in ["fmsweep"]:
wave = stims[stim][1](
rate=Fs,
duration=0.5,
dbspl=level,
start=0.0,
ramp="linear",
freqs=[16000, 200],
)
elif stim in ["pip", "pipmod", "noise", "noisemod"]:
wave = stims[stim][1](
rate=Fs,
duration=2.0,
f0=cf,
dbspl=level,
pip_duration=1.8,
pip_start=[10e-3],
ramp_duration=2.5e-3,
fmod=fmod,
dmod=dmod,
seed=seed,
)
if plots:
stims[stim][0].plot(wave.time, wave.sound)
f, Pxx_spec = scipy.signal.periodogram(
wave.sound, Fs
) # , window='flattop', nperseg=8192,
# noverlap=512, scaling='spectrum')
specs[stim][0].plot(f, np.sqrt(Pxx_spec))
if HAVE_PYSOUNDS:
print("Playing %s" % stim)
PS.playSound(wave.sound, wave.sound, Fs)
if plots and sys.flags.interactive == 0:
pg.QtGui.QApplication.exec_()
if __name__ == "__main__":
if not HAVE_PYSOUNDS:
print("Could not import PySounds; will not play audio.")
play()