2010-01-17 66 views
2

我嘗試使用SpeakHere示例應用程序作爲起點來實現iPhone聲音處理應用程序。該應用程序涉及在播放過程中操縱緩衝的音頻樣本。當我將樣本乘以一個分數(例如0.9)時,我會得到噪音。最奇怪的是,當將樣本乘以整數(例如1.0,2.0)或者加上或減去樣本時,回放聽起來像預期的那樣。操作AudioQueueBuffer音頻數據導致噪音

我做它AudioPlayer.m與下面的代碼片段的playbackCallback功能:

//------------------ 
    //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine. 
    short *buffer = (short *)calloc(1, numPackets * 2); 
    memmove(buffer, bufferReference->mAudioData, numPackets * 2); 
    for (int i = 0; i < numPackets; i++) 
    { 
    buffer[i] *= 0.9; 
    //buffer[i] *= 1.0; 
    //buffer[i] += 10.0; 
    } 
    memmove(bufferReference->mAudioData, buffer, numPackets * 2); 
    free(buffer); 
    buffer = NULL; 
    //------------------- 

整個項目可以在這裏下載:http://depositfiles.com/files/lmnkq68n8

任何人都可以點我什麼是我做錯了?我已經掙扎了好幾天了,我完全失去了。

謝謝!

回答

0

我無法下載你的項目(文件託管人總是告訴我所有插槽已滿),但通過閱讀您發佈的代碼段,似乎您將帶符號的16位整數(短)值乘以0.9(一個浮點值)。這導致了一個隱含的演員陣容。所以你把小數點後面的所有東西都丟掉了,這反過來導致你的信號中有aliasing effects

更新:
我檢查你的代碼,但不能揣摩出的噪音從何而來。
你爲什麼用memmove來操縱緩衝區?
您可以直接訪問緩衝區:

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; 

我很好奇,想知道是什麼原因導致的噪音太大。所以,如果你發現了,請在這裏發表您的解決方案(也許有人對Core Audio mailing list可以幫助 - 他們是真正的幫助那裏)。

如果你只需要改變增益,你可以簡單地使用AudioQueueSetParameter
另一種選擇是而不是AudioQueueServices。

+0

我已經重新上傳到另一個文件存儲:http://www.filefactory.com/file/a2c9c30/n/Speak_Here.zip。 這個問題似乎並不是關於將浮標變成短褲。對於音頻採樣的-32768至32767的幅度範圍,小數點後的值無關緊要。乘以0.9應該讓聲音更安靜,但我得到的是白色噪音。 – Thorny 2010-01-18 06:55:49

+0

感謝您重新上傳項目。我更新了我的答案。 – 2010-01-18 11:26:56

+0

謝謝,我將在覈心音頻郵件列表上發佈此問題。 – Thorny 2010-01-19 08:43:33

0

這可能只是將緩衝區big-endian格式轉換爲系統小端格式的乘法運算,並將其作爲big-endian再次存儲在緩衝區中。

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData; 
 
for (int i=0; i<44100; i++) { 
 
     sample = CFSwapInt16BigToHost(pBuffer[i]); 
 
     newSample = sample * 0.1; 
 
     pBuffer[i]=CFSwapInt16HostToBig (newSample); 
 
    }