0

我想在 C# 中生成一个正弦扫描,我可以在其中定义开始频率、结束频率和扫描持续时间。我查看了播放缓冲区的声音库,例如 DirectSound 和 ASIO。但是由于缓冲区大小限制,当扫描的持续时间足够长以填充多个缓冲区时,我无法弄清楚如何控制扫描的持续时间。任何样本或指南都会非常有帮助。

4

2 回答 2

3

如果您对正在运行的程序感到满意而无需自己编写,请查看音频测试文件生成器

这个小窗口 EXE 能够生成具有给定开始和结束频率的线性正弦扫描。


如果您想自己编写它,则必须使用以下方法填充缓冲区:

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

在哪里

f是以赫兹为单位的当前正弦频率(您要扫描)
n是缓冲区的样本索引是以赫兹为单位
sample_rate的采样率

f=10Hz 为例

于 2010-11-21T22:50:59.493 回答
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 回答