2011-09-02 66 views
3

我一直在尝试用一些类似的代码的频率下,从麦克风读取电流声C#的Silverlight播放声音

_Capture是CaptureSource和_Encoder是​​(自定义类)

_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(); 
    } 
} 
​​

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

    } 
} 

Im的

定义猜测的sampleDatabyte[]阵列具有我正在查找的数据,但我如何使用它来查找声音的频率?

这将是巨大的,如果我能找到像

public double GetFreq(byte[] data)

功能使用像

double hertz = GetFreq(sampleData)

回答

3

建立声音的频率要求信号从时域转换到频域。它将涉及Fourier transforms和随后的输出分析。对于没有深入理解DSP技术的人来说,这不是一份工作。如果你不得不问,那么你自己能够实现这一点还有很长的路要走。我会推荐一个第三方库。

This page给人一个新的频率检测相当好的看法。

+0

什么是一些第三方库? –

+0

也可以使用这个傅里叶变换类http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=20025点击FourierTansform.cs –

+0

另请参阅http://stackoverflow.com/questions/1847633/net-library-to-identify-pitches/1847723,因为这主要是要求在Silverlight中进行数字运算。 –