1

Androidの小さなオーディオアプリ用に見つけたこのコードをテストしていましたが、何かに引っかかっています。

short samples[] = new short[buffsize];
int amp = 32767;
double twopi = 2*Math.PI;
double fr = 262.f;
double ph = 0.0;

while(isRunning)
{
    fr = 262 + 262*sliderval;

    for(int i=0; i < buffsize; i++)
    {
        samples[i] = (short) (amp*Math.sin(ph));
        ph += twopi*fr/sr;
    }
    audioTrack.write(samples, 0, buffsize);
}

このループがサウンドを合成するために機能することは知っていますが、「ph」パラメーターが何であるか、および正弦波を生成するための数学にどのように適合するかはわかりません。誰かがそれが何であるかを知っているなら、私に説明してもらえますか?

4

3 に答える 3

1

正弦波の位相です。初期値は 0 なので、波形の最初のサンプルは 0 です。次に、サンプルごとに増分され、波形が指定された周波数になります。

とにかく数学的な問題に見えます...

必要に応じてフェーズに関する詳細情報:ウィキペディア - フェーズ(波)

于 2013-07-21T21:47:22.703 に答える
0

上記のコードでphは、Phase Accumulatorです。

次の 2 つの関係は、何が起こっているのかを理解するのに役立ちます。

  1. 周波数は、時間に対する位相の変化率です。
  2. Sin(x) = Sin(x + N * 2 * PI) のすべての整数値に対してN

ループを一巡するたびに、サンプル間の位相差が位相アキュムレータに追加されます。

于 2013-07-21T21:52:46.137 に答える
0

正弦波は、次の関数から導出されます。

y(t) = Amplitude * Sin( 2* PI * Frequency * SAMPLE_TIME)

このコード行:

samples[i] = (short) (amp * Math.sin(ph));

基本的に上記の機能です。for ループの最初の実行では、phiszeroであるため、計算は機能します。ph基本的には、上記の関数に与えられた角度部分です。次に、次phの値を取ります。

ph += twopi * fr/sr;

ここでfr / srは、Frequency / Sample_Rate です。また、次の点に注意してください。

SAMPLE_TIME = 1 / SAMPLE_RATE
于 2013-07-21T21:53:26.170 に答える