2011-09-02 142 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中進行數字運算。 –