C# Silverlight获取声音频率

3
我一直在尝试使用以下代码从麦克风读取当前声音:
_Capture是一个CaptureSource,_Encoder是一个SimpleAudioEncoder(自定义类)。
_Capture = new CaptureSource();
_Encoder = new SimpleAudioEncoder(this);
_Encoder.CaptureSource = _Capture;

if (_Capture != null)
{
    _Capture.AudioCaptureDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
    CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
    if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess())
    {
        MessageBox.Show("_Capture.Start()");
        _Capture.Start();
    }
}

SimpleAudioEncoder 的定义

public class SimpleAudioEncoder : AudioSink
{
    public SimpleAudioEncoder() {

    }
    protected override void OnCaptureStarted()
    {

    }

    protected override void OnCaptureStopped()
    {

    }

    protected override void OnFormatChange(
    AudioFormat audioFormat) {

    }

    protected override void OnSamples(
    long sampleTimeInHundredNanoseconds,
    long sampleDurationInHundredNanoseconds,
    byte[] sampleData)
    {

    }
}

我猜测 sampleDatabyte[] 数组内应该有我要找的数据,但是我该如何使用它来查找声音的频率?
如果能够找到像这样的函数就太好了: public double GetFreq(byte[] data) 可以像这样使用: double hertz = GetFreq(sampleData)
1个回答

3
建立声音频率需要将信号从时域转换为频域。这将涉及到傅里叶变换和随后对输出的分析。这真的不是一个适合没有相当深入了解DSP技术的人来做的工作。如果你必须问,那么你离自己实现这个还有很长的路要走。我建议使用第三方库。 这个页面提供了一个相当好的新手频率检测视角。

有哪些第三方库? - Mark Lalor
此外,我可以使用这个傅里叶变换类吗?http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=20025 点击FourierTansform.cs。 - Mark Lalor
请参考http://stackoverflow.com/questions/1847633/net-library-to-identify-pitches/1847723,因为这主要需要在Silverlight中进行的数字计算。 - Paul Annetts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接