2011-12-30 18 views
0

私はオーディオ信号の周波数変調のために次のコードを書いています。オーディオ自体の長さは1秒で、8000 Hzでサンプリングされます。私は50Hzの周波数の正弦波(サンプリング周波数の一部として表される)を使って、このオーディオ信号にFMを適用したいと思っています。変調信号は、1対の側波帯のみを生成するように変調指数が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

あなたの質問は何ですか? –

+0

さて、このコードは動作していないようだし、うまく動作しないのかどうかはわかりません。私は別のスレッド(http://stackoverflow.com/questions/8655121/frequency-modulation-fm)でこの質問をし、単に私がそこに伝えられたことを実装しようとしました。 –

答えて

1

phi_deltaのあなたの計算は、8000倍にオフであり、オフセット - それはすなわち

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

の範囲を有するphi_deltaをもたらすであろう、1つの+/-小さい値でなければなりません0.75~1.25である。

+0

ありがとう、私は試して結果を報告します。もう1つの追加の質問。変調指数が0.25の代わりに2を使用すると、-1から3の範囲でphi_deltaが得られます。したがって、phi_accumの負の値を得ることができます(phi_deltaがループ)。今私はどのようにその状況に対処していますか? –

+0

実際に私の最後のコメントを忘れてしまった。最初に試してみます –

+0

通常、波形テーブルは周期的で、ルックアップテーブルのインデックスは、テーブルのサイズを法として扱います。すなわち、インデックスは「ラップアラウンド」する必要があります。サンプリングされたオーディオはおそらく周期的ではありませんが、今のところ最初の近似としてモジュロインデックスを使用することができます。 –