【问题标题】:Generating a Sine Sweep in C#在 C# 中生成正弦扫描
【发布时间】:2010-11-21 21:48:09
【问题描述】:

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

【问题讨论】:

    标签: c# asio directsound naudio


    【解决方案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; 
                          }
      
                      }
      }
      

      函数从低频到高频,每次采样后增加一定的频率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多