Passe-bas de type Butterworth de Filtrage sur MATLAB
J'ai écrit un code très simple pour supprimer le bruit d'un signal. Le signal est simplement une onde sinusoïdale, le bruit est une matrice aléatoire, et le bruit du signal est le plus des deux.
Le code est:
close all;clear;clc;
%% Declarations
ts = 0.001;
fs = 1/ts;
fc = 5;
t = 0:ts:2;
Wn = pi*fc/(2*fs);
n = 3;
%% Preparation
signal = cos(2*pi*fc*t);
noise = rand(1, length(signal)); % Generating Random Noise
noisySignal = signal + noise;
%% Filtering Stage
[b,a] = butter(n, Wn, 'low');
filteredSignal = filter(b, a, noisySignal);
filteredSignal = filteredSignal - mean(filteredSignal); % Subtracting the mean to block DC Component
%% Plotting
figure(1)
subplot(3,1,1)
plot(t, signal, 'linewidth', 1.5)
title('Signal')
ylim([-1.5 1.5])
grid minor
subplot(3,1,2)
plot(t, noise)
title('Noise')
ylim([-1.5 2])
grid minor
subplot(3,1,3)
plot(t, noisySignal)
title('Noisy Signal')
ylim([-1.5 1.5])
grid minor
figure(2)
plot(t, filteredSignal, 'r', 'linewidth', 1.5)
hold on
plot(t, signal, 'linewidth', 1.5)
hold off
legend('Filtered Signal', 'Original Signal')
grid minor
ylim([-1.5 1.5])
La Figure 2; la figure pour comparer le signal filtré et le signal d'origine; toujours apparaître comme l'image ci-dessous.
Je crois que le Wn
variable n'est pas droit, mais je ne sais pas comment calculer la bonne fréquence normalisée.
Vous devez vous connecter pour publier un commentaire.
Suivantes cet exemple de formulaire Matlab documentation, si vous voulez la fréquence de coupure à être à
fc
Hz à une fréquence d'échantillonnage defs
Hz, vous devez utiliser:Cependant vous devriez noter que ceci va produire un filtre de Butterworth avec une atténuation de 3 db à la fréquence de coupure. Depuis votre signal sinusoïdal est généré à une fréquence
fc
, le filtre sinusoïdal aurait une amplitude de près de 70% du signal original:Si vous voulez moins de l'atténuation du signal, vous devez augmenter la fréquence de coupure du filtre. Bien sûr, cela permettra également de laisser un peu plus de bruit à travers, de sorte que le montant exact est un compromis entre sur la façon dont beaucoup de l'atténuation du signal de votre application peut tolérer et comment beaucoup de bruit, vous devez vous débarrasser de. Par exemple, l'ajout d'une marge de 1Hz et l'augmentation de l'ordre de filtrage (qui vous donne moins d'atténuation pour la même marge) avec
vous donnerait:
rand()
a une distribution uniforme dans l'intervalle(0,1)
, qui compense l'entrée en moyenne de 0,5. Pour un impartiale bruit que vous pourriez vouloir utiliser(2*rand(...)-1)
(distribution uniforme dans l'intervalle(-1,1)
) ourandn(...)
(distribution Gaussienne).