2017-10-13 6 views
2

J'essaie d'utiliser des filtres MathNet pour appliquer un filtre passe-bande à un signal; J'utilise la méthode MathNet.Filtering.OnlineFiter.CreateBandpass(..), pour être précis. Le problème est que je n'obtiens pas les résultats attendus et que les paramètres de la méthode me rendent confus. J'ai un signal échantillonné à 1Khz, et je veux tout enlever en dehors de la plage de 4 à 6 Hz. Quelle est la bonne façon d'appeler la méthode CreateBandpass(..)?MathNet.Filtering Bandpass paramètres


Modifier

Ce code, comme demandé dans un commentaire:

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

La source est une sinusoïde exactement 5 Hz avec un bruit de fréquence relativement élevée (comme 30 -70 hz); l'amplitude du signal est d'environ 20 crête-crête, centrée sur 0 (donc -10 à +10). Le signal filtré est un signal sinusoïdal à 5 ​​Hz, pas de bruit et une amplitude, crête à crête, de 2,1


P.S.

Cela se produit également avec une onde de test. Si a générer une onde sinusoïdale pure (quelle que soit la fréquence) et la filtrer autour de sa fréquence, j'obtiens une sinusoïde de même fréquence et une amplitude totalement indépendante. Par contre si je FFT (toujours en utilisant MathNet) l'onde et enlevez les composants qui ne m'intéressent pas, je peux alors reconstruire l'onde à l'amplitude attendue et la nettoyer totalement du bruit.

+0

j'obtenir des résultats assez décent. Qu'est-ce qui n'est pas bon pour toi? Postez votre code. – jsanalytics

Répondre

1

Si votre signal est à 5Hz et votre bruit à 30-70Hz, vous n'avez pas vraiment besoin d'un filtre passe-bande, un passe-bas le fera. En outre, une certaine atténuation est attendue, bien que dans votre cas est un peu excessive, et la raison en est ... votre filtre est trop étroit. Utilisez soit un passe-bas avec une fréquence de coupure de, disons 10Hz, soit un passe-bande avec une coupure basse/haute de 0-10Hz. L'exemple ci-dessous montre une comparaison entre ces options. Notez que, sans surprise, les résultats du filtre passe-bas et passe-bande, avec la même bande passante 10Hz, correspondent exactement, comme prévu.

enter image description here

//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