在 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# 中生成正弦扫描的主要内容,如果未能解决你的问题,请参考以下文章

如何正确调整从 C# 中的库生成的条形码大小

在 MATLAB 中生成要保存在 .mif 文件中的正弦波

用两种不同的方法用指数正弦扫描估计模拟系统的Hammerstein核

Spring:扫描组件

Spring:扫描组件

在 Python 中生成令牌 [重复]