2017-10-13 16 views
2

MathNet 필터를 사용하여 신호에 대역 통과 필터를 적용하려고합니다. 정확한 방법으로 MathNet.Filtering.OnlineFiter.CreateBandpass(..) 메서드를 사용하고 있습니다.MathNet.Filtering Bandpass parameters

예상되는 결과를 얻지 못하고이 메서드의 매개 변수로 혼란스러워지고 있습니다. 1Khz에서 샘플링 된 신호가 있고 4 ~ 6Hz 범위를 벗어나는 모든 것을 제거하고 싶습니다. CreateBandpass(..) 메서드를 호출하는 올바른 방법은 무엇입니까?


주석의 요청에 따라이 코드입니다

편집 : (30)처럼 (

OnlineFilter bandPass = CreateBandpass(ImpulseResponse.Finite, samplingRate, 3, 7); 
postProcessedData = bandPass.ProcessSamples(preProcessedData); 

소스는 약간의 상대적으로 높은 주파수의 노이즈가 정확히 5 Hz에서 사인파이다 -70 Hz); 신호의 진폭은 0에 중심을 둔 약 20 피크 피크입니다 (그래서 -10에서 +10). 필터링 된 신호는 2.1


P.S.로, 노이즈와 진폭, 피크 - 피크 5 Hz에서 정현파 인

이 과정은 테스트 파형에서도 마찬가지입니다. 순수한 사인파 (주파수가 무엇이든)를 생성하고 주파수 주위에서 필터링하면 동일한 주파수와 완전히 관련없는 진폭의 사인파를 얻습니다. 반면에 FFT (여전히 MathNet을 사용하여) 웨이브를 사용하고 관심이없는 컴포넌트를 제거하면 예상되는 진폭으로 웨이브를 재구성하고 노이즈로부터 완전히 제거 할 수 있습니다.

+0

enter image description here

나는 꽤 괜찮은 결과를 얻을 수 있습니다. 정확히 당신에게 좋지 않은 것은 무엇입니까? 코드를 게시하십시오. – jsanalytics

답변

1

신호가 5Hz이고 잡음이 30-70Hz 인 경우 실제로는 대역 통과 필터가 필요하지 않으며 저역 통과가 필요합니다. 또한, 약간의 감쇠가 예상되지만, 귀하의 경우에는 약간 과도한이며 이유는 ... 귀하의 필터가 너무 좁습니다. 컷오프 주파수가 낮은 저역 통과를 사용하거나, 10Hz라고 가정 해 봅시다. 또는 0-10Hz의 저/고지 컷오프가있는 대역 통과를 사용하십시오. 아래 샘플에서는 이러한 옵션을 비교하여 보여줍니다. 놀랍지 않게도 동일한 10Hz 대역폭의 저역 통과 및 대역 통과 필터 결과는 예상대로 정확하게 일치합니다.

//signal + noise 
    double fs = 1000; //sampling rate 
    double fw = 5; //signal frequency 
    double fn = 50; //noise frequency 
    double n = 5; //number of periods to show 
    double A = 10; //signal amplitude 
    double N = 1; //noise amplitude 
    int size = (int)(n * fs/fw); //sample size 

    var t = Enumerable.Range(1, size).Select(p => p * 1/fs).ToArray(); 
    var y = t.Select(p => (A * Math.Sin(2 * pi * fw * p)) + (N * Math.Sin(2 * pi * fn * p))).ToArray(); //Original 

    //lowpass filter 
    double fc = 10; //cutoff frequency 
    var lowpass = OnlineFirFilter.CreateLowpass(ImpulseResponse.Finite, fs, fc); 

    //bandpass filter 
    double fc1 = 0; //low cutoff frequency 
    double fc2 = 10; //high cutoff frequency 
    var bandpass = OnlineFirFilter.CreateBandpass(ImpulseResponse.Finite, fs, fc1, fc2); 

    //narrow bandpass filter 
    fc1 = 3; //low cutoff frequency 
    fc2 = 7; //high cutoff frequency 
    var bandpassnarrow = OnlineFirFilter.CreateBandpass(ImpulseResponse.Finite, fs, fc1, fc2); 

    double[] yf1 = lowpass.ProcessSamples(y); //Lowpass 
    double[] yf2 = bandpass.ProcessSamples(y); //Bandpass 
    double[] yf3 = bandpassnarrow.ProcessSamples(y); //Bandpass Narrow