Sesión 1: Fundamentos de Tratamiento Digital de Audio PDF

Document Details

ChivalrousPlutonium8456

Uploaded by ChivalrousPlutonium8456

Universidad Politécnica de Madrid

Tags

tratamiento digital de audio señales de audio procesamiento de audio ciencia de datos

Summary

Este documento es un cuaderno de laboratorio de Google Colab que explica los fundamentos del procesamiento digital de audio. Se centra en el análisis de señales de voz y música, incluyendo la identificación de formantes y la visualización de espectrogramas. El texto incluye código Python para ilustrar los conceptos.

Full Transcript

23/10/24 9:36 código.ipynb - Colab keyboard_arrow_down Sesión 1: Fundamentos de tratamiento digital de audio Objetivos de la sesión Analizar señales de voz y música en el dominio temporal y frecuencial. Id...

23/10/24 9:36 código.ipynb - Colab keyboard_arrow_down Sesión 1: Fundamentos de tratamiento digital de audio Objetivos de la sesión Analizar señales de voz y música en el dominio temporal y frecuencial. Identificar formantes en vocales y consonantes. Visualizar espectrogramas de palabras o frases. Introducir la Transformada de Fourier de Tiempo Corto (TFL o STFT). Realizar ejemplos prácticos de análisis y síntesis de audio. keyboard_arrow_down 1. Configuración del entorno En esta sección, importaremos las librerías necesarias para el procesamiento y análisis de señales de audio. # Conectar Drive con Google Colab from google.colab import drive drive.mount('/content/drive') Mounted at /content/drive !cp -r /content/drive/MyDrive/Fundamentos_RTVE/Ejercicios/Sistema_Auditivo_humano_1/* /content cp: cannot stat '/content/drive/MyDrive/Fundamentos_RTVE/Ejercicios/Sistema_Auditivo_humano_1/*': No s import numpy as np # matrices import matplotlib.pyplot as plt from scipy.io import wavfile from scipy import signal, interpolate from scipy.signal import find_peaks from IPython.display import Audio import librosa import librosa.display %matplotlib inline keyboard_arrow_down 2. Señales de audio Las señales de audio son variaciones en la presión del aire que podemos capturar y representar digitalmente. En el ámbito digital, estas señales son funciones discretas que varían en el tiempo y pueden ser analizadas y procesadas mediante diversas técnicas matemáticas y computacionales. Voz humana La voz humana es una fuente rica y compleja de señales de audio. Se genera por la vibración de las cuerdas vocales y es modulada por el tracto vocal (boca, lengua, labios). Esto resulta en sonidos con una combinación de frecuencias fundamentales, armónicos y formantes: Frecuencia Fundamental (F0): Es la frecuencia más baja de una onda periódica y determina el tono percibido de la voz. Armónicos: Son múltiplos enteros de la frecuencia fundamental y contribuyen al timbre de la voz. Formantes: Son picos en el espectro de frecuencias que corresponden a resonancias en el tracto vocal. Cada vocal y consonante tiene una configuración única de formantes, lo que nos permite distinguirlos. Música https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 1/22 23/10/24 9:36 código.ipynb - Colab Las señales musicales también son complejas y varían dependiendo del instrumento y la técnica de ejecución. Los instrumentos musicales generan sonidos con patrones de frecuencias específicos, incluyendo: Frecuencia Fundamental: Determina la nota que escuchamos. Armónicos y Sobretonos: Contribuyen al timbre y caracterizan el sonido único de cada instrumento. Envolventes Temporales: Definen cómo evoluciona el sonido en el tiempo (ataque, decaimiento, sostenimiento, liberación). keyboard_arrow_down 2.1 Ejemplo de archivos # Audio de voz Audio('i_pink_trombone.wav') 0:00 / 0:02 # Audio de voz Audio('cantante.wav') 0:00 / 0:11 # Audio de música Audio('guitarra.wav') 0:00 / 0:10 # Audio de música Audio('campana-tubular.wav') 0:00 / 0:04 keyboard_arrow_down 2.2 Análisis temporal de vocales sueltas # Cargamos las vocales data_a, fs_a = librosa.load('a_pink_trombone.wav', sr=44100) data_a = librosa.util.normalize(data_a) # lo normalizamos entre -1 y 1 para que se vea bien data_e, fs_e = librosa.load('e_pink_trombone.wav', sr=44100) data_e = librosa.util.normalize(data_e) data_i, fs_i = librosa.load('i_pink_trombone.wav', sr=44100) data_i = librosa.util.normalize(data_i) data_o, fs_o = librosa.load('o_pink_trombone.wav', sr=44100) data_o = librosa.util.normalize(data_o) data_u, fs_u = librosa.load('u_pink_trombone.wav', sr=44100) data_u = librosa.util.normalize(data_u) def visualizar_forma_de_onda(data, fs, vocal=''): plt.figure(figsize=(10, 4)) librosa.display.waveshow(data, sr=fs) plt.title(f'Visualización de la vocal {vocal}') https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 2/22 23/10/24 9:36 código.ipynb - Colab plt.show() def visualizar_forma_de_onda_con_zoom(data, fs, posicion_zoom=1, vocal=''): plt.figure(figsize=(10, 4)) librosa.display.waveshow(data, sr=fs, max_points=10_000_000) plt.title(f'Visualización de la vocal {vocal}') plt.xlim(posicion_zoom, posicion_zoom+0.05) # Zoom en los primeros 0.01 segundos plt.ylim(-1, 1) # Rango de amplitud plt.show() visualizar_forma_de_onda(data_a, fs_a, 'a') visualizar_forma_de_onda_con_zoom(data_a, fs_a, vocal='a') # @title def visualizar_todas_las_vocales(): fig, axs = plt.subplots(5, 1, figsize=(10, 12)) # 5 filas, 1 columna vocales = [('a', data_a, fs_a), ('e', data_e, fs_e), ('i', data_i, fs_i), ('o', data_o, fs_o), ('u', d for i, (vocal, data, fs) in enumerate(vocales): axs[i].set_title(f'Visualización de la vocal {vocal}') librosa.display.waveshow(data, sr=fs, ax=axs[i], max_points=1000000) axs[i].set_xlim(1, 1.05) # Zoom en los primeros 0.05 segundos axs[i].set_ylim(-1, 1) # Rango de amplitud https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 3/22 23/10/24 9:36 código.ipynb - Colab axs[i].set_xlabel('Tiempo (s)') axs[i].set_ylabel('Amplitud') plt.tight_layout() # Ajusta el espacio entre subplots plt.show() visualizar_todas_las_vocales() https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 4/22 23/10/24 9:36 código.ipynb - Colab keyboard_arrow_down 2.3 Análisis temporal de vocales concatenadas https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 5/22 23/10/24 9:36 código.ipynb - Colab data_vocales, fs_data_vocales = librosa.load('ieaou_pink_trombone.wav', sr=44100) data_vocales = librosa.util.normalize(data_vocales) # lo normalizamos entre -1 y 1 para que se vea bien visualizar_forma_de_onda(data_vocales, fs_data_vocales) visualizar_forma_de_onda_con_zoom(data_vocales, fs_data_vocales, posicion_zoom=3.8) # posiciones 0.6; 2.0; keyboard_arrow_down 2.3 Análisis frecuencial de vocales # Función para calcular el espectro logarítmico def calcular_espectro_logaritmico(data, fs, n_points=None, n_freq_bins=1000): if n_points is None: n_points = len(data) # Cálculo del espectro original spectrum_voice = np.abs(np.fft.rfft(data, n=n_points)) frequencies_voice = np.fft.rfftfreq(n_points, d=1/fs) # Crear una escala de frecuencias logarítmica log_frequencies = np.geomspace(20, fs/2, num=n_freq_bins) # Interpolar el espectro a la escala logarítmica interpolator = interpolate.interp1d(frequencies_voice, 20 * np.log10(spectrum_voice), kind='linear', https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 6/22 23/10/24 9:36 código.ipynb - Colab spectrum_log = interpolator(log_frequencies) return log_frequencies, spectrum_log # Función para calcular y visualizar el espectro de una señal de voz def visualizar_espectro(data, fs, vocal, n_points=None): if n_points is None: n_points = len(data) # Usar la longitud original de la señal si no se especifican puntos # Cálculo del espectro con un número ajustable de puntos log_frequencies, spectrum_log = calcular_espectro_logaritmico(data, fs, n_points, n_points) # Visualización del espectro plt.figure(figsize=(12, 8)) plt.semilogx(log_frequencies,spectrum_log) plt.title(f'Espectro de la vocal {vocal}') plt.xlabel('Frecuencia [Hz]') plt.ylabel('Magnitud [dB]') plt.xlim(20, fs/2) plt.grid(True, which='both', ls='--', lw=0.5) plt.show() def calcular_espectro_lineal(data, fs, n_points=None, n_freq_bins=1000): if n_points is None: n_points = len(data) # Cálculo del espectro original spectrum_voice = np.abs(np.fft.rfft(data, n=n_points)) frequencies_voice = np.fft.rfftfreq(n_points, d=1/fs) # Crear una escala de frecuencias lineal linear_frequencies = np.linspace(20, fs/2, num=n_freq_bins) # Interpolar el espectro a la escala lineal interpolator = interpolate.interp1d(frequencies_voice, 20 * np.log10(spectrum_voice), kind='linear', spectrum_linear = interpolator(linear_frequencies) return linear_frequencies, spectrum_linear # Función para calcular y visualizar el espectro de una señal de voz def visualizar_espectro_lineal(data, fs, vocal, n_points=None): if n_points is None: n_points = len(data) # Usar la longitud original de la señal si no se especifican puntos # Cálculo del espectro con un número ajustable de puntos linear_frequencies, spectrum_linear = calcular_espectro_lineal(data, fs, n_points, n_points) # Visualización del espectro plt.figure(figsize=(12, 8)) plt.plot(linear_frequencies, spectrum_linear) plt.title(f'Espectro de la vocal {vocal} en escala lineal') plt.xlabel('Frecuencia [Hz]') plt.ylabel('Magnitud [dB]') plt.xlim(20, fs/2) plt.grid(True, which='both', ls='--', lw=0.5) plt.show() Por aquí nos quedamos, más o menos # Ejemplo de uso: Visualizar el espectro de la vocal "a" con más resolución visualizar_espectro(data_i, fs_i, 'i', n_points=4096) # ¿Qué pasa cuando cambio los puntos? https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 7/22 23/10/24 9:36 código.ipynb - Colab visualizar_espectro_lineal(data_a, fs_a, 'a', n_points=4096) # ¿Cuáles son las diferencias con respecto del logaritmico? https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 8/22 23/10/24 9:36 código.ipynb - Colab # Función para visualizar todos los espectros en una escala logarítmica de frecuencias def visualizar_espectros_todas_las_vocales_log(n_points=None, n_freq_bins=500): vocales = [('a', data_a, fs_a), ('e', data_e, fs_e), ('i', data_i, fs_i), ('o', data_o, fs_o), ('u', d fig, axs = plt.subplots(5, 1, figsize=(12, 24)) # 5 filas, 1 columna for i, (vocal, data, fs) in enumerate(vocales): log_frequencies, spectrum_log = calcular_espectro_logaritmico(data, fs, n_points, n_freq_bins) # Visualización del espectro en el subplot correspondiente axs[i].semilogx(log_frequencies, spectrum_log) axs[i].set_title(f'Espectro logarítmico de la vocal {vocal}') axs[i].set_xlim(20, fs/2) axs[i].set_ylabel('Magnitud [dB]') axs[i].grid(True, which='both', ls='--', lw=0.5) # Etiquetas de los ejes solo para el último subplot axs[-1].set_xlabel('Frecuencia [Hz]') plt.tight_layout() # Ajusta el espacio entre subplots plt.show() # Ejemplo de uso: Visualizar espectros de todas las vocales en escala logarítmica visualizar_espectros_todas_las_vocales_log(n_points=4096) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 9/22 23/10/24 9:36 código.ipynb - Colab https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 10/22 23/10/24 9:36 código.ipynb - Colab https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 11/22 23/10/24 9:36 código.ipynb - Colab En esta imagen podemos ver dónde debería encontrarse (más o menos) cada formante en función de la vocal. Los formantes F1 y F2 de las cinco vocales españolas se encuentran en diferentes rangos de frecuencia, ya que estos están relacionados con la apertura de la cavidad vocal (F1) y la posición de la lengua (F2). Aunque los valores exactos varían de persona a persona y según las características individuales del hablante, se pueden dar rangos aproximados para cada vocal. Aquí te doy los rangos aproximados de los formantes F1 y F2 para las cinco vocales españolas: 1. /a/ F1: 700 - 900 Hz (alta apertura) F2: 1100 - 1300 Hz (posterior media) 2. /e/ F1: 400 - 600 Hz (media apertura) F2: 1700 - 2000 Hz (anterior media) 3. /i/ F1: 200 - 400 Hz (baja apertura) F2: 2100 - 2700 Hz (anterior alta) 4. /o/ F1: 400 - 600 Hz (media apertura) F2: 800 - 1000 Hz (posterior media) 5. /u/ F1: 200 - 400 Hz (baja apertura) F2: 600 - 900 Hz (posterior alta) Resumen visual: Vocal F1 (Hz) F2 (Hz) /i/ 200-400 2100-2700 /e/ 400-600 1700-2000 /a/ 700-900 1100-1300 /o/ 400-600 800-1000 https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 12/22 23/10/24 9:36 código.ipynb - Colab Vocal F1 (Hz) F2 (Hz) /u/ 200-400 600-900 Estos valores se utilizan comúnmente como referencias en estudios de fonética acústica, y aunque puede haber cierta variación individual, siguen patrones consistentes entre hablantes del español. # Avanzado! Sistema para detectar la f0 f0 = librosa.yin(data_a, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7')) print(np.mean(f0)) 83.89125374528899 # Hazlo con tu voz # 1. Graba una vocal, intenta no poner una voz rara, lo más parecido a como hablas ## Puedes hacerlo en audacity, grabadora de sonidos o aquí: https://online-voice-recorder.com/es/ # 2. Súbelo al content de google colab, en el lado izquierdo de la pantalla # 3. Cárgalo como hemos hecho hasta ahora: # data_personal, fs_personal = librosa.load('mivoz.mp3', sr=44100) # data_personal = librosa.util.normalize(data_personal) # lo normalizamos entre -1 y 1 para que se vea bie # 4. ¡Calcula! ¿Qué f0 tienes? ¿Te cuadra con tu espectro? # f0 = librosa.yin(data_personal, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7')) # print(np.mean(f0)) # ¿Podemos hacer esto con la combinación de vocales? visualizar_espectro(data_vocales, fs_data_vocales, 'combinación', n_points=4098) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 13/22 23/10/24 9:36 código.ipynb - Colab keyboard_arrow_down 2.4 Análisis tiempo-frecuencia de vocales def calcular_espectrograma(data, fs, n_fft=1024, hop_length=512): S = np.abs(librosa.stft(data, n_fft=n_fft, hop_length=hop_length, window='hann')) S_db = librosa.amplitude_to_db(S, ref=np.max) return S_db # Función para visualizar el espectrograma en diferentes escalas def visualizar_espectrograma(data, fs, vocal, escala='lineal', n_fft=1024, hop_length=512): if escala == 'mel': # Calcular el espectrograma en escala Mel S_mel = librosa.feature.melspectrogram(y=data, sr=fs, n_fft=n_fft, hop_length=hop_length) S_mel_db = librosa.power_to_db(S_mel, ref=np.max) plt.figure(figsize=(12, 6)) librosa.display.specshow(S_mel_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis='mel', cma plt.colorbar(format='%+2.0f dB') plt.title(f'Espectrograma Mel de la vocal {vocal}') plt.show() else: # Calcular el espectrograma en escala lineal o logarítmica S_db = calcular_espectrograma(data, fs, n_fft, hop_length) plt.figure(figsize=(12, 6)) if escala == 'lineal': librosa.display.specshow(S_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis='hz', cmap= plt.ylim(0, fs/2) # Limitar a la frecuencia de Nyquist https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 14/22 23/10/24 9:36 código.ipynb - Colab elif escala == 'log': librosa.display.specshow(S_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis='log', cma plt.ylim(20, fs/2) plt.colorbar(format='%+2.0f dB') plt.title(f'Espectrograma de la vocal {vocal} ({escala})') plt.show() # Función para visualizar los espectrogramas de todas las vocales def visualizar_espectrogramas_todas_las_vocales(escala='lineal', n_fft=1024, hop_length=512): vocales = [('a', data_a, fs_a), ('e', data_e, fs_e), ('i', data_i, fs_i), ('o', data_o, fs_o), ('u', d fig, axs = plt.subplots(5, 1, figsize=(12, 32)) # 5 filas, 1 columna for i, (vocal, data, fs) in enumerate(vocales): if escala == 'mel': # Calcular el espectrograma en escala Mel S_mel = librosa.feature.melspectrogram(y=data, sr=fs, n_fft=n_fft, hop_length=hop_length) S_mel_db = librosa.power_to_db(S_mel, ref=np.max) img = librosa.display.specshow(S_mel_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis= else: S_db = calcular_espectrograma(data, fs, n_fft, hop_length) if escala == 'lineal': img = librosa.display.specshow(S_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis= axs[i].set_ylim(0, fs/2) elif escala == 'log': img = librosa.display.specshow(S_db, sr=fs, hop_length=hop_length, x_axis='time', y_axis= axs[i].set_ylim(20, fs/2) axs[i].set_title(f'Espectrograma de la vocal {vocal} ({escala})') # fig.colorbar(img, ax=axs, format='%+2.0f dB') # plt.tight_layout() plt.show() # Banda ancha visualizar_espectrograma(data_o, fs_o, 'o', escala='mel', n_fft=512, hop_length=128) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 15/22 23/10/24 9:36 código.ipynb - Colab /usr/local/lib/python3.10/dist-packages/librosa/feature/spectral.py:2143: UserWarning: Empty filters d mel_basis = filters.mel(sr=sr, n_fft=n_fft, **kwargs) # Banda estrecha visualizar_espectrograma(data_i, fs_i, 'i', escala='log', n_fft=4096, hop_length=1024) En general, los valores de n_fft y hop_length para espectrogramas de banda ancha y estrecha son los siguientes: Espectrograma de Banda Ancha: https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 16/22 23/10/24 9:36 código.ipynb - Colab n_fft: Bajo, ya que queremos tener buena resolución temporal pero sacrificamos resolución en frecuencia. Un valor común es: n_fft = 256 o n_fft = 512 hop_length: Relativamente pequeño en comparación con n_fft para tener una buena superposición de ventanas y mejor resolución temporal. Algunos ejemplos son: hop_length = 64 o hop_length = 128 Espectrograma de Banda Estrecha: n_fft: Alto, ya que buscamos una buena resolución en frecuencia, aunque se pierde resolución temporal. Algunos valores típicos son: n_fft = 2048 o n_fft = 4096 hop_length: Mayor en proporción a n_fft para permitir observar más claramente los detalles en frecuencia, como armónicos: hop_length = 512 o hop_length = 1024 Los valores específicos pueden variar dependiendo de las características de los datos y lo que busques observar, pero estos son buenos puntos de partida. # Aquí sí que podemos interpretrar algo mejor visualizar_espectrograma(data_vocales, fs_data_vocales, 'vocales', escala='mel', n_fft=4096, hop_length=102 # Vamos a probar con un cantante que parece que desafina data_cantante, fs_cantante = librosa.load('cantante.wav', sr=44100) data_cantante = librosa.util.normalize(data_cantante) # lo normalizamos entre -1 y 1 para que se vea bien visualizar_forma_de_onda(data_cantante, fs_cantante) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 17/22 23/10/24 9:36 código.ipynb - Colab # Vamos a responder esto todos. ¿Qué vemos aquí? visualizar_espectrograma(data_cantante, fs_cantante, 'cantante', escala='mel', n_fft=1024, hop_length=128) Audio('cantante.wav') 0:00 / 0:11 keyboard_arrow_down 2.5 Análisis con música Audio('guitarra.wav') # fijaos que da dos acordes y que tiene golpe y chasquido https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 18/22 23/10/24 9:36 código.ipynb - Colab 0:00 / 0:10 data_guitarra, fs_guitarra = librosa.load('guitarra.wav', sr=44100) data_guitarra = librosa.util.normalize(data_guitarra) # lo normalizamos entre -1 y 1 para que se vea bien visualizar_forma_de_onda(data_guitarra, fs_guitarra) visualizar_forma_de_onda_con_zoom(data_guitarra, fs_guitarra) # Antes de verlo, ¿Cómo deberíamos detectar mejor el golpeo, con banda ancha o estrecha? # ¿Cómo deberíamos detectar mejor los acordes? visualizar_espectrograma(data_guitarra, fs_guitarra, 'guitarra', escala='log', n_fft=512, hop_length=128) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 19/22 23/10/24 9:36 código.ipynb - Colab Audio('campana-tubular.wav') # tiene reverb y sospecho que trémolo 0:00 / 0:04 data_campana, fs_campana = librosa.load('campana-tubular.wav', sr=44100) data_campana = librosa.util.normalize(data_campana) # lo normalizamos entre -1 y 1 para que se vea bien visualizar_forma_de_onda(data_campana, fs_campana) visualizar_forma_de_onda_con_zoom(data_campana, fs_campana) https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 20/22 23/10/24 9:36 código.ipynb - Colab # Antes de verlo, ¿Cómo deberíamos detectar mejor el reverb o el trémolo, con banda ancha o estrecha? # ¿Cómo deberíamos detectar mejor la nota que ha dado? visualizar_espectrograma(data_campana, fs_campana, 'campana', escala='log', n_fft=4096, hop_length=1024) keyboard_arrow_down 2.6 Locuras varias from scipy.signal import butter, lfilter # Función para aplicar un filtro paso alto def filtro_paso_alto(data, sr, cutoff=1000, order=5): nyquist = 0.5 * sr # Frecuencia de Nyquist normal_cutoff = cutoff / nyquist # Normalizar la frecuencia de corte b, a = butter(order, normal_cutoff, btype='high', analog=False) # Filtro paso alto y_filtered = lfilter(b, a, data) # Aplicar el filtro a la señal return y_filtered https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 21/22 23/10/24 9:36 código.ipynb - Colab # Función para aplicar un filtro paso bajo def filtro_paso_bajo(data, sr, cutoff=1000, order=5): nyquist = 0.5 * sr # Frecuencia de Nyquist normal_cutoff = cutoff / nyquist # Normalizar la frecuencia de corte b, a = butter(order, normal_cutoff, btype='low', analog=False) # Filtro paso bajo y_filtered = lfilter(b, a, data) # Aplicar el filtro a la señal return y_filtered # filtrar algunas de las frecuencias data_filtrada_alta = filtro_paso_alto(data_cantante, sr=44100, cutoff=5000) Audio(data_filtrada_alta, rate=44100) 0:00 / 0:11 visualizar_espectrograma(data_filtrada_alta, 44100, 'data_filtrada_alta', escala='log', n_fft=4096, hop_le data_filtrada_baja = filtro_paso_bajo(data_cantante, sr=44100, cutoff=200) Empieza a programar o a crear código con IA. Audio(data_filtrada_baja, rate=44100) 0:00 / 0:11 visualizar_espectrograma(data_filtrada_baja, 44100, 'data_filtrada_alta', escala='log', n_fft=4096, hop_len https://colab.research.google.com/drive/1s_T9hfNY5Axc3Yqry_80vZ8yhyrG5oan#scrollTo=zdcjyfWTsVqc&printMode=true 22/22

Use Quizgecko on...
Browser
Browser