0

開始周波数、終了周波数、およびスイープの期間を定義できるC#でサインスイープを生成したいと思います。バッファを再生するDirectSoundやASIOなどのサウンドライブラリを見てきました。しかし、バッファーサイズの制限により、スイープの期間が複数のバッファーを満たすのに十分な長さである場合に、スイープの期間を制御する方法を理解できませんでした。サンプルやガイドは非常に役立ちます。

4

2 に答える 2

3

自分で作成せずに実行中のプログラムに満足している場合は、オーディオテストファイルジェネレータをご覧ください。

この小さなウィンドウEXEは、指定された開始周波数と終了周波数で線形正弦波スイープを生成できます。


自分で書き込みたい場合は、以下を使用してバッファを埋める必要があります。

sin(2*pi * f * n/sample_rate)

どこ

fは現在の正弦周波数(スイープする)(Hz)
nはバッファのサンプルインデックス(
sample_rateサンプルレート)(Hz )

f=10Hzの例。

于 2010-11-21T22:50:59.493 に答える
0

ulrichb はすでに必要な情報をすべて述べていますが、最近、C# を使用して .Net でサイン スイープ ジェネレーターを作成する必要がありました。私にはクールに見えました。コードをここに残しておきます。他の人にとっては役立つかもしれません。

numberofSamples: バッファ サイズ。

swiftDuration: 低周波から高周波に移行するのにかかる時間。

lowFreq: 開始周波数

highFreq: 終了周波数

deltaTime: 1 / サンプリング レート (1 つのサンプルを取得するのにかかる時間)

        float sweepCurrentTime = 0.0f;
        float sweepFrequencyFactor = 0.0f;
        float sweepCurrentCyclePosition = 0.0f;
        float sweepFrequency = 0.0f;

public void generateSineSweep(float[] buffer, int numberOfSamples, int sampleRate, int sweepDuration, float lowFreq, float highFreq)
{
           float deltaTime = 1.0f / sampleRate;
           for (int i = 0; i < numberOfSamples; i++)
                {
                    sweepFrequency = lowFreq + ((highFreq - lowFreq) * sweepFrequencyFactor);

                    sweepCurrentCyclePosition += sweepFrequency / sampleRate;

                    buffer[i] = Convert.ToSingle(0.25f * Math.Sin(sweepCurrentCyclePosition * 2 * Math.PI));

                    if (sweepCurrentTime > sweepDuration)
                    {
                        sweepCurrentTime -= sweepDuration;
                        sweepCurrentTime += deltaTime;
                        sweepFrequencyFactor = 0.0f;
                    }
                    else
                    {
                        sweepCurrentTime += deltaTime;
                        sweepFrequencyFactor = sweepCurrentTime / sweepDuration; 
                    }

                }
}

この関数は、低周波数から高周波数に進み、各サンプルの後に周波数を一定量増やします。

于 2021-12-16T13:24:06.723 に答える