7

64サンプルの長さの波形があります。サンプリングレートが44100Hzの場合、この波形を再生(ループ)して任意の周波数を再生するにはどうすればよいですか?

周波数=サンプルレート/サンプルの波形持続時間

したがって、周波数は689hz(44100/64)である必要があります。65.41hz(C-2)と言いたい場合は、次のようにする必要があります。

65.41 = 44100 / x

xを解くと、約が得られます。674.208。したがって、この周波数を取得するには、波形を再生する速度を把握する必要があります。したがって、この方程式を解くことができます。

64 * x = 674.208

約10.5を取得します。したがって、波形は元の速度の10.5%で再生する必要があります。

これが私のコードです:

double smp_index = 0;
double freq = .105;

void callback(void *data, Uint8 *buf, int len){
    int i;
    s8 *out;
    out = (s8*) buf;
    if(smp_index < waveform_length){
        for(i = 0; i < len; i ++){
            out[i] = smpdata[(int)smp_index];
            smp_index +=freq;
            if(smp_index >= waveform_length)
                smp_index = 0;
        }
    }
}

したがって、結果のオーディオはノートC-2に関するものになりますが、それはD-2に近いものになります。キャストですか

(int)smp_index

問題を引き起こしていますか?私はこれを達成する他の方法を見つけることができませんでした...

4

2 に答える 2

2

実際、主な問題はコードではなく、推論にあります。

したがって、この方程式を解くことができます。

64 * x = 674.208

約10.5を取得します。

ここまでは順調ですね。(実際には、674.208は674.246である必要がありますが、これは、前に65.41を有効数字4桁に丸めたためです。)

したがって、波形は元の速度の10.5%で再生する必要があります。

いいえ!波形は10.5倍遅くする必要があります。1/10.5 = 0.095つまり、元の速度の9.5%で再生する必要があります。

于 2009-11-03T22:45:07.560 に答える
1

キャスト(int)smp_indexは問題を引き起こしていません。それは単に波を伸ばすだけです-これは品質の低下です(おそらく64サンプルより長い波データが必要です)が、周波数を変更することはできません。ほとんどの場合、問題は次のとおりです。

        if(smp_index > realLength)
            smp_index = 0;

する必要があります:

        if(smp_index >= realLength)
            smp_index -= realLength;

他にもいくつかメモがあります。

周波数=サンプルレート/サンプルの波形持続時間

ええと、「波形持続時間」が波の周期を意味するなら、そうです。つまり、64サンプルの波形が周期64の正弦波である場合は、そうです。32または16の場合、状況は異なります。64を分割しないもの(48や30など)の場合、波形はそもそも周期的ではありません。

今:

u32 waveform_length;
out = (s8*) buf;
if(smp_index < waveform_length){

の価値はwaveform_length何ですか?私には初期化されていないように見えます...

于 2009-11-02T23:52:33.053 に答える