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.
70 lines
3.1 KiB
70 lines
3.1 KiB
""" |
|
Test sounds and plot waveforms. |
|
|
|
This script tests the sound waveform generator for a variety of sounds |
|
|
|
""" |
|
import sys |
|
import numpy as np |
|
import pyqtgraph as pg |
|
from cnmodel.util import sound |
|
from collections import OrderedDict |
|
from scipy import signal |
|
|
|
class test_sounds(): |
|
def __init__(self): |
|
cf = 2e3 |
|
Fs = 100e3 # sample frequency |
|
level = 80. |
|
seed = 34978 |
|
fmod = 10. |
|
dmod = 100. |
|
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) |
|
wavewin = win.addPlot(title='wavefile', row=5, col=0) |
|
|
|
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) |
|
wavewins = win.addPlot(title='Wavefile spec', row=5, col=1) |
|
|
|
stims = OrderedDict([('pip', (pipwin, sound.TonePip)), ('pipmod', (pipmodwin, sound.SAMTone)), |
|
('noise', (noisewin, sound.NoisePip)), ('noisemod', (noisemodwin, sound.SAMNoise)), |
|
('clicks', (clickwin, sound.ClickTrain)), |
|
('wavefile', (wavewin, sound.ReadWavefile))]) |
|
|
|
specs = OrderedDict([('pip', (pipwins, sound.TonePip)), ('pipmod', (pipmodwins, sound.SAMTone)), |
|
('noise', (noisewins, sound.NoisePip)), ('noisemod', (noisemodwins, sound.SAMNoise)), |
|
('clicks', (clickwins, sound.ClickTrain)), |
|
('wavefile', (wavewins, sound.ReadWavefile))]) |
|
|
|
|
|
for stim in stims: |
|
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, 50)) |
|
# wave = stims[stim][1](rate=Fs, dbspl=level, click_interval=10., nclicks=10, |
|
# click_duration=1e-4, click_start=10.) |
|
elif stim in ['wavefile']: |
|
wave = stims[stim][1](wavefile='cnmodel/examples/stim172_geese.wav', rate=Fs, dbspl=level) |
|
wave.sound # force generation here |
|
print('time shape test: ', wave.time.shape) |
|
else: |
|
wave = stims[stim][1](rate=Fs, duration=1.0, f0=cf, dbspl=level, |
|
pip_duration=0.8, pip_start=[10e-3], ramp_duration=2.5e-3, |
|
fmod=fmod, dmod=dmod, seed=seed) |
|
|
|
stims[stim][0].plot(wave.time, wave.sound) |
|
f, Pxx_spec = signal.periodogram(wave.sound, Fs) # window='flattop', nperseg=8192, noverlap=512, scaling='spectrum') |
|
specs[stim][0].plot(f, np.sqrt(Pxx_spec)) |
|
|
|
|
|
if __name__ == '__main__': |
|
test_sounds()
|
|
|