我想在 C# 中生成一个正弦扫描,我可以在其中定义开始频率、结束频率和扫描持续时间。我查看了播放缓冲区的声音库,例如 DirectSound 和 ASIO。但是由于缓冲区大小限制,当扫描的持续时间足够长以填充多个缓冲区时,我无法弄清楚如何控制扫描的持续时间。任何样本或指南都会非常有帮助。
问问题
1762 次
2 回答
0
ulrichb 已经说明了所有必要的信息,但最近我不得不用 C# 在 .Net 中构建一个正弦扫描生成器。对我来说它看起来很酷,我将代码留在这里,也许它对其他人有用。
numberofSamples:缓冲区大小。
sweepDuration:从低频到高频所需的时间。
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 回答