matlab实现滑动平均滤波(一)

最近时间在研究滤波算法,目的是为了更好的识别音频数据。因为有些音频数据里面的杂波太多,很难识别,所以需要先对其进行过滤,才能解析识别。为此,我先在matlab上做了仿真.采用的很多滤波算法,最后选择了对我这个效果最好的,滑动均值滤波。

什么是滑动均值滤波

滑动平均滤波就是把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样得到一个新数据放到队尾,并丢掉原来队首的一次数据,把队列中的N个数据进行平均运算,就可以获得新的滤波结果

具体的matlab代码

clear
clc
load boxinfo.mat  %载入音频数据
T = data;
figure(1)
plot(T,'-*')
title('原始数据')
hold on;
%% 
%滑动平滑滤波
L = length(T);
N=10;  % 窗口大下
k = 0;
m =0 ;
for i = 1:L
    m = m+1;
    if i+N-1 > L
        break
    else
        for j = i:N+i-1
            k = k+1;
            W(k) = T(j) ;
        end
        T1(m) = mean(W);
        k = 0;
    end
end
plot(T1,'r-o')
grid
legend('原始数据','滤波之后')

滤波前后对比图


滤波前后对比图
简单分析一下

经过滑动滤波之后,波形整体变得平滑,这里我们重点关注一下x轴附近的点,可以发现,在波形与x轴交叉的地方,波形都平稳过度,这极大方便的我们后期进行统计。

窗口大小选择

从代码中我们可以发现窗口大小我们选择的是10,如何选择窗口大小,这里我们需要进行一些简单的分析和测试。如果x轴附近的噪点数量(一上一下)比较多,那么窗口大小就应该大一些,反之,小一些。但是过大又会出现过拟合的现象,所以可以多取几个值,然后对比一下,选择一个最好的即可。

不同的窗口大小对比图


不同的窗口大小对比图

简单分析一下

从图中我们可以很明显的看出,当N=4的时候,滤波效果还不是很好,在x轴附近依然有噪点(一上一下),当N=7的时候,已经基本满足我们的要求,图形已经可以很平稳的过度了,但是从右边的标记处可以看出还是不是很平稳,所以可以继续提高N值,当N=10的时候,波形就完全能够达到我们的要求,所以取10即可。

  • 12
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 滑动平均滤波是一种常用的信号处理方法,用于平滑信号中的噪声。在MATLAB中,可以使用以下代码实现滑动平均滤波。 首先,定义一个输入信号向量x和滑动窗口大小n。 ```matlab x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % 输入信号向量 n = 3; % 滑动窗口大小 ``` 然后,使用for循环遍历输入信号向量,计算每个窗口的平均值,并将结果存储在一个新的向量中。 ```matlab y = zeros(1, length(x)); % 存储滤波后的信号 for i = 1:length(x) if i <= n y(i) = mean(x(1:i)); % 计算前n个元素的平均值 else y(i) = mean(x(i-n+1:i)); % 计算窗口大小为n的平均值 end end ``` 最后,可以通过绘制输入信号向量和滑动平均滤波后的信号向量来比较它们。 ```matlab plot(x, 'b'); % 绘制输入信号向量 hold on; plot(y, 'r'); % 绘制滑动平均滤波后的信号向量 legend('原始信号', '滤波后的信号'); ``` 执行上述代码,即可实现滑动平均滤波并绘制结果图。通过调整滑动窗口大小n,可以改变平滑程度。 ### 回答2: 滑动平均滤波是一种常用的信号处理方法,它可以用来平滑时间序列数据,去除噪音和杂波。在MATLAB中,可以通过以下步骤实现滑动平均滤波: 1. 定义输入信号。首先,我们需要定义一个输入信号的向量,例如x = [1, 2, 3, 4, 5]。这个向量包含了我们要平滑处理的原始数据。 2. 定义滑动窗口大小。滑动平均滤波是通过取窗口内数据的平均值来实现的。我们需要定义一个滑动窗口的大小,例如w = 3。这意味着我们每次取3个数据的平均值来平滑数据。 3. 实施滑动平均滤波。使用循环来遍历输入信号向量x,并在每个位置上取滑动窗口大小w内的数据。然后,计算这些数据的平均值,并将其存储在一个新的向量y中。例如,对于第一个滑动窗口,我们需要计算x(1)、x(2)和x(3)的平均值,并将其存储在y(2)中。然后,移动窗口一个位置,计算x(2)、x(3)和x(4)的平均值,并将其存储在y(3)中。以此类推,直到遍历完整个输入信号向量x。 4. 输出滤波后的结果。最后,我们可以输出滤波后的结果y,这个向量包含了经过滑动平均滤波处理后的数据。 下面是一个具体的示例代码: ```matlab x = [1, 2, 3, 4, 5]; % 定义输入信号 w = 3; % 定义滑动窗口的大小 y = zeros(1, length(x)-w+1); % 初始化输出向量 for i = 1:length(y) y(i) = mean(x(i:i+w-1)); % 计算滑动窗口内数据的平均值 end disp(y); % 输出滤波后的结果 ``` 运行这段代码,我们得到的输出结果为[2, 3, 4],这就是经过滑动平均滤波处理后的数据。 ### 回答3: 在Matlab中编写滑动平均滤波,可以使用以下步骤: 1. 首先,确定数据集的大小和滑动窗口的大小。滑动窗口是指在数据集中移动的固定大小的窗口。 2. 使用一个for循环来迭代遍历数据集中的每个数据点。 3. 在每个循环迭代中,确定滑动窗口的起始和结束索引。起始索引可以通过当前数据点的索引减去滑动窗口大小的一半来获得。 4. 确保滑动窗口保持在数据集的边界内。如果滑动窗口超出了数据集的边界,可以根据需要调整滑动窗口的大小或在边界处进行补零。 5. 计算滑动窗口内数据点的平均值。可以使用mean函数来计算滑动窗口内数据点的平均值。 6. 将计算得到的平均值存储在一个新的数组中,以便后续分析。可以使用一个空的数组,在每个循环迭代中将平均值添加到该数组中。 7. 循环迭代结束后,你将得到一个存储了滑动窗口平均值的数组。 下面是一个简单的示例代码: ```matlab data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % 数据集 window_size = 3; % 滑动窗口大小 filtered_data = zeros(size(data)); % 存储滤波后的数据 for i = 1:length(data) start_index = i - floor(window_size/2); end_index = i + floor(window_size/2); % 确保滑动窗口在数据集范围内 if start_index < 1 start_index = 1; end if end_index > length(data) end_index = length(data); end % 计算滑动窗口内数据点的平均值 average = mean(data(start_index:end_index)); % 将平均值存储在新数组中 filtered_data(i) = average; end disp(filtered_data); % 输出滤波后的数据 ``` 这段代码将根据给定的数据集和滑动窗口大小计算滑动平均滤波,并输出滤波后的数据。注意,这个例子是简化的,实际中你可能需要根据具体需求进行优化和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值