Ejercicio obligatorio 3
Fecha de entrega: Domingo 14 de junio
Introducción
Se tiene un tramo de audio que caracteriza un muestreo como los ya desarrollados en el EJ2, los mismos se quieren encapsular en estructuras del lenguaje C y construir una pequeña biblioteca para manejarlos.
Trabajo
Teniendo definida la estructura tramo_t
que almacena tramos de audio
typedef struct {
float *v;
size_t n;
double t0;
int f_m;
} tramo_t;
donde v
representa el vector de muestras de longitud n
,
t0
el instante inicial y f_m
la frecuencia de muestreo.
Se pide implementar una función auxiliar interna del módulo
tramo_t *_tramo_crear(double t0, double tf, int f_m);
que cree un tramo que pueda almacenar entre t0
y tf
muestreando
a una frecuencia f_m
sin inicializar el contenido de los elementos del
vector tramo->v
.
Se pude implementar una función void tramo_destruir(tramo_t *t);
que
libere la memoria asociada al tramo t
.
Se pide implementar una función
tramo_t *tramo_clonar(const tramo_t *t);
que genere una copia del tramo t
recibido, en memoria completamente
nueva.
Se pide implementar una función
tramo_t *tramo_crear_muestreo(double t0, double tf, int f_m, float f, float a, const float fa[][2], size_t n_fa);
que cree un tramo nuevo muestreando entre el intervalo t0
y el
tf
a una frecuencia de muestreo f_m
la nota dada por la
frecuencia fundamental f
, amplitud a
y los armónicos fa
de
longitud n_fa
.
Se pide implementar una función
bool tramo_redimensionar(tramo_t *t, double tf);
que dado un tramo
t
y un tiempo final tf
redimensione el tramo a ese tiempo. Si
el nuevo tamaño fuera mayor que el anterior se deben completar con ceros las
nuevas muestras. En caso de falla la función devolverá false
sin
modificar el tramo recibido.
Se pide implementar una función
bool tramo_extender(tramo_t *destino, const tramo_t *extension);
que sume el tramo extension
sobre el tramo destino
. Se exige
que destino->t0 <= extension->t0
. Ambos tramos
pueden superponerse o no, total o parcialmente. Por simplicidad sólo se pueden
sumar tramos que tengan la misma frecuencia de muestreo (ver Obs.2). Si la operación es
satisfactoria se debe devolver true
, y false
en caso contrario.
Observación 1: Notar que los tramos a sumar pueden coincidir total,
parcialmente o ser totalmente disjuntos. El tramo resultante irá desde el
\(t_0\) del tramo destino
y tendrá tantas muestras como para que
entre el mayor \(t_{n-1}\) entre destino
y extension
. En el
caso de que haya espacios vacíos entre tramo y tramo los mismos serán
completados con ceros.
Observación 2: Se puede suponer que todos los tiempos \(t\) están en unidades de \(f_m\), es decir, que \(t_0\) y \(t_f\) son tales que \(t = \frac i{f_m}\) siendo \(i\) un valor entero.
Consideraciones generales
A esta altura del desarrollo del cuatrimestre se espera que el alumno:
Realice pruebas no interactivas apropiadas para verificar el funcionamiento de las funciones desarrolladas. Estas pruebas si bien no tienen que ser exhaustivas deben cubrir un par de casos particulares, como por ejemplo testear que se puedan sumar ondas tanto superpuestas como disjuntas.
Sea capaz de identificar dónde pueden reutilizarse funciones del EJ1 y del EJ2 e incluir dichas funciones como parte de este trabajo sin volver a desarrollar dichas funcionalidades, llamando a las mismas desde las funciones nuevas.
Sea capaz de identificar dónde pueden reutilizarse funciones mismas de este ejercicio.
Entregar un programa que compile correctamente y sin advertencias (se recomienda el uso de
-Werror
en el GCC) y correr sin pérdidas de memoria (se exige el uso de Valgrind).
Entrega
Deberán entregarse el/los código/s fuente/s desarrollado/s.
La entrega se realiza a través del sistema de entregas.
El ejercicio es de entrega individual.