matlab - MATLAB 上的低通巴特沃斯滤波

标签 matlab signals signal-processing lowpass-filter

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

代码是:

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;下图是滤波后的信号与原始信号的比较图;始终如下图所示。

comparison

我认为 Wn 变量不正确,但我不知道如何计算正确的归一化频率。

最佳答案

已关注 this example form Matlab's documentation ,如果您希望截止频率为 fc Hz,采样频率为 fs Hz,则应使用:

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

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

Filtered signal at cutoff frequency

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

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

会给你:

Filtered signal with some margin

关于matlab - MATLAB 上的低通巴特沃斯滤波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091218/

相关文章:

matlab - 生成有限差分的矩阵

c++ - 如何检查 malloc 是否持有锁

c - 为什么线程函数不调用? (SIGEV_THREAD)

python - 计算 .wav 文件窗口上的功率谱图

Python DSP,自动增益控制(AGC)

image - Matlab DICOM 切片

list - 如何进行设置差异,除非不消除重复元素

arrays - 从向量中获取向量矩阵

c - 为什么 SIGINT 被发送到子进程并且什么都不做?

numpy - 仅沿一个轴进行卷积