2014-10-08 97 views
0

嗨我有一個音軌,我想通過低通濾波器傳遞後播放。我使用NAudio的BiQuadFilter類作爲濾鏡部分。它有一個內置的方法。第一個參數是採樣率,第二個參數是截止頻率,第三個參數是品質因數Q.我無法將Filter方法與我的音頻部分集成在一起。 這是我的代碼:集成音頻和濾波方法

 var r = BiQuadFilter.LowPassFilter(44100, 1500, 1); 
     var reader = new WaveFileReader(File.OpenRead(@"D:1.wav")); 
     var waveOut=new WaveOut(); 
     waveOut.Init(reader); 
     waveOut.Play(); 

我管理終於得到它的工作。不知道這是否正確。這是我做的:

public MyFilter(ISampleProvider sourceProvider,int cutOffFreq) 
    { 
     this.sourceProvider = sourceProvider; 
     this.cutOffFreq = cutOffFreq; 

     channels = sourceProvider.WaveFormat.Channels; 
     filters = new BiQuadFilter[channels]; 
     CreateFilters(); 
    } 

    private void CreateFilters() 
    { 
     for (int n = 0; n < channels; n++) 
      if (filters[n] == null) 
       filters[n] = BiQuadFilter.LowPassFilter(44100, cutOffFreq, 1); 
      else 
       filters[n].SetLowPassFilter(44100, cutOffFreq, 1); 
    } 

    public WaveFormat WaveFormat { get { return sourceProvider.WaveFormat; } } 

    public int Read(float[] buffer, int offset, int count) 
    { 
     int samplesRead = sourceProvider.Read(buffer, offset, count); 

     for (int i = 0; i < samplesRead; i++) 
      buffer[offset + i] = filters[(i % channels)].Transform(buffer[offset + i]); 

     return samplesRead; 
    } 

這是正確的嗎?

+0

你的問題到底是什麼?你想要達到什麼目的,你嘗試了什麼,爲什麼它不符合你的期望? – nvoigt 2014-10-08 10:05:22

+0

我想用低通濾波器過濾我的音頻。我怎麼做? BiQuadFilter.LowPassFilter方法如何知道哪些音頻應該用作輸入?這裏LowPassFilter的結果存儲在'r'中,而閱讀器是WaveFileReader的對象,它存儲要播放哪個音軌。我如何將低通濾波器的效果與我的音頻集成在一起,只有低於1500 Hz的頻率才能播放? – Chuker 2014-10-08 17:22:57

+1

你的代碼看起來不錯!我沒有發現任何錯誤。我只是好奇你是如何管理字節/浮點數問題的。我想你的班級沒有實施NAudio.Wave.IWaveProvider接口... – 2014-10-27 09:03:44

回答

1

BiQuadFilter有一個方法Transform(float[] inBuffer, float[] outBuffer)這可能適合你。要進行轉換,我會創建一個IWaveProvider,它調用該方法。

IWaveProvider是一個提供音頻數據的類。我建議設置音頻數據的源在構造函數:

public class MyWaveProvider : NAudio.Wave.IWaveProvider 
{ 
    private readonly NAudio.Wave.IWaveProvider inWaveProvider; 

    public MyWaveProvider(NAudio.Wave.IWaveProvider inWaveProvider) 
    { 
     this.inWaveProvider = inWaveProvider; 
     this.WaveFormat = inWaveProvider.WaveFormat; 
    } 

    public NAudio.Wave.WaveFormat WaveFormat { get; private set; } 

    public int Read(byte[] outBuffer, int offset, int count) 
    { 
     return this.inWaveProvider.Read(outBuffer, offset, count); 
    } 
} 

您在字節從源讀取和寫入到目標緩衝區的Read()方法見。此時,您可以使用BiQuadFilter.Transform(float [] inBuffer,float [] outBuffer)來操作數據。我將類型不一致作爲練習給你。我真的不知道。

當你拉皮條的Read()方法來使用你的BiQuadFilter.Transfrom()方法,您可以撥打下面的代碼:

var r = BiQuadFilter.LowPassFilter(44100, 1500, 1); 
var reader = new WaveFileReader(File.OpenRead(@"D:1.wav")); 
var filter = new MyWaveProvider(reader, r); // reader is the source for filter 
var waveOut = new WaveOut(); 
waveOut.Init(filter); // filter is the source for waveOut 
waveOut.Play(); 

祝您好運!

+0

請問您能詳細說明一下嗎? – Chuker 2014-10-13 13:23:10

+1

謝謝! 但MyWaveProvider類有一個參數,它的構造和在創建一個對象,我們傳遞兩個參數:( 另外,如果我只是使用變換方法,它將如何適用低通濾波器的影響?:( – Chuker 2014-10-19 07:12:01

+0

的'MyWaveProvider你可以修改'Read()'方法來做你想做的事情(「[...]操縱數據[...]」) – 2014-10-20 09:56:55

0

創建一個派生自ISampleProvider的類,然後在Read方法中,將來自源的樣本通過BiQuadFilterTransform方法傳遞。作爲一個例子,看看NAudio WPF演示中的source for the Equalizer class

+0

謝謝,但我是一個新手,並且我無法準確理解該怎麼做 – Chuker 2014-10-10 04:47:35

+0

@Mark Heath的任何建議 – Chuker 2014-10-12 11:10:33

+0

transform方法返回float SetLowPassFilter返回BiQuadFilter類型。如何將其轉換爲WAV文件並播放? – Chuker 2014-10-14 16:23:21