Los números 0.495971679687500 y -0.488983154296875 significan que está leyendo su archivo wave con el tipo double
predeterminado. Estos no son valores reales sino las representaciones de coma flotante escaladas del tipo int16
(esa es la representación nativa de los datos en el archivo de onda). double
ocupa cuatro veces más espacio que int16
.
Según su información, el archivo de onda tiene datos de 16 bits. Cuando lees el archivo de onda, Matlab primero lo convierte en double
, luego lo normaliza entre -2 ^ 15 y 2 ^ 15-1, luego se vuelve a normalizar entre -1 y 1 para devolverte el resultado. Por ejemplo, si X_int16
es su valor int16
original, entonces matlab reescala esto de acuerdo con:
X_double=(1 - (-1))*(double(X_int16) -(-2^15))/(2^15 -1 -(-2^15) +1) +(-1);
La forma más fácil de ahorrar memoria es mediante el uso de wavread(data,'native')
, que devuelve datos int16
y ocupa 1/4 del espacio utilizado anteriormente. Este es el tipo de datos más eficiente que podría usar sin perder la fidelidad en su conjunto de datos.
- ¿Hay algún buen sitio web para aprender matemáticas avanzadas paso a paso?
- Cómo responder a las consultas de rango medio de manera eficiente
- ¿Cuántos dígitos de precisión pueden medir los experimentos físicos (PI)?
- Tengo un algoritmo iterativo que minimiza una cantidad dada en cada iteración (por lo que finalmente termina). ¿Cuál es la mejor manera de probar un límite superior en el número de iteraciones del algoritmo?
- ¿Cuáles son algunos de los documentos que debe leer sobre STOC, FOCS y SODA en los últimos 10 años sobre algoritmos de aproximación, algoritmos aleatorios y algoritmos en línea que introdujeron nuevas técnicas útiles?
Sin embargo, hay un problema con este enfoque. Matlab no permite el uso de ningún tipo que no sea double
o single
en estadísticas o algoritmos de señales (por ejemplo, FFT). Por lo tanto, debe usar al menos valores de punto flotante de precisión simple para analizar sus datos de audio. Convertir la precisión doble en precisión simple es sencillo, X_single=single(X_double)
, toma la mitad de la memoria utilizada por el tipo doble.
Si tiene acceso a la caja de herramientas de punto fijo, puede ‘posiblemente’ diseñar algoritmos específicos que funcionen con enteros para las funciones estadísticas / DSP. Pero eso es mucho trabajo. Usaría las ideas de segmentación discutidas a continuación para manejar la sobrecarga de memoria.
Editar resumen: inicialmente consideré los valores double
leídos por Matlab como los valores canónicos o ‘medidos’. Después de un poco de consideración, estaba claro que ese no era el caso, y matlab estaba reescalando los valores nativos. Aún le quedan unos 75 Mb por conjunto de datos, incluso si usa int16
. Por lo tanto, las observaciones anteriores sobre el análisis de los errores de cuantización siguen siendo válidas si desea comprimir el conjunto de datos a int8. Hay otras cuantificaciones óptimas o con pérdidas posibles (cuantización no uniforme), pero son un poco más sofisticadas.
Sus datos son principalmente ruido con vocalizaciones intermitentes. Por lo tanto, debería poder encontrar una manera de segmentar los datos (usando la detección de inicio / salida) a secuencias que solo contienen vocalizaciones y descartar los segmentos de ruido puro. Eso reducirá el tamaño bruto de los datos y le dará los conjuntos exactos que necesita para los algoritmos de clasificación. La segmentación del conjunto de datos no afecta a la STFT utilizada para obtener los espectrogramas (siempre que la frecuencia de muestreo sea coherente).
Estos conceptos están cubiertos en DSP básico (los textos de Oppenheim, etc / recursos en línea también son útiles). La única diferencia es que su aplicación requiere grandes conjuntos de datos.
También puede jugar con la memoria de almacenamiento dinámico Java utilizada por Matlab en la configuración.
Matlab tiene soporte nativo para grandes conjuntos de datos en 2014b Archivos grandes y Big Data