2013-10-09 21 views
1

嗨我試圖在本機C中爲Android實現一個環形調製器。我需要爲語音轉換器應用程序操縱wav文件。我想獲得像dalek聲音一樣的效果。 這是我迄今所做的: 閱讀wav文件 - 通過WAV的每一個樣本工程 迭代 - 工程 保存新樣本 - 工程適用於Android的語音效果環調製器

對於環形調製器的音頻文件的聯合竇,所以我想這:

//Position through the sine wave as a percentage (i.e. 0 to 1 is 0 to 2*PI) 
double cyclePosition = 0; 
double fFreq = 1; // Frequency of sine wave in hz 
double cycleInc = fFreq/16000; // Fraction of cycle between samples 

for(i=0; i<csize; i++) 
{ 
    currentSample = //read it; 
    currentSample = currentSample* sin(2*M_PI*cyclePosition)); 
    currentSample = //write it; 
    cyclePosition += cycleInc; 
    if (cyclePosition > 1) 
     cyclePosition -= 1; 
} 

所以問題是,如果我輸入的1Hz的頻率,每1秒有音頻一個非常響亮的嘶嘶聲。如果我改變頻率爲30Hz,例如我無法理解最初的音頻。 有沒有人有一個想法如何改善這一點?

+0

我假設採樣率固定在16kHz? –

+1

這顯然不是您的實際代碼,因爲循環的第二行有一個雜散/額外的右括號。你可以仔細檢查一下嗎?另外,currentSample的數據類型是什麼?另一件要檢查的事情是記錄cyclePosition和罪的輸出,看它們是否輸出你期望的結果。 –

+0

採樣率已修復。 currentSample的數據類型很短。我不知道我應該期待什麼。我所知道的唯一一件事就是環形調製是通過將音頻與正弦波相結合來實現的。 – Gingerbread123321

回答

0

代碼原樣,對我來說看起來很好,但正如我所說我不認爲這是你的實際代碼。請仔細檢查。你可以運行測試的一個例子是註釋掉乘法線:

... 

for(i=0; i<csize; i++) 
{ 
    currentSample = //read it; 
    //currentSample = currentSample* sin(2*M_PI*cyclePosition)); 
    currentSample = //write it; 
    cyclePosition += cycleInc; 
    if (cyclePosition > 1) 
     cyclePosition -= 1; 
} 

這應該輸出正是你放什麼然後嘗試事情,似乎無傷大雅。

currentSample = currentSample * .99; 

應該差不多沒有聲音差異

currentSample = currentSample * .5; 

應該減半音量。

+0

好吧,我已經嘗試過了,結果如下:0.99幾乎沒有變化,但0.5沒有減半音量。實際上它看起來有點大聲,聽起來像是對講機。樣本的值是否指示wav文件的音量?音調保存在wav文件中的位置在哪裏? – Gingerbread123321

+0

根據你的回答,很明顯你沒有顯示的代碼有問題。可能是一個endian問題,但這是一個猜測。至於你的其他問題,網上有很多答案。嘗試維基百科,例如:http://en.wikipedia.org/wiki/Pulse-code_modulation –