Les verres musicaux¶
Un verre d’eau partiellement rempli peut émettre une note distincte lorsque l’on frotte son bord avec un doigt mouillé. C’est l’ingrédient de base du Verrillon. Mais que cache son spectre ?
La vidéo data/Singing_Glass.MOV à été faite avec un verre à vin, de l’eau et un smartphone. Sa bande son à été extraite dans le fichier data/SingingGlass.wav.
Télécharger, puis importer la piste sonore SingingGlass.wav :
from scipy.io.wavfile import read
samplerate, amplitude = read('data/SingingGlass.wav')
Afficher le nombre de points N contenus dans ce signal, la durée de l’intervalle entre deux points et la durée totale de l’enregistrement.
Afficher le signal. Quelle est approximativement la fréquence du son ?
L’intensité du spectre à une fréquence donnée est proportionnel au carré du module de la transformée de Fourier. Affichez le spectre de SingingGlass.wav.
Zoomer autour de la fréquence du son. Que remarquez-vous ?
On a phénomène de battement que l’on entend à l’oreille. Qu’elle est la fréquence du battement ?
Il s’agit d’un phénomène méconnu mais relativement commun avec les verres musicaux, où deux modes de vibration orthogonaux sont excités. Ces deux modes n’ont pas exactement la même énergie due aux imperfections dans la symétrie du verre. La non-dégénérescence de ces modes dépend du niveau d’eau. Voir par exemple: https://newt.phys.unsw.edu.au/music/people/publications/Jundtetal2006.pdf
Solution¶
from scipy.io.wavfile import read
from matplotlib.pyplot import figure
import numpy as np
from numpy.fft import rfft, rfftfreq
Fs , amplitude = read('data/SingingGlass.wav')
amplitude = amplitude/2**16
N = len(amplitude)
print('N =',N)
dt = 1/Fs
print('dt = ', dt,'s')
T = dt*N
print('T =',T,'s')
N = 800001
dt = 2.2675736961451248e-05 s
T = 18.14061224489796 s
time = np.arange(N)*dt
mask = np.abs(time-5)<3E-3
fig = figure()
ax = fig.subplots(1, 1)
ax.plot(time, amplitude)
ax.set_ylim(-.5, None)
axins = ax.inset_axes([0.5, 0.10, 0.47, 0.47])
axins.plot(time[mask], amplitude[mask])
ax.indicate_inset_zoom(axins, edgecolor="black")
for a in [ax, axins]:
a.grid()
Il y a a peu près 3 oscillations en 2 ms.
frequency = rfft(amplitude)
freqs = rfftfreq(N, dt)
fig = figure()
ax = fig.subplots(1, 1)
ax.plot(freqs, np.abs(frequency)**2, '')
ax.set_xlabel('Frequence [Hz]')
Text(0.5, 0, 'Frequence [Hz]')
fig = figure()
ax = fig.subplots(1, 1)
ax.plot(freqs, np.abs(frequency)**2, '')
ax.set_xlim(1600, 1620)
ax.set_xlabel('Frequence [Hz]')
Text(0.5, 0, 'Frequence [Hz]')
On observe bien deux fréquences séparée d’environ 2 Hz.