Пример #1
0
                            out_dir=out_dir)

# Pink Noise
songname = 'pnoise'
fs = 44100  # Hz
t = 6 * 60  # s
lpf_order = 4
f_cutoff = 300  # Hz
np.random.seed(1024)
b, a = butter(lpf_order, Wn=f_cutoff, btype='lowpass', fs=fs)
pn = util.pink_noise(int(t * fs))
pn = pn - np.mean(pn)
pn = lfilter(b, a, pn)
pn = pn - np.mean(pn)
pn = pn / np.max(np.abs(pn)) * 0.25  # peak -12 dB
hpre = util.constant_phase_shifter(filter_order, np.deg2rad(283), beta=8.6)[1]
pn = util.acausal_filter(pn, hpre)  # pre-shifting for decreasing crest factor
x = pn
n_start, n_stop = 9747840, 9851538
t_fadein, t_fadeout, t_intro, t_outro = 10, 10, 10, 10  # in milliseconds
util.make_aperiodic_stimuli(x,
                            fs,
                            songname,
                            n_start,
                            n_stop,
                            phase_angles,
                            filter_order,
                            t_fadein,
                            t_fadeout,
                            t_intro,
                            t_outro,
Пример #2
0
Y_dft = np.zeros((len(phase_angles), N // 2 + 1), dtype='complex128')
for i, phi in enumerate(phase_angles):
    y = util.constant_phase_shift_dft(x_1p, phi)
    y = util.periodic_signal(y, repetition)
    y_dft[i] = y
    Y_dft[i] = np.fft.rfft(y)

# Phase shift using FIR filter
long_repetition = 601  # very long burst train
n_start = util.t2n(300 * t_period, fs=fs, ms=True)
n_stop = util.t2n(303 * t_period, fs=fs, ms=True)
x_Mp = util.periodic_signal(x_1p, long_repetition)
y_fir = np.zeros((len(phase_angles), N))  # selection of long signal
Y_fir = np.zeros((len(phase_angles), N // 2 + 1), dtype='complex128')
for i, phi in enumerate(phase_angles):
    h = util.constant_phase_shifter(filter_order, phi, beta=8.6)[1]
    y = util.acausal_filter(x_Mp, h)[n_start:n_stop]
    y_fir[i] = y
    Y_fir[i] = np.fft.rfft(y)

# I. Float64

# Waveforms - DFT vs FIR methods
t = np.arange(len(y_fir[0])) / fs * 1000
fig, ax = plt.subplots(figsize=(12, 5), ncols=3, sharey=True)
for i, (phi, yd, yf) in enumerate(zip(phase_angles, y_dft, y_fir)):
    ax[i].plot(t, util.db(yd), c='lightgray', label='DFT')
    ax[i].plot(t, util.db(yd - yf), label='diff')
    ax[i].set_xlabel('$t$ / ms')
    ax[i].set_title('{:0.0f}'.format(np.rad2deg(phi)))
    ax[i].grid(True)
Пример #3
0
filename = 'castanets.wav'
start, stop = 6650, 6850
s0, fs = sf.read(dir_src + filename, start=start, stop=stop)

# Upsampling
oversample = 2
s0 = resample(s0, num=len(s0) * oversample)
fs *= oversample

# Phase angles and shifter order
phimin, phimax, phinum = 0, 2 * np.pi, 8
phase_angles = np.linspace(phimin, phimax, num=phinum, endpoint=False)
filter_order = 2**15

# Hilbert transform
hH = util.constant_phase_shifter(filter_order, -0.5 * np.pi, beta=8.6)[1]
sH = util.acausal_filter(s0, hH)
envelope = np.sqrt(s0**2 + sH**2)

# Constant phase shift
signals = [np.cos(phi) * s0 - np.sin(phi) * sH for phi in phase_angles]

# time axis
time = util.n2t(start + np.arange(len(s0)), fs=fs, ms=True)


# Plots
ext = '.pdf'

# Original
fig, ax = plt.subplots(figsize=(12, 6))
Пример #4
0
# Plots
colors = cm.get_cmap('viridis', len(phase_angles)).colors
phi_ticks = np.arange(0, 180 + 45, 45)
phi_lim = -10, 190
fontsize_label = 9
f_maglabel = 8000
f_phaselabel = 8000
voffset_tf = 6
voffset_maglabel = 0.5
voffset_phaselabel = 1.875

fig, ax = plt.subplots(ncols=2, gridspec_kw={'wspace': 0.25})

for i, fo in enumerate(Filter_orders):
    _, h = util.constant_phase_shifter(fo, phase_varN, beta=beta)
    _, H = freqz(h, 1, f, fs=fs)
    gd = fo / 2 / fs
    H *= np.exp(1j * omega * gd)  # compensate group delay
    phase = np.unwrap(np.mod(np.angle(H), 2 * np.pi))
    phase_deg = np.rad2deg(phase)

    vshift = -idx_varN * voffset_tf
    color = colors[idx_varN]
    opacity = 1.2**(-i)

    # Frequency responses for varying filter order
    ax[0].semilogx(f,
                   vshift + db(H),
                   color=color,
                   lw=1.5,