
Concatenar Datos
Publicado por Mohammed (5 intervenciones) el 07/02/2015 21:08:41
Ante todo agradeceros el tiempo invertido en leer mi pregunta.
Estoy trabajando en un software para procesado de audio en tiempo REAL en C++ con la herramienta QT. Necesito que los tiempos de computo de cada uno de los procesos que realizo sean minimizados por lo que ando optimizando cada una de las líneas de código.
Definiendo un buffer temporal de 40ms , al lanzar nuestro dispositivo con una frecuencia de muestreo de Fs=8000Hz, cada 320 muestras entramos en un función ProcesarDatos().
La idea es disponer de un buffer global que almacena los ultimos 10s grabados, es decir, de 80000 muestras. Este Buffer en cada iteración libera las 320 muestras iniciales y enlaza al final las 320 muestras nuevas. De esta forma el buffer es actualizado y el usuario puede observar en tiempo real la representación gráfica de la señal grabada.
En un principio he pensado en utilizar QVector (equivalente a std::vector pero para la herramienta QT) para esta implementación, con ello reducimos el proceso a pocas lineas de codigo:
En cada iteración creamos un vector de 80000 muestras ademas de liberar algunas posiciones por lo que requiere de cierto tiempo de procesado. Una alternativa por la que opte, fue el uso de double[], y iteraciones con un bucle for:
Tampoco presenta buenos resultados. Creo que la mejor forma es el uso de memoria dinámica. Implementar este proceso mediante punteros. ¿Alguien podría darme alguna idea de como implementarlo?
Estoy trabajando en un software para procesado de audio en tiempo REAL en C++ con la herramienta QT. Necesito que los tiempos de computo de cada uno de los procesos que realizo sean minimizados por lo que ando optimizando cada una de las líneas de código.
Definiendo un buffer temporal de 40ms , al lanzar nuestro dispositivo con una frecuencia de muestreo de Fs=8000Hz, cada 320 muestras entramos en un función ProcesarDatos().
La idea es disponer de un buffer global que almacena los ultimos 10s grabados, es decir, de 80000 muestras. Este Buffer en cada iteración libera las 320 muestras iniciales y enlaza al final las 320 muestras nuevas. De esta forma el buffer es actualizado y el usuario puede observar en tiempo real la representación gráfica de la señal grabada.
En un principio he pensado en utilizar QVector (equivalente a std::vector pero para la herramienta QT) para esta implementación, con ello reducimos el proceso a pocas lineas de codigo:
1
2
3
int NUM_POINTS=320;
DatosTemporales.erase(DatosTemporales.begin(),DatosTemporales.begin()+NUM_POINTS);
DatosTemporales+= (DatosNuevos); // Datos Nuevos con un tamaño de NUM_POINTS
En cada iteración creamos un vector de 80000 muestras ademas de liberar algunas posiciones por lo que requiere de cierto tiempo de procesado. Una alternativa por la que opte, fue el uso de double[], y iteraciones con un bucle for:
1
2
3
4
5
6
7
8
9
for(int i=0;i<80000;i++){
if(i<80000-NUM_POINTS){
aux=DatosTemporales[i];
DatosTemporales[i+NUM_POINTS]=aux;
}else{
DatosTemporales[i]=DatosNuevos[i-NUN_POINTS];
}
}
Tampoco presenta buenos resultados. Creo que la mejor forma es el uso de memoria dinámica. Implementar este proceso mediante punteros. ¿Alguien podría darme alguna idea de como implementarlo?
Valora esta pregunta


0