c# Silverlight获得声音的频率

本文关键字:频率 声音 Silverlight | 更新日期: 2023-09-27 18:07:41

我一直在尝试使用如下代码从麦克风读取当前声音

_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)
    {
    }
}

我猜sampleData byte[]阵列有我要找的数据,但我怎么能用它来找到声音的频率?

如果我能找到一个像

这样的函数就太好了

public double GetFreq(byte[] data)

使用like

double hertz = GetFreq(sampleData)

c# Silverlight获得声音的频率

建立声音的频率需要将信号从时域转换到频域。它将涉及傅里叶变换和随后的输出分析。这真的不是一个工作,任何人没有相当彻底的了解DSP技术。如果你不得不问,那么你离自己实现这个还有很长的路要走。我建议使用第三方库。

这个页面给出了一个相当好的观点,从一个新的频率检测。