2

Android で任意のトーンを再生すると、周波数トーンを生成するときに役立つことがわかりました。ここで、トーンの再生中に周波数を変更したいと考えています。

genTone を次のように変更しました。

private void genTone(double startFreq, double endFreq, int dur) {
    int numSamples = dur * sampleRate;
    sample = new double[numSamples];
    double currentFreq = 0, numerator;
    for (int i = 0; i < numSamples; ++i) {
        numerator = (double) i / (double) numSamples;
        currentFreq = startFreq + (numerator * (endFreq - startFreq));
        if ((i % 1000) == 0) {
            Log.e("Current Freq:", String.format("Freq is:  %f at loop %d of %d", currentFreq, i, numSamples));
        }
        sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / currentFreq));
    }
    convertToPCM(numSamples);
}

private void convertToPCM(int numSamples) {
    // convert to 16 bit pcm sound array
    // assumes the sample buffer is normalised.
    int idx = 0;
    generatedSnd = new byte[2 * numSamples];
    for (final double dVal : sample) {
        // scale to maximum amplitude
        final short val = (short) ((dVal * 32767));
        // in 16 bit wav PCM, first byte is the low order byte
        generatedSnd[idx++] = (byte) (val & 0x00ff);
        generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);

    }
}

ログには currentFreq の正しい値と思われるものが示されていますが、トーンを聞くとスイープが高すぎて速すぎます。たとえば、400hz から開始して 800hz に進むと、オシロスコープは、同時に 400hz から 1200z に実際に移動していることを示します。

何が間違っているのかわかりません。誰か助けてもらえますか?

4

1 に答える 1

2

サンプルレートを変更すると、オシロスコープで測定される周波数にどのような影響がありますか? サンプルレートが高いほど、生成された信号がより正確になるため、可能であればサンプルレートをより高い値に上げようとします。

それでも解決しない場合は、次の式を微調整してください。

currentFreq = startFreq + (分子 * (endFreq - startFreq));

に:

currentFreq = startFreq + (分子 * (endFreq - startFreq)) /2 ;

信号の変化の新しい測定間隔を教えてください。

幸運を。

于 2013-08-27T04:11:23.410 に答える