2010-06-18 17 views
6

Tôi nhìn vào ví dụ iPhone aurioTouch đặc biệt vào đoạn mã sau:iPhone aurioTouch dụ: Tháo 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); 

    // ... 

} 

trong file aurioTouchAppDelegate.mm.

Câu hỏi bắt đầu: "Loại bỏ thành phần DC" làm gì? Bất kỳ con trỏ đến bài viết hướng dẫn về nó được đánh giá cao.

Cảm ơn trước sự giúp đỡ của bạn.

+0

Ai đó có thể dọn dẹp câu hỏi này? –

Trả lời

8

Đây là mã cho phương pháp 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; 
} 

Về cơ bản, mã đang làm một high-pass filter trên âm thanh để loại bỏ các thành phần DC của phổ tần số mà cũng được gọi là DC offset. Hệ số (alpha trong bài viết wikipedia) cho bộ lọc được đặt theo mặc định trong mã là 0,975 và các giá trị điển hình cho bộ lọc loại bỏ DC nằm trong khoảng từ 0.9 đến 1.0. Nếu bạn điều chỉnh tỷ lệ lấy mẫu thì bạn có thể muốn điều chỉnh hệ số đó, nhưng tôi sẽ không lo lắng quá nhiều về nó.

+0

Làm thế nào chính xác điều này nên được sử dụng? Tôi cần phải loại bỏ các DC Bias trước khi chạy FFT. – jarryd

2

Bộ lọc loại bỏ DC ở đây thực sự là bộ lọc thông qua cao. Trong kỹ thuật điện, một bộ lọc thông cao được thực hiện như một mạch RC, cho phép chỉ có sóng tần số cao đi qua. Mỗi bộ lọc thông cao có tần số cắt, được định nghĩa là tần số tại điểm mà năng lượng đầu ra là -3db của năng lượng đầu vào.

Phương pháp InPlaceFilter là một miền thời gian thực hiện kỹ thuật số của bộ lọc thông cao. Việc thực hiện kỹ thuật số lặp tất cả các mẫu theo thứ tự và điều chỉnh đầu ra hiện tại dựa trên đầu ra trước đó. Trong triển khai này, một biến alpha không đổi có giá trị nằm trong khoảng từ 0 đến 1 được sử dụng. Tần số cắt của bộ lọc thông cao của bạn phụ thuộc vào giá trị bạn chọn cho Alpha (và cả tỷ lệ lấy mẫu của bạn). Vì ở AurioTouch tần số lấy mẫu là 44k. Tần số cắt có thể được tính toán là khoảng 160Hz. (lưu ý rằng điều này không có nghĩa là bạn không nhận được bất kỳ tần số đọc dưới 160Hz. Nó chỉ có nghĩa là năng lượng ra đặt tần số dưới tần số đó là thấp hơn đáng kể so với những người ở trên nó).

Tôi đã viết giải thích chi tiết tại đây http://timdotshi.blogspot.ca/2014/01/dc-rejection-filter-in-objective-c.html.