Pourquoi mon filtre de bande d'arrêt atténue-t-il les autres fréquences?

12

Voici mon code pour un signal à deux tons, où j'utilise une bande d'arrêt pour supprimer la tonalité plus élevée, puis tracé le avant (en bleu) et après (en rouge) dans le domaine fréquentiel après avoir convolu mon signal avec les coefficients de filtre .

Si vous mettez ce code dans Matlab, vous pouvez clairement voir que la fréquence supérieure a été supprimée avec succès par le filtre, mais pour une raison quelconque, l'amplitude de la fréquence inférieure a été réduite de moitié, et plus j'augmente le nombre de coefficients de filtre, plus cela aplatit toute ma courbe, pourquoi cela se produit-il? Et comment puis-je l'empêcher pour que la bande d'arrêt ne se propage pas vers l'extérieur? Voici l'image et le code:

entrez la description de l'image ici

fSampling = 8000;
tSampling = 1 / fSampling;

t = 0: t Échantillonnage: 0,005;
F0 = 1000;
F1 = 3000;

xt = sin (2 * pi * F0 * t) + sin (2 * pi * F1 * t);
ht = fir1 (40, 0,25, «stop»);
yt = conv (xt, ht);

fAxis = -4000: 125: 4000-125;

xF = fft (xt, 64);
MagXF = fftshift (abs (xF));

tracé (fAxis, MagXF);
attendez

yF = fft (yt, 64);
MagYF = fftshift (abs (yF));

plot (fAxis, MagYF, 'r')
Zaubertrank
la source
1
Le filtrage passe-bande / coupe-bande est intrinsèquement imparfait et affectera toujours les zones du spectre que vous souhaitez laisser seul. C'est la nature de la bête.
Daniel R Hicks
1
Hmm ... existe-t-il des moyens de contrer cela? Ou un autre filtre relativement simple qui serait mieux adapté? Je ne connais pas grand-chose aux filtres coupe-bande, mais je sais que ce sont des filtres coupe-bande vraiment étroits et que Matlab a des commandes pour eux.
Zaubertrank
2
Comme je l'ai dit, c'est inhérent. La conception d'un filtre est toujours un compromis en termes d'optimisation de certains paramètres aux dépens des autres (et aux dépens des dépenses).
Daniel R Hicks

Réponses:

12

Les filtres ont toujours un "roll-off" inhérent à leur réponse en fréquence, car vous ne pouvez pratiquement pas réaliser une bande passante qui est une fonction rectangulaire parfaite. Pour un filtre passe-bas, le point où la magnitude de votre réponse en fréquence chute à -3 dB est appelé la bande passante et tout ce qui est au-delà est appelé la bande d'arrêt (techniquement, tout ce qui dépasse la fréquence du coin, mais nous prendrons la la fréquence de coin doit être le niveau -3 dB). La vitesse à laquelle votre réponse en fréquence s'atténue au-delà de la bande passante dépend de la longueur du filtre.

Si vous regardez la réponse en fréquence de votre filtre, htvous verrez qu'elle chute à -6 dB à 1000 Hz:

entrez la description de l'image ici

Il est donc logique que la puissance diminue de 6 dB après le filtrage, ce que vous voyez dans votre figure comme une réduction de moitié de l'amplitude.

Si vous aviez regardé la documentation de la fir1fonction que vous avez utilisée, vous l'auriez réalisé aussi (c'est moi qui souligne):

B = fir1(N,Wn)conçoit un Nfiltre numérique FIR passe-bas d'ordre 3 et renvoie les coefficients de filtre en N+1vecteur de longueur B. La fréquence de coupure Wn doit être comprise entre 0 < Wn < 1.0, 1.0 correspondant à la moitié de la fréquence d'échantillonnage. Le filtre Best réel et a une phase linéaire. Le gain normalisé du filtre à Wn est de -6 dB.

Maintenant, pour créer des filtres plus nets, avec des réponses qui se rapprochent assez d'un rectangle, vous devrez utiliser des filtres IIR, qui viennent avec leur propre hôte de problèmes de stabilité, etc., mais certainement une option. Vous pouvez voir ma réponse ici pour quelques idées sur la mise en œuvre d'un filtre IIR de section 2 de forme discrète de deuxième ordre qui donne des coins très nets. L'exemple existe pour un filtre passe-bande, mais vous pouvez lire les documents pour les fonctions qui y sont utilisées et implémenter vous-même une version passe-bas.

Lorem Ipsum
la source
1

Il faut du temps pour qu'un filtre "décide" si un signal est juste à l'intérieur ou juste à l'extérieur d'une transition de filtre. Une solution consiste à simplement éloigner la transition du filtre de tout signal d'intérêt, comme à mi-chemin entre vos deux signaux de test, où, dans votre cas de test, il y a très peu de signal à déformer par une décision imparfaite.

hotpaw2
la source
0

Utilisation

ht = fir1(40,.5,'stop');

à la place, et vous aurez une très faible atténuation à F0 et une très forte atténuation à F1.

entrez la description de l'image ici

Telaclavo
la source