2011-12-30 89 views
0

我已經爲音頻信號的頻率調製寫了下面的代碼。音頻本身是1秒長,以8000赫茲採樣。我想通過使用頻率爲50 Hz的正弦波(表示爲採樣頻率的一部分)將FM應用於此音頻信號。調製信號的調製指數爲0.25,以便只產生一對邊帶。調頻(FM)代碼片段

for (i = 0; i < 7999; i++) { 
    phi_delta = 8000 - 8000 * (1 + 0.25 * sin(2* pi * mf * i)); 
    f_phi_accum += phi_delta; //this can have a negative value 
    /*keep only the integer part that'll be used as an index into the input array*/ 
    i_phi_accum = f_phi_accum; 
    /*keep only the fractional part that'll be used to interpolate between samples*/ 
    r_phi_accum = f_phi_accum - i_phi_accum; 
    //If I'm getting negative values should I convert them to positive 
    //r_phi_accum = fabs(f_phi_accum - i_phi_accum); 
    i_phi_accum = abs(i_phi_accum); 
    /*since i_phi_accum often exceeds 7999 I have to add this if statement so as to  prevent out of bounds errors */ 
    if (i_phi_accum < 7999) 
     output[i] = ((input[i_phi_accum] + input[i_phi_accum + 1])/2) * r_phi_accum;    
} 
+1

好的,但是你的問題是什麼? – 2011-12-30 09:09:48

+0

那麼,這段代碼似乎並沒有工作,我甚至不知道它是否應該工作。我在另一個線程(http://stackoverflow.com/questions/8655121/frequency-modulation-fm)問這個問題,只是試圖實現我在那裏被告知。 – 2011-12-30 09:30:07

回答

1

你phi_delta的計算是關閉的8000因子和偏移 - 它應該是1個+/-小的值,即

phi_delta = 1.0 + 0.25 * sin(2.0 * pi * mf * i)); 

這將導致phi_delta具有一定範圍的0.75至1.25。

+0

好的,謝謝,我會試一試並報告結果。還有一個額外的問題。如果我的調製指數使用2而不是0.25,那麼我會得到phi_delta在-1到3的範圍內,所以我可能會得到一些phi_accum的負值(如果phi_delta在循環)。現在我該如何處理這種情況? – 2011-12-30 10:10:48

+0

其實忘了我最後的評論。我會先試一試 – 2011-12-30 10:14:36

+0

通常情況下,波形表會是週期性的,您會將查找表索引以表格的大小爲模,即索引應該「環繞」。您的採樣音頻可能不是週期性的,但您現在仍然可以使用模索引作爲第一個近似值。 – 2011-12-30 10:29:49