2017-04-25 1 views
1

그래서 Mathnet 필터링 라이브러리를 사용하여 C#에서 로우 패스 필터를 구현하려고했습니다. 메서드에 필터 계수를 만드는 방법을 모르므로 문제가 있습니다. 누군가가 컷오프 주파수를 지정하는 방법을 말해 줄 수 있습니까? (단위당 샘플이어야합니다)? 예를 들어, 컷오프 주파수를 400Hz로 원한다면, 단위 당 샘플의 주파수는 얼마입니까? 감사합니다. .Mathnet 컷오프 주파수 필터링

public Filter(ISampleProvider _source, long Length, int _cutoff) 
    { 
     source = _source; 
     cutoffFrequency = _cutoff; 

     float[] s = new float[Length]; 
     _source.Read(s, 0, (int)Length); 
     Normalize(s); 

     var coefficients = MathNet.Filtering.FIR.FirCoefficients.LowPass(_source.WaveFormat.SampleRate, (double)400/ ((double)source.WaveFormat.SampleRate/(double)Length), 2); 
     MathNet.Filtering.FIR.OnlineFirFilter filter = new MathNet.Filtering.FIR.OnlineFirFilter(coefficients); 
     double[] output = Array.ConvertAll(s, x => (double)x); 

     double[] output2 = filter.ProcessSamples(output); 

     output1 = new float[output2.Length]; 
     for (int i = 0; i < output2.Length; i++) 
     { 
      output1[i] = Convert.ToSingle(output2[i]); 
     } 

    } 

내 신호의 주파수 해상도하지만 신호가 전혀 변경하지 않는 것 이런 식으로 내 원하는 frequncy를 분할 시도했습니다.

답변

0

저는 최근에이 라이브러리를 실험 해 왔습니다.

  double samplingRate = 2000000; 
      double cutoffFreq = 125000; 
      int filterWidth = 130; 

      var mathNetCoeffs = MathNet.Filtering.FIR.FirCoefficients.LowPass(samplingRate, cutoffFreq, filterWidth/2); 
      MathNet.Filtering.Windowing.BlackmanWindow blackmanWindow = new MathNet.Filtering.Windowing.BlackmanWindow(); 
      blackmanWindow.Width = mathNetCoeffs.Length; 
      var windowArr = blackmanWindow.CopyToArray(); 
      for (int i = 0; i < mathNetCoeffs.Length; i++) mathNetCoeffs[i] *= windowArr[i]; 
      MathNet.Filtering.FIR.OnlineFirFilter mathNetFilter = new MathNet.Filtering.FIR.OnlineFirFilter(mathNetCoeffs); 

윈도 윙 함수는 작업 필터를 만들기 위해 매우 중요하다 : 여기 (2 MSPS 입력 및 125 kHz의 컷오프 주파수)를 개선하기 위해 윈도우 함수 전나무 필터를 설정하는 간단한 예이다. Hamming이 또 다른 인기있는 선택이지만 여기 Blackman을 사용하고 있습니다. 그런 다음 ProcessSample 또는 ProcessSamples 호출하여 필터를 사용 : 또한 당신은 실제 필터 폭 (좋은 필터 대칭성) 홀수가되고 싶어요 filterWidth + 1. 실제 필터 폭이 될 것입니다 점에 유의

double mathNetFiltered = mathNetFilter.ProcessSample(value);

를, 그래서 설정 filterWidth를 짝수 값으로 설정합니다.