信号平滑处理

news2024/10/3 2:17:05

信号平滑处理

此示例说明如何使用移动平均滤波器和重采样来隔离一天中时间的周期性分量对每小时温度读数的影响,以及如何去除开环电压测量中不需要的电线噪声。该示例还说明如何通过使用中位数滤波器对时钟信号的水平进行平滑处理,同时保留边沿。该示例还说明如何使用 Hampel 滤波器去除大的离群值。

目的

通过平滑处理,我们可以发现数据中的重要模式,同时忽略不重要的内容(如噪声)。我们使用滤波来执行这种平滑处理。平滑处理的目标是呈现值的缓慢变化情况,以便更容易看到数据的趋势。

% 有时,当您检查输入数据时,您可能希望平滑处理数据以便看到信号的趋势。
% 在我们的示例中,我们有一组 2011 年 1 月在波士顿洛根机场每小时的摄氏温度读数。
load bostemp

figure
days = (1:31*24)/24;
plot(days, tempC)
axis tight
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

请注意,我们可以直观地看到一天中的时间对温度读数的影响。如果您只关注月内的每日温度变化,则每小时的波动只会产生噪声,使得每日的变化很难辨别。为了去除时间的影响,我们现在希望使用移动平均滤波器来平滑处理数据。

一种移动平均滤波器

移动平均滤波器的最简单形式是其长度为 N 并且取波形的每 N 个连续采样的平均值。

% 为了对每个数据点应用移动平均滤波器,我们构造滤波器的系数,
% 使得每个点的权重相等且占比为总均值的 1/24。这样我们可以得出每 24 小时的平均温度。
hoursPerDay = 24;
coeff24hMA = ones(1, hoursPerDay)/hoursPerDay;

% 使用 filter 函数计算沿数据向量tempC的平均值。
avg24hTempC = filter(coeff24hMA, 1, tempC);%求数据的移动平均值,并绘制其对原始数据的图。
% figure
plot(days,[tempC avg24hTempC])
legend('Hourly Temp','24 Hour Average (delayed)','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

滤波器延迟

请注意,滤波后的输出存在大约 12 个小时的延迟。这是因为我们的移动平均滤波器有延迟。

长度为 N 的任何对称滤波器都存在 (N-1)/2 个采样的延迟。我们可以人为去除这种延迟。

% 长度为 N 的任何对称滤波器都存在 (N-1)/2 个采样的延迟。我们可以人为去除这种延迟。
figure
fDelay = (length(coeff24hMA)-1)/2;
plot(days,tempC,days-fDelay/24,avg24hTempC)
axis tight
legend('Hourly Temp','24 Hour Average','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

提取平均差异

我们也可以使用移动平均滤波器来更好地估计一天中的时间如何影响整体温度。为此,首先从每小时的温度测量值中减去平滑处理后的数据。然后,将差异数据按天数分割,取月中所有 31 天的平均值。

% % % 3.提取平均差异
% 
% 我们也可以使用移动平均滤波器来更好地估计一天中的时间如何影响整体温度。
% 为此,首先从每小时的温度测量值中减去平滑处理后的数据。
% 然后,将差异数据按天数分割,取月中所有 31 天的平均值。
figure
deltaTempC = tempC - avg24hTempC;
deltaTempC = reshape(deltaTempC, 24, 31).';

plot(1:24, mean(deltaTempC))
axis tight
title('Mean temperature differential from 24 hour average')
xlabel('Hour of day (since midnight)')
ylabel('Temperature difference (\circC)')

提取峰值包络

温度信号的高低每天都有变化,有时我们也希望对这种变化有平滑变动的估计。为此,我们可以使用 envelope 函数来连接在 24 小时内的某个时段检测到的极端高点和极端低点。在此示例中,我们确保在每个极端高点和极端低点之间有至少 16 个小时。我们还可以通过取两个极端点之间的平均值来了解高点和低点的趋势。

% % % 4.提取峰值包络
% 
% 温度信号的高低每天都有变化,有时我们也希望对这种变化有平滑变动的估计。
% 为此,我们可以使用 envelope 函数来连接在 24 小时内的某个时段检测到的极端高点和极端低点。
% 在此示例中,我们确保在每个极端高点和极端低点之间有至少 16 个小时。
% 我们还可以通过取两个极端点之间的平均值来了解高点和低点的趋势。
figure
[envHigh, envLow] = envelope(tempC,16,'peak');%函数envelope(x,np,'peak'):返回x的上、下峰包络。包络由至少np个样本分开的局部极大值上使用样条插值确定。
envMean = (envHigh+envLow)/2;

plot(days,tempC, ...
     days,envHigh, ...
     days,envMean, ...
     days,envLow)
   
axis tight
legend('Hourly Temp','High','Mean','Low','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

加权移动平均滤波器

其他类型的移动平均滤波器并不对每个采样进行同等加权。

另一种常见滤波器遵循 [1/2,1/2]n 的二项式展开。对于大的 n 值,这种类型的滤波器逼近正态曲线。对于小的 n 值,这种滤波器适合滤除高频噪声。要找到二项式滤波器的系数,请对 [1/2,1/2] 进行自身卷积,然后用 [1/2,1/2] 与输出以迭代方式进行指定次数的卷积。在此示例中,总共使用五次迭代。

% % % 5.加权移动平均滤波器
% 
% 其他类型的移动平均滤波器并不对每个采样进行同等加权。
% 
% 另一种常见滤波器遵循 [1/2,1/2]^n 的二项式展开。对于大的 n 值,这种类型的滤波器逼近正态曲线。
% 对于小的 n 值,这种滤波器适合滤除高频噪声。
% 要找到二项式滤波器的系数,请对 [1/2,1/2] 进行自身卷积,
% 然后用 [1/2,1/2] 与输出以迭代方式进行指定次数的卷积。在此示例中,总共使用五次迭代。
h = [1/2 1/2];
binomialCoeff = conv(h,h);
for n = 1:4
    binomialCoeff = conv(binomialCoeff,h);
end

figure
fDelay = (length(binomialCoeff)-1)/2;
binomialMA = filter(binomialCoeff, 1, tempC);
plot(days,tempC, ...
     days-fDelay/24,binomialMA)
axis tight
legend('Hourly Temp','Binomial Weighted Average','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

指数移动平均滤波器

另一种有点类似高斯展开滤波器的滤波器是指数移动平均滤波器。这种类型的加权移动平均滤波器易于构造,并且不需要大的窗大小。

% % % 6.指数移动平均滤波器
% 
% 另一种有点类似高斯展开滤波器的滤波器是指数移动平均滤波器。
% 这种类型的加权移动平均滤波器易于构造,并且不需要大的窗大小。
% 
% 您可以通过介于 0 和 1 之间的 alpha 参数来调整指数加权移动平均滤波器。
% alpha 值越高,平滑度越低。
alpha = 0.45;
exponentialMA = filter(alpha, [1 alpha-1], tempC);
plot(days,tempC, ...
     days-fDelay/24,binomialMA, ...
     days-1/24,exponentialMA)

axis tight
legend('Hourly Temp', ...
       'Binomial Weighted Average', ...
       'Exponential Weighted Average','location','best')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')

% 放大一天的读数。
axis([3 4 -5 2]) %设置坐标轴范围,使 x 轴的范围从 3 到 4,y 轴的范围从 -5 到 2。

Savitzky-Golay 滤波器

您会注意到,通过平滑处理数据,极值得到一定程度的削减。

为了更紧密地跟踪信号,您可以使用加权移动平均滤波器,该滤波器尝试以最小二乘方式对指定数量的采样进行指定阶数的多项式拟合。

% % % 7.Savitzky-Golay 滤波器
% 
% 您会注意到,通过平滑处理数据,极值得到一定程度的削减。
% 
% % 为了更紧密地跟踪信号,您可以使用加权移动平均滤波器,
% 
% 该滤波器尝试以最小二乘方式对指定数量的采样进行指定阶数的多项式拟合。
% 
% 为了方便起见,您可以使用函数 sgolayfilt 来实现 Savitzky-Golay 平滑滤波器。
% % 要使用 sgolayfilt,请指定一个奇数长度段的数据和严格小于该段长度的多项式阶。
% sgolayfilt 函数在内部计算平滑多项式系数,执行延迟对齐,
% 并处理数据记录开始和结束位置的瞬变效应。
figure
% 函数sgolayfilt(x,order,framelen)
% 用sgolayfilt平滑tempC。指定多项式阶数为3,帧长为7。
% 帧长必须为奇数,且阶数必须小于帧长。
cubicMA   = sgolayfilt(tempC, 3, 7);
quarticMA = sgolayfilt(tempC, 4, 7);
quinticMA = sgolayfilt(tempC, 5, 9);
plot(days,[tempC cubicMA quarticMA quinticMA])%绘制原始信号和平滑信号。
legend('Hourly Temp','Cubic-Weighted MA', 'Quartic-Weighted MA', ...
       'Quintic-Weighted MA','location','southeast')
ylabel('Temp (\circC)')
xlabel('Time elapsed from Jan 1, 2011 (days)')
title('Logan Airport Dry Bulb Temperature (source: NOAA)')
axis([3 5 -5 2])

重采样

有时,为了正确应用移动平均值,对信号进行重采样是有益的。

% % % 8.重采样
%
% 有时,为了正确应用移动平均值,对信号进行重采样是有益的。
% 
% 在下一个示例中,我们对某模拟仪器输入端的开环电压进行采样,
% 其中存在 60 Hz 交流电源线噪声的干扰。我们以 1 kHz 采样率对电压进行了采样。
figure
load openloop60hertz
fs = 1000;%采样率
t = (0:numel(openLoopVoltage)-1) / fs;

plot(t,openLoopVoltage)
ylabel('Voltage (V)')
xlabel('Time (s)')
title('Open-loop Voltage Measurement')

现在我们尝试通过使用移动平均滤波器来去除电源线噪声的影响。

如果您构造一个均匀加权的移动平均滤波器,它将去除相对于滤波器持续时间而言具有周期性的任何分量。

% 以 1000 Hz 采样时,在 60 Hz 的完整周期内,大约有 1000 / 60 = 16.667 个采样。
% 我们尝试“向上舍入”并使用一个 17 点滤波器。
% 这将在 1000 Hz / 17 = 58.82 Hz 的基频下为我们提供最大滤波效果。
figure
plot(t,sgolayfilt(openLoopVoltage,1,17))
ylabel('Voltage (V)')
xlabel('Time (s)')
title('Open-loop Voltage Measurement')
legend('Moving average filter operating at 58.82 Hz', ...
       'Location','southeast')

请注意,虽然电压明显经过平滑处理,但它仍然包含小的 60 Hz 波纹。

如果我们对信号进行重采样,以便通过移动平均滤波器捕获 60 Hz 信号的完整周期,就可以显著减弱该波纹。

% 如果我们以 17 * 60 Hz = 1020 Hz 对信号进行重采样,
% 可以使用 17 点移动平均滤波器来去除 60 Hz 的电线噪声。
figure
fsResamp = 1020;
vResamp = resample(openLoopVoltage, fsResamp, fs);
tResamp = (0:numel(vResamp)-1) / fsResamp;
vAvgResamp = sgolayfilt(vResamp,1,17);
plot(tResamp,vAvgResamp)
ylabel('Voltage (V)')
xlabel('Time (s)')
title('Open-loop Voltage Measurement')
legend('Moving average filter operating at 60 Hz', ...
    'Location','southeast')

中位数滤波器

移动平均滤波器、加权移动平均滤波器和 Savitzky-Golay 滤波器对它们滤波的所有数据进行平滑处理。然而,有时我们并不需要这种处理。例如,如果我们的数据取自时钟信号并且不希望对其中的锐边进行平滑处理,该怎么办?到当前为止讨论的滤波器都不太适用:

% % % 9.中位数滤波器
% 
% 移动平均滤波器、加权移动平均滤波器和 Savitzky-Golay 滤波器对它们滤波的所有数据进行平滑处理。
% 然而,有时我们并不需要这种处理。
% 例如,如果我们的数据取自时钟信号并且不希望对其中的锐边进行平滑处理,该怎么办?到当前为止讨论的滤波器都不太适用:
figure
load clockex

yMovingAverage = conv(x,ones(5,1)/5,'same');
ySavitzkyGolay = sgolayfilt(x,3,5);
plot(t,x, ...
     t,yMovingAverage, ...
     t,ySavitzkyGolay)

legend('original signal','moving average','Savitzky-Golay')

% 移动平均滤波器和 Savitzky-Golay 滤波器分别在时钟信号的边沿附近进行欠校正和过校正。
% 
% % % 保留边沿但仍平滑处理水平的一种简单方法是使用中位数滤波器:
figure
yMedFilt = medfilt1(x,5,'truncate');
plot(t,x, t,yMedFilt)
legend('original signal', 'median filter')

通过 Hampel 滤波器去除离群值

许多滤波器对离群值很敏感。与中位数滤波器密切相关的一种滤波器是 Hampel 滤波器。此滤波器有助于在不过度平滑处理数据的情况下去除信号中的离群值。

% 为了演示这一点,请加载一段火车鸣笛的录音,并添加一些人为噪声尖峰:
figure
load train
y(1:400:end) = 2.1;
plot(y)

% 由于我们引入的每个尖峰只有一个采样的持续时间,

% 我们可以使用只包含三个元素的中位数滤波器来去除尖峰。

hold on

plot(medfilt1(y,3))

hold off

legend('original signal','filtered signal')

该滤波器去除了尖峰,但同时去除了原始信号的大量数据点。Hampel 滤波器的工作原理类似于中位数滤波器,但它仅替换与局部中位数值相差几倍标准差的值。

% 该滤波器去除了尖峰,但同时去除了原始信号的大量数据点。
% Hampel 滤波器的工作原理类似于中位数滤波器,
% 但它仅替换与局部中位数值相差几倍标准差的值。
hampel(y,13)
legend('location','best')
% 从原始信号中仅去除了离群值。

从原始信号中仅去除了离群值。

【我是小蜜蜂,知识的搬运工!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++算法初级8——递推

c算法初级8——递推 文章目录 c算法初级8——递推递推递推思想的运用错位排序杨辉三角(二维递推) 递推 递推思想: 根据已有的东西一点点地推出未知的东西。 使用递推解题三步骤: 数学建模找出递推式和初始条件写出代码。 张爽…

[STL]vector的使用+模拟实现

[STL]vector的使用模拟实现 文章目录 [STL]vector的使用模拟实现一、vector的使用1.构造函数2.迭代器3.容量操作4.vector的访问5.vector的修改 二、几个细节1.范围for2.扩容机制3.迭代器失效4.构造函数错误调用5.vector的深拷贝与浅拷贝6.vector的框架 三、vector模拟实现vecto…

hitcon_2017_ssrfme、[BJDCTF2020]Easy MD5、[极客大挑战 2019]BuyFlag

hitcon_2017_ssrfme 进入环境给出源码 <?php if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$_SERVER[REMOTE_ADDR] $http_x_headers[0];}echo $_SERVER["REMOTE_ADDR"];$sandbox "sandbo…

Leetcode225. 用队列实现栈

文章目录 1.题目描述2.原题链接3.思路分析4.代码实现 1.题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int…

树上差分(点差分/边差分)

树上差分一般有两种类型的题目&#xff0c;一种是对边进行差分&#xff0c;另一种就是对点进行差分。 对应的操作也有两种&#xff0c;对边进行差分的对应操作就是给定一对节点(u,v)&#xff0c;让我们把u到v之间路径上的边权都加val&#xff0c;对点进行差分的对应操作就是给…

经验正交分解EOF的Matlab的实现示例

在地学中&#xff0c;PCA和EOF通常用于信号提取&#xff0c;从繁杂的时空数据中分离出地理要素的时空变化特征&#xff0c;是进行地学信号分析的前提。本质上PCA和EOF没有什么不同&#xff0c;只是&#xff1a;EOF为空间特征向量&#xff0c;也称为空间模态&#xff0c;在一定程…

信号完整性分析:关于传输线的三十个问题解答(一)

1.什么是真正的传输线&#xff1f;&#xff08;What is a real transmission line?&#xff09; 答&#xff1a;真正的传输线由任意两条延长一定长度的导体组成。将一根导线标记为信号路径&#xff0c;将另一根导线标记为返回路径。 A real transmission line is composed o…

2023最经典的Python接口自动化测试中的用例编写问题总结

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 B站讲的最详细的Python接口自动化测试实战教程全集&#xff08;实战最新版&#xff09;_哔哩哔哩_bilibiliB站讲的最详细的Python接…

4月,不要跳槽...

跳槽是每个人都可能面临的选择&#xff0c;但不同的时间点会对跳槽带来不同的影响。对于软件测试人员来说&#xff0c;4月份并不是最适合的跳槽时间。原因如下&#xff1a; 与企业目标和计划相关。一般情况下&#xff0c;公司在1月份会制定本年度的发展目标和计划&#xff0c;而…

力扣sql中等篇练习(五)

力扣sql中等篇练习(五) 1 股票的资本收益 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 每个用户的所有Sell的price值减去Buy的price值就可以了 SELECT stock_name,SUM(IF(operationBuy,price*-1,price)) capital_gain_loss FROM Stocks GROUP B…

IT知识百科:什么是SSID?

一、什么是SSID SSID&#xff08;Service Set Identifier&#xff09;是无线网络中的一个重要概念&#xff0c;它是一个用于标识无线局域网&#xff08;WLAN&#xff09;的名称。SSID可以看作是无线网络的名称&#xff0c;类似于有线网络中的网络名称或者路由器的名称。在无线…

【JavaScript】5.JavaScript内置对象

JavaScript 内置对象 JavaScript 中的对象分为3种 自定义对象内置对象浏览器对象 前面两种对象是JS 基础 内容&#xff0c;属于 ECMAScript&#xff1b; 第三个浏览器对象属于JS 独有的 内置对象就是指 JS 语言自带的一些对象&#xff0c;这些对象供开发者使用&#xff0c;…

数据通信基础 - 数据通信方式

文章目录 1 概述2 分类2.1 按通信方向分2.2 按同步方式分 3 扩展3.1 网工软考真题 1 概述 分类维度分类解释举例通信方向单工通信信息 只能在一个方向发送&#xff0c;发送方不能接收&#xff0c;接收方不能发送电视、广播半双工通信通信双方可以 交替发送和接收信息&#xff…

分布式锁+AOP实现缓存

分布式锁AOP实现缓存 1、分布式锁AOP实现思想2、不使用AOP的情况2.1 没有使用缓存时代码2.2 使用Redis实现分布式锁的代码2.3 使用Redisson实现分布式锁2.4 测试缓存命中2.5 存在问题 3、分布式锁AOP实现3.1 定义注解3.2 定义一个切面类加上注解3.3 使用注解完成缓存 1、分布式…

函数的缺省参数,函数重载与底层函数名修饰解释,引用的初步介绍

TIPS 使用C输入输出更方便&#xff0c;不需要像printf/scanf输入输出时那样&#xff0c;需要手动控制格式。C的输入输出可以自动识别变量类型。在日常练习中&#xff0c;建议直接using namespace std即可&#xff0c;这样就很方便。using namespace std展开&#xff0c;标准库…

ReetrantLock源码剖析_03公平锁、非公平锁

一直努力就会有offer&#xff0c;一直努力就会有offer&#xff0c;一直努力就会有offer&#xff01; 文章目录 ReetrantLock公平锁代码解析ReetrantLock公平锁执行流程ReetrantLock非公平锁代码解析ReetrantLock非公平锁执行流程公平锁与非公平锁的比较 ReetrantLock公平锁代码…

前端部署发布项目后,如何通知用户刷新页面、清除缓存

以下只是一些思路&#xff0c;有更好的实现方式可以留言一起交流学习 方式一&#xff1a;纯前端 在每次发布前端时&#xff0c;使用webpack构建命令生成一个json文件&#xff0c;json中写个随机生成的一个字符串&#xff08;比如时间戳&#xff09;&#xff0c;每次打包程序都…

【Python入门第五十天】Python丨NumPy 数组搜索

搜索数组 可以在数组中搜索&#xff08;检索&#xff09;某个值&#xff0c;然后返回获得匹配的索引。 要搜索数组&#xff0c;请使用 where() 方法。 实例 查找值为 4 的索引&#xff1a; import numpy as nparr np.array([1, 2, 3, 4, 5, 4, 4])x np.where(arr 4)pri…

node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。

使用 gvm 可以带来以下好处&#xff1a; 快速切换 Golang 版本&#xff0c;方便进行版本测试和开发&#xff1b;可以在多个项目中同时使用不同版本的 Golang 包和工具&#xff0c;避免冲突&#xff1b;可以通过 gvm 管理不同版本的 Golang&#xff0c;方便安装、卸载和更新&am…

STL--vector

一、vector介绍 vector是表示大小可以更改的数组的序列容器 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而…