MATLAB 上的低通巴特沃斯滤波
Lowpass Butterworth Filtering on MATLAB
我一直在编写一个非常简单的代码来消除信号中的噪声。信号只是正弦波,噪声是随机矩阵,噪声信号是两者相加
密码是:
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])
图2;这是比较滤波后的信号和原始信号的图;总是出现如下图。
我认为 Wn
变量不对,但我不知道如何计算正确的归一化频率。
在this example form Matlab's documentation之后,如果你希望在fs
Hz的采样频率下截止频率为fc
Hz,你应该使用:
Wn = fc/(fs/2);
[b,a] = butter(n, Wn, 'low');
但是您应该注意,这将产生一个在截止频率处衰减 3dB 的巴特沃斯滤波器。由于您的正弦信号是以频率 fc
生成的,因此过滤后的正弦信号的幅度约为原始信号的 70%:
如果你想减少信号衰减,你应该增加滤波器的截止频率。当然,这样做也会让更多的噪声通过,因此确切的数量是应用程序可以容忍的信号衰减量和需要消除的噪声量之间的 trade-off。例如,添加 1Hz 的余量并增加滤波器阶数(对于相同的余量可以减少衰减)
Wn = (fc+1)/(fs/2);
n = 7;
[b,a] = butter(n, Wn, 'low');
会给你:
我一直在编写一个非常简单的代码来消除信号中的噪声。信号只是正弦波,噪声是随机矩阵,噪声信号是两者相加
密码是:
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])
图2;这是比较滤波后的信号和原始信号的图;总是出现如下图。
我认为 Wn
变量不对,但我不知道如何计算正确的归一化频率。
在this example form Matlab's documentation之后,如果你希望在fs
Hz的采样频率下截止频率为fc
Hz,你应该使用:
Wn = fc/(fs/2);
[b,a] = butter(n, Wn, 'low');
但是您应该注意,这将产生一个在截止频率处衰减 3dB 的巴特沃斯滤波器。由于您的正弦信号是以频率 fc
生成的,因此过滤后的正弦信号的幅度约为原始信号的 70%:
如果你想减少信号衰减,你应该增加滤波器的截止频率。当然,这样做也会让更多的噪声通过,因此确切的数量是应用程序可以容忍的信号衰减量和需要消除的噪声量之间的 trade-off。例如,添加 1Hz 的余量并增加滤波器阶数(对于相同的余量可以减少衰减)
Wn = (fc+1)/(fs/2);
n = 7;
[b,a] = butter(n, Wn, 'low');
会给你: