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.
71 lines
3.1 KiB
71 lines
3.1 KiB
2 years ago
|
"""
|
||
|
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()
|