2010-01-14 9 views
9

Quería graficar la forma de onda del archivo .wav para el ancho de trazado específico.Trazado de la forma de onda del archivo .wav

¿Qué método debo usar para mostrar el diagrama de forma de onda correcto?

alguna sugerencia, tutorial, enlaces son bienvenidos ....

+0

¿Por qué en C++ sin embargo? –

Respuesta

16

algoritmo básica:

  1. número Búsqueda de muestras para encajar en empate-ventana
  2. Determine cuántas muestras debe ser presentado por cada píxel
  3. Calcular RMS (o pico) valor para cada píxel desde un bloque de muestra. Promediar no funciona para señales de audio.
  4. Dibuja los valores.

Supongamos que n (número de muestras) = ​​44.100, w (anchura) = 100 píxeles:

entonces cada pixel debe representar 44100/100 == 441 muestras (Blocksize)

for (x = 0; x < w; x++) 
    draw_pixel(x_offset + x, 
       y_baseline - rms(&mono_samples[x * blocksize], blocksize)); 

la materia a tratar para diferentes visual aparece:

  • rms vs valor máximo desde el bloque
  • superposición b bloqueos (tamaño de bloque x, pero avance x/2 para cada píxel, etc.)

La disminución de la resolución probablemente no funcionaría ya que se perdería la información máxima.

+0

¿qué hacer en el caso de los estereofónicos? – Ashish

+1

Las muestras estéreo suelen estar intercaladas, por lo que solo toma muestras pares/impares de la matriz de muestra. Trace una forma de onda/canal. – kauppi

2

Casi cualquier tipo de trazado es específica de la plataforma. Dicho esto, los archivos .wav se usan con mayor frecuencia en Windows, por lo que es probable que también esté interesado (o exclusivamente) en el código para Windows. En este caso, depende principalmente de sus requisitos de velocidad. Si desea una pantalla bastante estática, puede dibujar con MoveTo y (principalmente) LineTo. Si eso no es lo suficientemente rápido, puede obtener una pequeña velocidad de usando algo como PolyLine.

Si lo quiere mucho más rápido, es probable que su mejor opción sea utilizar algo como gráficos OpenGL o DirectX. Cualquiera de estos hace la mayoría del trabajo real en la tarjeta gráfica. Dado que está hablando de dibujar un gráfico de ondas de sonido, incluso una tarjeta gráfica de bajo rendimiento con poco o ningún trabajo para optimizar el dibujo probablemente se mantendrá con bastante facilidad con casi cualquier cosa que sea probable que le arroje.

Editar: En lo que se refiere a la lectura del archivo .wav, the format es bastante simple. La mayoría de los archivos .wav son muestras PCM sin comprimir, por lo que su extracción es una simple cuestión de leer los encabezados para determinar el tamaño de muestra y la cantidad de canales, y luego escalar los datos para que quepan en su ventana.

Edit2: Tiene un par de opciones para manejar los canales izquierdo y derecho. Una es dibujarlos en dos trazados separados, típicamente uno sobre el otro. Otra es dibujarlos superpuestos, pero en diferentes colores. Lo que es más adecuado depende de lo que esté tratando de lograr: si se trata de lucir genial, una trama superpuesta y multicolor probablemente funcionará bien. Si desea permitir que el usuario realmente examine lo que hay en detalle, probablemente querrá dos trazados separados.

+0

He analizado el archivo wav. Pero no sé si promediaré las muestras de tamaño de ventana en un solo valor. Cómo manejar los valores de muestra del canal izquierdo y derecho. – Ashish

+0

No he agregado nada acerca de cómo reducir la muestra, porque me parece que Kauppi ya lo ha cubierto bastante razonablemente. –

0

¿Qué quiere decir exactamente con una forma de onda? ¿Está tratando de trazar el nivel de los componentes de frecuencia en la señal a.k.a el espectro, más comúnmente visto en visualizadores musci, estéreos de automóvil, boomboxes? Si es así, debe usar Fast Fourier Transform. FFT es una técnica estándar para dividir una señal de dominio de tiempo en sus frecuencias individuales. Hay toneladas de buenas rutinas de biblioteca FFT disponibles.

En C++, puede usar la biblioteca openFrameworks para configurar un reproductor de música para wav, extraer la FFT y dibujarla.

También puede usar Processing con la biblioteca Minim para hacer lo mismo. Lo he intentado y es bastante sencillo.

El procesamiento incluso tiene soporte para OpenGL y es fácil de usar.

3

O usa RMS, BlockSize depende de lo lejos que esté acercando el zoom!

float RMS = 0; 
for (int a = 0; a < BlockSize; a++) 
{ 
    RMS += Samples[a]*Samples[a]; 
} 
RMS = sqrt(RMS/BlockSize); 

o Min/Max (esto es lo que Cool Edit/Audtion Usos)

float Max = -10000000; 
float Min = 1000000; 
for (int a = 0; a < BlockSize; a++) 
{ 
    if (Samples[a] > Max) Max = Samples[a]; 
    if (Samples[a] < Min) Min = Samples[a]; 
} 
+1

al evaluar 'Min' y' Max', considere usar 'Samples [0]' como valor inicial para estas variables –

Cuestiones relacionadas