Skip to content

Instantly share code, notes, and snippets.

@ScrambledBits
Created July 4, 2024 07:46
Show Gist options
  • Save ScrambledBits/76f29a781dbb1fd964ff6d18f11b86b3 to your computer and use it in GitHub Desktop.
Save ScrambledBits/76f29a781dbb1fd964ff6d18f11b86b3 to your computer and use it in GitHub Desktop.
import numpy as np
import matplotlib.pyplot as plt
from pydub import AudioSegment
from typing import Tuple
def segmento_audio_a_array_numpy(
segmento_audio: AudioSegment,
) -> Tuple[np.ndarray, int]:
"""
Convierte un segmento de audio de pydub a un array numpy.
Args:
segmento_audio (AudioSegment): El segmento de audio a convertir.
Returns:
Tuple[np.ndarray, int]: Una tupla que contiene los datos de audio como un array numpy y la tasa de muestreo.
"""
muestras = np.array(segmento_audio.get_array_of_samples())
if segmento_audio.channels == 2:
muestras = muestras.reshape((-1, 2))
return muestras, segmento_audio.frame_rate
def main():
# Carga un archivo de audio MP3 y devuelve los datos muestreados y la tasa de muestreo.
audio = AudioSegment.from_mp3("sample.mp3")
datos_audio, tasa_muestreo = segmento_audio_a_array_numpy(audio)
# Asegúrate de que los datos de audio estén en punto flotante
datos_audio = datos_audio.astype(np.float32)
# Normaliza los datos de audio al rango [-1, 1]
datos_audio /= np.max(np.abs(datos_audio))
# Utiliza solo un canal del audio si es estéreo.
if datos_audio.ndim > 1:
datos_audio = datos_audio[:, 0]
# Define los tiempos de inicio y fin (en segundos) del segmento de audio a procesar.
tiempo_inicio_seg = 10
tiempo_fin_seg = 10.05
# Extrae el segmento del audio que se usará como señal moduladora y amplifícalo.
muestra_inicio = int(tiempo_inicio_seg * tasa_muestreo)
muestra_fin = int(tiempo_fin_seg * tasa_muestreo)
señal_moduladora = 4 * datos_audio[muestra_inicio:muestra_fin]
# Calcula la duración total del segmento de audio extraído.
tiempo_total = len(señal_moduladora) / tasa_muestreo
# Crea un vector de tiempo para la duración del segmento de audio.
vector_tiempo = np.linspace(0, tiempo_total, len(señal_moduladora), endpoint=False)
# Genera la señal portadora.
frecuencia_portadora = 5000 # Frecuencia de la portadora en Hz
señal_portadora = 3 * np.sin(2 * np.pi * frecuencia_portadora * vector_tiempo)
# Genera la señal de Amplitud Modulada (AM).
señal_am = (1 + señal_moduladora) * señal_portadora
# Grafica las señales portadora, moduladora y AM en la misma figura.
plt.figure()
plt.plot(vector_tiempo, 16 + señal_portadora, label="Señal Portadora")
plt.grid(True)
plt.ylim([-10, 19])
plt.xlabel("Tiempo (s)")
plt.ylabel("Amplitud")
plt.plot(vector_tiempo, 10 + señal_moduladora, "r", label="Señal Moduladora")
plt.plot(vector_tiempo, señal_am, "k", linewidth=1, label="Señal AM")
plt.legend()
plt.show()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment