在 C# 中生成正弦扫描
Posted
技术标签:
【中文标题】在 C# 中生成正弦扫描【英文标题】:Generating a Sine Sweep in C# 【发布时间】:2010-11-21 21:48:09 【问题描述】:我想,我可以在其中定义扫描的开始频率、结束频率和持续时间。我查看了播放缓冲区的声音库,例如 DirectSound 和 ASIO。但是由于缓冲区大小的限制,当扫描的持续时间足够长以填充多个缓冲区时,我无法弄清楚如何控制扫描的持续时间。任何示例或指南都会非常有帮助。
【问题讨论】:
【参考方案1】:如果您对正在运行的程序感到满意而无需自己编写,请查看The Audio Test File Generator。
这个小窗口 EXE 能够生成具有给定开始和结束频率的线性正弦扫描。
如果要自己编写,则必须使用以下方法填充缓冲区:
sin(2*pi * f * n/sample_rate)
在哪里
f
是以赫兹为单位的当前正弦频率(您要扫描)n
是缓冲区的采样索引sample_rate
是以赫兹为单位的采样率
一个example with f=10Hz。
【讨论】:
【参考方案2】: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;
函数从低频到高频,每次采样后增加一定的频率。
【讨论】:
以上是关于在 C# 中生成正弦扫描的主要内容,如果未能解决你的问题,请参考以下文章