2010-06-18 14 views
6

Estoy buscando en el ejemplo iPhone aurioTouch específicamente en el siguiente código:iPhone aurioTouch ejemplo: Retire DC

static OSStatus PerformThru(
         void      *inRefCon, 
         AudioUnitRenderActionFlags *ioActionFlags, 
         const AudioTimeStamp  *inTimeStamp, 
         UInt32      inBusNumber, 
         UInt32      inNumberFrames, 
         AudioBufferList    *ioData) 
{ 
    aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)inRefCon; 
    OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); 
    if (err) { printf("PerformThru: error %d\n", (int)err); return err; } 

    // Remove DC component 
    for(UInt32 i = 0; i < ioData->mNumberBuffers; ++i) 
     THIS->dcFilter[i].InplaceFilter((SInt32*)(ioData->mBuffers[i].mData), inNumberFrames, 1); 

    // ... 

} 

en el archivo aurioTouchAppDelegate.mm.

Pregunta para principiantes: ¿Qué hace el "componente Eliminar CC"? Se aprecia cualquier puntero al artículo tutorial al respecto.

Gracias de antemano por su ayuda.

+0

¿Podría alguien arreglar esta pregunta? –

Respuesta

8

Este es el código para el método InplaceFilter:

void DCRejectionFilter::InplaceFilter(SInt32* ioData, UInt32 numFrames, UInt32 strides) 
{ 
    register SInt32 y1 = mY1, x1 = mX1; 
    for (UInt32 i=0; i < numFrames; i++) 
    { 
     register SInt32 x0, y0; 
     x0 = ioData[i*strides]; 
     y0 = smul32by16(y1, mA1); 
     y1 = smulAdd32by16(x0 - x1, mGain, y0) << 1; 
     ioData[i*strides] = y1; 
     x1 = x0; 
    } 
    mY1 = y1; 
    mX1 = x1; 
} 

Básicamente, el código está haciendo un high-pass filter en el audio para eliminar la componente continua del espectro de frecuencia que también se conoce como la DC offset. El coeficiente (alfa en el artículo de wikipedia) para el filtro está configurado por defecto en el código para ser 0.975 y los valores típicos para los filtros de eliminación de DC están entre 0.9 y 1.0. Si ajusta la velocidad de muestreo, entonces tal vez quiera ajustar ese coeficiente, pero no me preocuparía demasiado al respecto.

+0

¿Cómo se debe usar esto exactamente? Necesito eliminar el DC Bias antes de ejecutar la FFT. – jarryd

2

El filtro de rechazo de CC aquí es en realidad un filtro de paso alto. En ingeniería eléctrica, un filtro de paso alto se implementa como un circuito RC, que permite el paso de ondas de alta frecuencia solamente. Cada filtro de paso alto tiene una frecuencia de corte, definida como la frecuencia en la cual la energía de salida es -3db de la energía de entrada.

El método InPlaceFilter es una implementación digital en el dominio del tiempo de un filtro de paso alto. La implementación digital agrupa todas las muestras en orden y ajusta la salida actual en función de la salida anterior. En esta implementación, se usa una variable constante alfa cuyo valor está entre 0 y 1. La frecuencia de corte de su filtro de paso alto depende del valor que elija para Alpha (y también su velocidad de muestreo). Como en AurioTouch la frecuencia de muestreo es de 44k. La frecuencia de corte se puede calcular en alrededor de 160Hz. (tenga en cuenta que esto no significa que no obtenga ninguna lectura de frecuencia por debajo de 160 Hz. Simplemente significa que la salida de energía de las frecuencias por debajo de esa frecuencia es significativamente menor que las de más arriba).

He escrito una explicación detallada aquí http://timdotshi.blogspot.ca/2014/01/dc-rejection-filter-in-objective-c.html.