Created
July 4, 2024 07:46
-
-
Save ScrambledBits/76f29a781dbb1fd964ff6d18f11b86b3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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