Pregunta

cartel primera vez aquí.

Una pregunta rápida sobre la configuración de un bucle aquí. Quiero configurar un bucle por primera 1/3 del bucle principal que aumentará un valor de 0,00001 o similar a 1. Así que puedo utilizar para multiplicar una variable de muestra a fin de crear un fundido de entrada en esta simple rutina de la reproducción de archivos de audio.

Hasta ahora ha resultado ser un poco de un rascador de cabeza, cualquier ayuda greatfully recibió.

for(i=0; i < end && !feof(fpin); i+=blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 
    frames = samples; 
    for(j=0; j < frames; j++)
    {   
        for (f = 0; f< frames/3 ;f++)
        {
            fade = fade--;
        } 
    output[j] = audioblock[j]/fade;
    }

    fwrite(output,sizeof(short), frames, fpoutput); 
} 

Disculpas, Hasta ahora he leído y re-escribir el archivo correctamente. Mi problema es que estoy tratando de encontrar una manera de bucle de la variable 'fade' por lo que aumenta o disminuye a 1, por lo que puedo modificar la variable de salida.

lo que quería hacer esto en digamos 3 etapas: 1. De 0 a cuadros / 3 a increace un factor de multiplicación a partir de .0001 a 1 2. marcos de 1/3 a 2/3 marcos para no hacer nada (se multiplica por 1) y 3. Para el factor para disminuir de nuevo por debajo de 1, de modo que para la variable de salida para disminuir de nuevo al punto original.

¿Cómo puedo crear un bucle que va a aumentar y disminuir estos valores a través del bucle exterior?

¿Fue útil?

Solución

Creo que pensó a sí mismo en una esquina, para decirlo. No hay necesidad de crear un bucle anidado para modificar la ganancia se desvanecen, sólo tiene que mantener un registro de la misma a través del lazo y adaptarlo si es necesario. Además, su variable de nombres de cuadros / muestras parece un poco embarrado a mí, espero que tengo una derecha.

float fadeTime = 0.5f;
float outputGain = 0.0f;
float gainProgressionPerSample = 1.0f/(fadeTime*SAMPLERATE);
float fadeInStop = fadeTime*SAMPLERATE;
float fadeOutBegin;

for(i=0; i < end && !feof(fpin); i+=blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 
    fadeOutBegin = samples - fadeTime*SAMPLERATE;
    for(j=0; j < samples; j++)
    {
       if (j < fadeInStop)   
       {
         outputGain += gainProgressionPerSample;
       }
       // else is not used intentionally to allow fade in/out blending for short tracks
       if (j > fadeOutBegin)
       {
         outputGain -= gainProgressionPerSample;
       }
       output[j] = audioblock[j]*outputGain;
    }

    fwrite(output,sizeof(short), samples, fpoutput); 
} 

Otros consejos

Mi primera observación:

fade = fade--;

no funcionará, ya que es equivalente a

int temp = fade - 1;
fade = fade;

Esto es cómo funciona el operador de incremento. Por lo que debe escribir simplemente

fade--;

en lugar (o --fade - lo que usted prefiera: -).

A continuación, debe construir sus bucles algo como esto:

for(j=0; j < frames/3; j++)
{   
    fade--;
    output[j] = audioblock[j]/fade;
}
for( ; j < 2*frames/3; j++)
{   
    output[j] = audioblock[j]/fade;
}
for( ; j < frames; j++)
{   
    fade++;
    output[j] = audioblock[j]/fade;
}

En los procesadores modernos no hay ninguna razón real no utilizar el punto flotante para los cálculos. Es más preciso y el rendimiento es casi lo mismo que las matemáticas número entero. Y si está usando punto flotante, no hay razón para no tener todas las variables TEMP ser dobles. declarándolos como flotador en realidad cuesta rendimiento.

Este código le dará un desvanecimiento lineal en más de (frames / 3) muestras

double gain = 0.0f;
double deltaGain = (1.0 - gain)/(frames/3);
for (int i=0; i < end && !feof(fpin); i += blockframes) 
{ 
    samples = fread(audioblock, sizeof(short), blocksamples, fpin); 

    j = 0;
    // do the fade in.
    for ( ; j < samples; ++j)
    {
       gain += deltaGain; // adjust the gain
       if (gain >= 1.0)
          break;

       output[j] = (short)(audioblock[j] * gain);
    }

    // copy the remainder.
    for ( ; j < samples; ++j)
       output[j] = audioblock[j];

    fwrite(output,sizeof(short), samples, fpoutput); 
} 

El truco básico es averiguar por adelantado el punto de partida y el punto final para su multiplicador de ganancia, y luego dividir (al final de inicio) / pasos para obtener la cantidad que la ganancia debe cambiar para cada muestra. Luego, en su bucle interno, el ajuste de la ganancia es sólo una adición. Usted puede obtener una curva de ganancia x-cuadrado con sólo dos adiciones en el bucle interno. x-cuadrado es una aproximación razonable de un fundido de registro en el que los sonidos más 'natural' ya que nuestros oídos oyen en escala logarítmica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top