Analyze and reproduce sonic screwdriver sound
An approximation

Actually, the signal is not that complicated in my opinion. However, I am not a sounds guy... Just playing around with it a bit.

Interestingly, I have a very similar signal that I have produced (see attached sound file and spectrograms. Spectrogram above is my signal (somewhat tuned to your signal's parameters) and below is the sonic screw-driver (of which Doctor by the way? ;) )

I cannot post the code here, since as I said the parameters are a bit tuned to your signal. What I basically did is to create a signal that is...


A sum of 10 signals. Center frequency f_mid = 3.7 kHz + 20Hz*N, N = 0, 1, ..., 9, just to have some kind of a wobbly jitter in there
The center frequency is modulated by a "circle" (df: maximum change of the center frequency, t_circ: duration of a circle, t_mid: starting point of the circle in time) with df = 20 Hz, t_circ = 0.1s. The phase of the signal is generated from the constant frequency plus the dynamic modulation and a very simple numerical integration (phase multiplied by an increasing dt-vector and cumsuming over it). To get to a signal's frequency, you would differentiate its phase wrt to time - so this is the inverse process.

T = 1.0/44100.0
f_circ = df*(1.0 - ((t_circ - t_mid)/t_mid)**2.0)**0.5 
phase1 = np.cumsum((f_mid + f_circ)Tnp.ones(t_circ.shape))
phase2 = np.cumsum((f_mid - f_circ)Tnp.ones(t_circ.shape))
circ = np.sin(2.0*pi*phase1) + np.sin(2.0*pi*phase2)

Added some somewhat "Brownian" Noise, however it is much below the noise in your signal.


Things to explore


The "duration" of the "circles" seems so vary slightly. Probably sinusoidal variation is also fine, so the period could be jittered. 
Apparently, there is additionally a very broad noise-band. Maybe try some uniform noise with a time-varying windowing? 
Subtract a bunch of short-term, constant frequency signals from your signal. There is a nearly some kind of a grid visible in the spectrogram.


Some code samples

I am sorry, in my previous description, I apparently have missed some details. Please find here a code snipped that should be able to produce a basic signal that exhibits the basic "circular" frequency change:

import matplotlib
matplotlib.use('MacOSX') 
import matplotlib.pyplot as pp
import numpy as np
import scipy.io.wavfile
import scipy.signal

# Export function for convenience 
def export_wave2(t, signal_l, signal_r, name = "test_sp.wav"):
    sample_rate = 44100
    data = np.stack((signal_l, signal_r))
    data = np.transpose(data)
    scipy.io.wavfile.write(name, sample_rate, data.astype("float32"))


# Sampling frequency
fs = 44100
T = 1.0/fs

# Circle parameters
t_circ_max = 0.2 # duration of one "circle"
t_circ     = np.arange(0, t_circ_max, 1.0/fs)
t_mid      = t_circ.max()/2.0
f_mid      = 3700 # middle frequency of the sound signal 
df         = 400     # amplitude of the frequency modulation, ie frequency will vary between f_mid - fd and f_mid + fd



# Create ONE circle
f_circ = df*(1.0 - ((t_circ - t_mid)/t_mid)**2.0)**0.5 


phase1 = np.cumsum((f_mid + f_circ)*T*np.ones(t_circ.size))
phase2 = np.cumsum((f_mid - f_circ)*T*np.ones(t_circ.size))
circ = np.sin(2.0*np.pi*phase1) + np.sin(2.0*np.pi*phase2)

# Repeate the circle N times, ie the signal will be N*t_circ_max long
N = 10
circs = np.hstack([circ for k in range(0,N)])
circs = circs / np.abs(circs).max()
circs_time = np.arange(0, N*t_circ_max, 1/fs)

pp.plot(circs_time, circs)
pp.show()

export_wave2(circs_time, circs, circs, name = "test_sp.wav")


The frequency behaviour is of course not visible directly in the plots, but when a spectrogram is calculated from circs. I have loaded the test_sp.wav into Audacity for this.

Sound example