2010-12-11 95 views
0

所以,稍後我正在研究一個波形發生器應用程序,並且遇到了一些問題,但是Kenny Winker是一個真正的救生員,並且幫助我基本上掌握了一切。然而,最終我遇到的一個問題是,每當我改變我使用的頻率的值(並且在我改變音量值時的程度較小)時,我最終會看到這些醜陋的「彈出「噪音。這是一個問題,因爲整個問題的關鍵是能夠用滑塊順利地改變波的頻率和音量,聽起來像紙張弄皺可能會毀掉這種效果。這是控制音量/頻率的OSStatus代碼。如何在使用remoteIO生成iPhone音頻時防止爆音?

OSStatus playbackCallback(void *inRefCon, 
         AudioUnitRenderActionFlags *ioActionFlags, 
         const AudioTimeStamp *inTimeStamp, 
         UInt32 inBusNumber, 
         UInt32 inNumberFrames, 
         AudioBufferList *ioData) {  

SlidersViewController *me = (SlidersViewController *)inRefCon; 

static int phase = 1; 

for(UInt32 i = 0; i < ioData->mNumberBuffers; i++) { 

    int samples = ioData->mBuffers[i].mDataByteSize/sizeof(SInt16); 

    SInt16 values[samples]; 

    float waves; 


    for(int j = 0; j < samples; j++) { 


     waves = 0; 



     waves += sin(kWaveform * me.fr1 * phase)*(me.vol1); 
     waves += sin(kWaveform * me.fr2 * phase)*(me.vol2); 
     waves += sin(kWaveform * me.fr3 * phase)*(me.vol3); 
     waves *= sin(kWaveform * (me.fr4/100) * phase)*(me.vol4); 
     waves *= 32500/4; 

     values[j] = (SInt16)waves; 
     values[j] += values[j]<<16; 

     phase++; 


    } 

    memcpy(ioData->mBuffers[i].mData, values, samples * sizeof(SInt16)); 

} 

return noErr;} 

正如你可能會看到,在OBJ-C變量 「FR1」 - 「FR4」 控制頻率,而 「VOL1」 到 「VOL4」 控制幅度。每次更新這些值

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {} 

被觸發。有關如何解決這個問題的任何想法讓它聽起來更流暢? 謝謝!

回答

0

我的猜測是你只是改變波形參數而沒有在兩個值之間進行平滑插值,因此你的波形會被破壞,聽起來「很麻煩」。

更改波形生成函數,以便在舊值(在幀的開始處)和新值(在幀的結尾)之間進行插值。

1

您正在內循環中乘以計算相位。倍頻器的任何變化都會導致潛在的大幅跳躍,從而形成一個「流行」。

不是乘法,而是在內部循環中添加delta相位。由於三角洲階段只會變化很小,相位也會變化,並且會有更小的不連續性。

deltaPhase = 2.0 * pi * yourFrequency/sampleRate ; 
+0

我對如何實現這個有點困惑。我有一個類似的想法,即做currentFrequency = oldFrequency +((newFrequency-oldFrequency)*(currentPhase/sampleRate)),但我一直在堅持。你能告訴我如何實現你的deltaPhase方法嗎?謝謝! – wyager 2010-12-11 04:39:47

+0

好吧,仍然沒有運氣......要麼用我的技術,要麼嘗試使用你的deltaPhase方法。我被困在這裏。 – wyager 2010-12-11 17:59:44

+0

@wyager:你是否從內部循環中刪除所有相位相乘?你不需要任何,只有增加,除了可能的音量縮放。 – hotpaw2 2010-12-11 18:58:33