MATLAB - 滤波器函数



MATLAB 中的 filter 函数是一个强大的工具,用于处理一维 (1-D) 数字信号。它使您可以将数字滤波器应用于您的数据,从而实现噪声减少、平滑和特征提取等任务。

语法

filter 函数的语法为 **y = filter(b, a, x)**,它使用由分子系数 b 和分母系数 a 来表征的有理传递函数对输入数据 x 应用滤波。

根据输入数据类型:

  • 如果 x 是向量,则 filter 函数将生成向量形式的滤波数据,大小与原始 x 相同。
  • 当 x 是矩阵时,filter 沿第一维(列)操作,并返回矩阵每一列的滤波数据。
  • 如果 x 是多维数组,filter 将沿大小不等于 1 的数组的第一维操作。

MATLAB 滤波器函数示例

以下是关于 matlab 滤波器函数的一些示例:

示例 1:移动平均滤波器

移动平均滤波器是一种常用的数字信号处理技术,用于平滑或减少时间序列数据中的噪声。

假设您有一个嘈杂的一维信号,并且想要应用一个简单的移动平均滤波器来平滑它。以下是如何为此目的使用 filter 函数:

% Define the moving average filter coefficients
b = [1/3, 1/3, 1/3]; % Numerator coefficients
a = 1; % Denominator coefficients

% Generate a noisy signal
t = 0:0.1:10;
x = sin(t) + 0.3 * randn(size(t));

% Apply the filter
y = filter(b, a, x);

% Plot the original and filtered signals
subplot(2, 1, 1);
plot(t, x, 'b', 'LineWidth', 2);
title('Original Noisy Signal');
xlabel('Time');
ylabel('Amplitude');

subplot(2, 1, 2);
plot(t, y, 'r', 'LineWidth', 2);
title('Filtered Signal (Moving Average)');
xlabel('Time');
ylabel('Amplitude');

在这个例子中,我们定义了一个具有系数 **b** 和 **a** 的移动平均滤波器。

系数根据移动平均滤波器定义。在这种情况下,**b** 表示分子系数,即 [1/3, 1/3, 1/3],表示窗口中的每个数据点对平均值的贡献相同。**a** 表示分母系数,对于移动平均滤波器,它通常设置为 1。

噪声信号是通过使用从 0 到 10 且步长为 0.1 的时间向量 t 创建的。然后,通过向正弦波信号添加随机噪声 (使用 randn 生成) 来生成噪声信号 x。这模拟了一个添加了噪声的信号。

filter 函数用于将移动平均滤波器 (b 和 a) 应用于噪声信号 x,从而产生滤波信号 y。

一个包含两个子图(两行一列)的图形。在第一个子图中,您使用蓝色粗线绘制原始噪声信号 x,并标记坐标轴。在第二个子图中,您使用红色粗线绘制滤波信号 y,并标记坐标轴。

在 matlab 中执行代码后的输出为:

filtered_signal.jpg

示例 2:滤波矩阵行

我们将使用有理传递函数对矩阵行进行滤波。有理传递函数描述了控制理论和信号处理中输入和输出之间的关系。它是用于建模和分析随时间响应输入的系统行为的基本概念。

让我们首先定义有理传递函数的分子和分母系数。

b = 1;
a = [1 -0.2];

**b = 1;** - 在这一行中,b 设置为 1。这对应于滤波器传递函数的分子系数,表示滤波器不修改输入。

**a = [1 -0.2];** - a 表示滤波器传递函数的分母系数。系数 [1 -0.2] 定义了一个简单的无限脉冲响应 (IIR) 滤波器,其在 0.2 处有一个单极点。此滤波器将具有平滑效果。

让我们生成值为 2 到 15 的随机矩阵 x。

% Initialize the random number generator with the default seed
rng default;

% Generate a random matrix x with 2 rows and 15 columns
x = rand(2, 15)

**rng default;** - 此命令使用其默认种子初始化 MATLAB 随机数生成器。将随机数生成器设置为其默认状态可确保您获得可重复的随机数。

**x = rand(2, 15);** - 在这里,生成一个 2x15 矩阵 x,其中包含从 0 到 1 之间的均匀分布中抽取的随机值。此矩阵表示您的输入数据。

让我们在输入 x 上使用 filter 函数

y = filter(b, a, x, [], 2);

**y = filter(b, a, x, [], 2);** - filter 函数用于使用指定的系数 b 和 a 沿第二维(列)对输入矩阵 x 进行滤波。空括号 [] 表示未提供初始条件。结果存储在 y 中,表示滤波后的数据。

让我们创建一个索引向量来绘制图形

t = 0:length(x) - 1;

**t = 0:length(x) - 1;** - 此行创建一个索引向量 t,其范围从 0 到输入数据长度减 1。

现在让我们编写数据绘图代码:

plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')

完整的代码如下:

rng default  %initialize random number generator
x = rand(2,15);

b = 1;
a = [1 -0.2];

y = filter(b,a,x,[],2);

t = 0:length(x)-1;  %index vector

plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')

plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')

matlab 中的输出如下:

first row
广告
© . All rights reserved.