Naudio频率lenth

时间:2017-03-06 17:06:46

标签: c# signal-processing fft naudio

根据this article 我能够在声音文件中捕获波形的FFT结果。 我的sampleRate由

给出
using (var reader = new WaveFileReader(soundFile))
using (wc = new WaveChannel32(reader) { PadWithZeroes = false })
using (audioOutput = new DirectSoundOut())
{
    wc.Volume = 100;
    sampleRate = reader.WaveFormat.SampleRate;   //<== sampleRate
    averageBytePerSecond = waveIn.WaveFormat.AverageBytesPerSecond; 
    audioOutput.Init(wc);
    try
    {
      audioOutput.Play();

      while (audioOutput.PlaybackState != PlaybackState.Stopped)
      {
        Thread.Sleep(20);
      }

      audioOutput.Stop();
    }
    catch (Exception e)
    {
      Debug.WriteLine(e.Message);
    }
}

我使用以下方法检测样本的主频率(FftLenth固定为8192):

 void FftCalculated(object sender, FftEventArgs e)
{       
    float maxVal = 0;
    int maxIndex = -1;
    for (int i = 0; i < FftLenth / 2; i++)
    {
        float v = e.Result[i].X * e.Result[i].X + e.Result[i].Y * e.Result[i].Y;
        if (v > maxVal)
        {
            maxVal = v;
            maxIndex = i;
        }
    }

    var frequency = maxIndex * (sampleRate / FftLenth);
}

现在我有我的频率,但我怎样才能找到这个频率的持续时间? (频率播放多长时间。)

1 个答案:

答案 0 :(得分:0)

如果您知道主信号的频率和带宽,则可以使用带通滤波器和包络跟踪器。您还需要估计包络起始和衰减的某种幅度阈值。

Goertzel滤波器是一种具有幅度输出的常见组合带通滤波器。可以使用滑动Goertzel滤波器来定位时域事件。