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