【问题标题】:Lowpass Butterworth Filtering on MATLABMATLAB 上的低通巴特沃斯滤波
【发布时间】:2017-04-26 18:00:20
【问题描述】:

我一直在编写一个非常简单的代码来消除信号中的噪声。信号只是一个正弦波,噪声是一个随机矩阵,噪声信号是两者的相加。

代码是:

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这个变量不对,但是我不知道如何计算正确的归一化频率。

【问题讨论】:

    标签: matlab signals signal-processing lowpass-filter


    【解决方案1】:

    this example form Matlab's documentation 之后,如果您希望在采样频率为fsHz 时截止频率为fcHz,您应该使用:

    Wn = fc/(fs/2);
    [b,a] = butter(n, Wn, 'low');
    

    但是您应该注意,这将产生一个在截止频率处衰减 3dB 的巴特沃斯滤波器。由于您的正弦信号是以fc 的频率生成的,因此滤波后的正弦信号的幅度约为原始信号的 70%:

    如果您想要减少信号衰减,您应该增加滤波器的截止频率。当然,这样做也会让更多的噪声通过,因此确切的数量是在应用程序可以容忍多少信号衰减和需要消除多少噪声之间进行权衡。例如,添加 1Hz 的边距并增加滤波器阶数(在相同的边距下减少衰减)

    Wn = (fc+1)/(fs/2);
    n = 7;
    [b,a] = butter(n, Wn, 'low');
    

    会给你:

    【讨论】:

    • 滤波后的信号有偏移对吗?
    • 您使用rand() 添加的噪声在(0,1) 范围内均匀分布,平均偏移输入0.5。对于无偏噪声,您可能需要使用(2*rand(...)-1)(-1,1) 范围内的均匀分布)或randn(...)(高斯分布)。
    • 非常感谢详细的解释??
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2017-12-21
    • 1970-01-01
    • 2015-07-28
    • 2014-01-22
    相关资源
    最近更新 更多