<jupyter_start><jupyter_text>QuantizaçãoNeste notebook, investigamos de maneira aproximada os fenômenos de aproximação associados ao processo de quantização.<jupyter_code># importar as bibliotecas necessárias
import numpy as np # arrays
import matplotlib.pyplot as plt # plots
plt.rcParams.update({'font.size': 14})
import IPython.display as ipd # to play signals
import sounddevice as sd<jupyter_output><empty_output><jupyter_text>Criar um sinal senoidal (com órtima resolução de escala)<jupyter_code>fs = 44100
time = np.arange(0, 2, 1/fs)

xt = np.sin(2*np.pi*1000*time)

plt.figure(figsize = (12, 4))
plt.plot(time, xt, '-b', linewidth = 1)
plt.grid(linestyle = '--', which='both')
plt.xlabel('Tempo [s]')
plt.ylabel('Amplitude [-]')
plt.xlim((0, 0.005))
plt.ylim((-1.2, 1.2))

ipd.Audio(xt, rate=fs) # load a NumPy array<jupyter_output><empty_output><jupyter_text>Vamos quantizar o nosso senoEscolhemos- n_bits : número de bits no processo de quantização- max_level : máximo nível $\pm$ suportado pela eletrônica da placa de sombins representará um vetor de possibilidades para alocação das amplitudes<jupyter_code>n_bits = 16
max_level = 0.8 # Vamos assumir que isso seja em Volt
bins = np.linspace(-max_level, max_level, 2**n_bits)
print("Amplitude resolution {:.4f} [mV]".format(1000*(bins[1]-bins[0])))<jupyter_output>Amplitude resolution 0.0244 [mV]<jupyter_text>Usamos a função np.digitizeEla retorna um array com os índices em bins de cada amostra do sinal. Basicamente ela nos diz pra que valor cada amostra do sinal é quantizada.<jupyter_code># Use np.digitize
idx = np.digitize(xt, bins)
xt_qtz = max_level*(2*idx/(2**n_bits)-1)

Xw_qtz = np.fft.fft(xt_qtz)
Xw_qtz[Xw_qtz==0] = np.finfo(float).eps 
freq = np.linspace(0, (len(xt_qtz)-1)*fs/len(xt_qtz), len(xt_qtz))

fig, axs = plt.subplots(1, 3, gridspec_kw={'width_ratios': [10, 1, 4]}, figsize = (12, 4))
axs[0].plot(time, xt, '-b', linewidth = 1, label = 'original')
axs[0].plot(time, xt_qtz, '-r', linewidth = 1, label = 'quantizado')
axs[0].legend(loc = 'lower left')
axs[0].grid(linestyle = '--', which='both')
axs[0].set_xlabel('Tempo [s]')
axs[0].set_ylabel('Amplitude [-]')
axs[0].set_xlim((0, 0.005))
axs[0].set_ylim((-max_level, max_level))

axs[1].bar('dB', 50+20*np.log10(1/max_level), bottom = -50, color = 'silver')
axs[1].set_ylim((-50, 0))
axs[1].set_ylim((-50, 0))

axs[2].semilogx(freq, 20*np.log10(2*np.abs(Xw_qtz)/(len(xt_qtz))), '-r', linewidth = 1, label = 'spk quantizado')
#axs[2].semilogx(freq, 2*np.abs(Xw_qtz)/(len(xt_qtz)), '-r', linewidth = 1, label = 'spk quantizado')
axs[2].grid(linestyle = '--', which='both')
axs[2].set_xlabel('Frequência [Hz]')
axs[2].set_ylabel('Magnitude [dB]')
axs[2].set_xlim((100, fs/2))
axs[2].set_ylim((-50, 0))
plt.tight_layout()

ipd.Audio(xt_qtz, rate=fs) # load a NumPy array<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17495590828924162, 'fraction_numerical': 0.04056437389770723, 'mean_word_length': 6.054726368159204, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 16, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '331045', 'license': 'CC0-1.0', 'n_tokens_mistral': 1303, 'n_tokens_neox': 1212, 'n_words': 257, 'path': 'Aula 40 - quantizacao de dBFS/quantizacao.ipynb', 'repo_name': 'RicardoGMSilveira/codes_proc_de_sinais', 'size': '2835'}