O som do átomo de hidrogênio
Um post em português para apresentar um projeto com objetivo de escutar o som do átomo de hidrogênio! Futuramente, pretendo upar outros átomos aqui.
Inspirado pelo vídeo do minute physics decidi fazer esse mini projeto para mostrar como fazer projetos envolvendo faixas de som audíveis no próprio navegador, totalmente em python através do Jupyter Notebook.
Para isso, vamos usar o espectro do átomo de hidrogênio, e vamos fazer um shift linear nele para dentro do espectro audível de frequências sonoras. O nome dado a esse processo é sonificação, você pode usar o link para saber mais caso se interesse.
%matplotlib inline
from __future__ import division, print_function, absolute_import
import scipy.constants as const
import numpy as np
import scipy
from matplotlib.pyplot import plot
from scipy.io import wavfile
from IPython.core.display import HTML, display
try:
from IPython.display import Audio
def wavPlayer(data, rate):
display(Audio(data, rate=rate))
except ImportError:
pass
from numpy import sin, pi
rate = 44100 # freq = 44.1 khz
duration = 3 # duração do audio
# função para normalizar o seno na amplitude certa para um arquivo wav
normedsin = lambda f,t : 2**13*sin(2*pi*f*t)
time = np.linspace(0,duration, num=rate*duration)
Para começar, vamos começar tocando algo em 440 Hz
import numpy
import struct
import warnings
la = lambda t : normedsin(440,t)
# plot rápido da onda nos primeiros 25 ms
plot(time[0:1000], la(time)[0:1000])
ampl = la(time).astype(np.int16)
# função que salva o áudio e toca ele em HTML5
wavPlayer(ampl, rate)
As diferentes frequências emitidas por um átomo de hidrogênio são analiticamente calculadas através da formula de Rydberg:
$$\frac{1}{\lambda} = R \left(\frac{1}{n_1} - \frac{1}{n_2}\right) $$
Como sabemos, essa relação tem um formato muito similar a das freqências emitidas do hidrogênio
$$ f_{n,m} = \frac{c}{\lambda} = \frac{R_h}{h} \left(\frac{1}{n} - \frac{1}{m}\right) $$
Para o caso de $n = 1$ reconhecemos a famosa série de Lyman, e para $n = 2$ a série de Balmer
f0 = const.Rydberg*const.c
print("A maior frequência do hidrogênio é ",f0,"Hz. e corresponde a n = 1, m = ∞")
fshift = 440
print("todavia odemos shiftar o espectro para 440 Hz (A)")
ryd = lambda n,m : fshift*(1/(n**2) -1/(m**2))
flyman = lambda x : ryd(1,x)
fbalmer = lambda x : ryd(2,x)
ser = lambda t : sum( [normedsin(flyman(i),t)+normedsin(fbalmer(i+1),t) for i in range(2,8)])
# e uma função em forma de vetor para realizar operações em cada um dos seus elementos
serv = scipy.vectorize(ser)
ss= serv(time)
plot(time, ss)
ss = 2**15*ss/ss.max()
wavPlayer(ss.astype(np.int16),rate)