根据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);
}
现在我有我的频率,但我怎样才能找到这个频率的持续时间? (频率播放多长时间。)
答案 0 :(得分:0)
如果您知道主信号的频率和带宽,则可以使用带通滤波器和包络跟踪器。您还需要估计包络起始和衰减的某种幅度阈值。
Goertzel滤波器是一种具有幅度输出的常见组合带通滤波器。可以使用滑动Goertzel滤波器来定位时域事件。