MATLAB时间序列数据重建与平滑:HANTS滤波
本文介绍在MATLAB中,实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补的详细方法。
HANTS(Harmonic Analysis of Time Series)是一种用于时间序列分析和插值的算法。它基于谐波分析原理,可以从观测数据中提取出周期性变化的信号成分,并进行数据插值和去噪处理。这一算法的主要思想是将时间序列数据分解为多个不同频率的谐波成分,并通过拟合这些成分来重构原始数据。该算法适用于具有任意周期性的时间序列,可以处理缺失值和异常值,并能够保留原始数据的整体趋势和周期性。
那么在本文中,我们就介绍一下在MATLAB中,基于我们自己的数据,进行HANTS算法处理的方法。
首先,由于HANTS算法整体非常精密、复杂,因此我们直接下载一位MATLAB用户撰写好的HANTS算法代码包即可,无需自己手动撰写这一部分的代码。下载方法也很简单,大家进入HANTS算法代码包在MATLAB的官方网站即可。进入网站后,如果大家是第一次使用MATLAB的官方网站,需要注册、登录一下自己的账号;随后,选择屏幕右上角的“Download”选项即可;如下图所示。

下载完毕后,我们将压缩包解压,即可看到如下图所示的文件列表。

其中,实现HANTS算法的程序其实就是上图中的前两个文件(也就是ApplyHants.m文件与HANTS.m文件),作者将HANTS算法写成了这两个函数,我们在使用时直接调用这两个函数中的一个即可。其中,第一个函数,也就是ApplyHants.m文件对应的函数,适用于输入数据为多维的情况;而如果我们的数据是一维的,例如常见的对NDVI时序数据、遥感反射率时序数据加以重建,那么就用上图中第二个函数,也就是HANTS.m文件对应的函数即可。
接下来,我们就可以开始对自己的数据加以HANTS算法处理了。在本文中,我们的需求是这样的:在一个文件夹中,包含有大量的.csv文件,其中每一个文件都具有如下图所示的格式。

其中,第一行为列名,第一列为时间,后面的列都是不同遥感影像波段反射率的时间序列数据。我们希望,对这一文件夹下所有的.csv文件进行遍历,对其中每一个.csv文件的每一列(除了第一列,因为第一列是表示时间的数据)加以HANTS算法处理。
明确了具体需求,我们就可以开始撰写代码。前面已经提到了,HANTS算法的代码不用我们自己写,就用下载好函数即可;我们只需要将数据读取、数据预处理、结果保存等部分的代码写好,同时按照自己数据的实际情况,配置一下HANTS算法的各个参数即可。
本文用到的代码如下。
clear;
ni = 414;
nb = 365 * 8 + 361;
nf = 9;
ts = 1 : 8 : (414 * 8 + 1);
HiLo = "none";
low = 0;
high = 1;
fet = 0.1;
dod = 1;
delta = 0.1;
all_file_path = "E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\16_8DaysSynthesis_After";
output_path = "E:\01_Reflectivity\99_Model_Training\00_Data\02_Extract_Data\17_HANTS";
files = dir(fullfile(all_file_path, "*.csv"));
for i = 1:numel(files)
file_path = fullfile(all_file_path, files(i).name);
column_data = readtable(file_path, "ReadVariableNames",true);
column_name = column_data.Properties.VariableNames;
column_index = 2 : 8;
for j = column_index
one_column_name = column_name{j};
one_column_data = column_data.(one_column_name);
[amp, phi, yr] = HANTS(ni, nb, nf, one_column_data, ts, "none", low, high, fet, dod, delta);
% [amp_Hi, phi_Hi, yr_Hi] = HANTS(ni, nb, nf, one_column_data, ts, "Hi", low, high, fet, dod, delta);
% [amp_Lo, phi_Lo, yr_Lo] = HANTS(ni, nb, nf, one_column_data, ts, "Lo", low, high, fet, dod, delta);
column_data.(one_column_name) = yr;
end
save_file_name = fullfile(output_path, files(i).name);
writetable(column_data, save_file_name, "Delimiter", ",");
end
% plot(one_column_data, "b.-");
% hold on;
% plot(yr, "r.-");
% plot(yr_Hi, "k.-");
% plot(yr_Lo, "g.-");
% legend("Original", "none", "Hi", "Lo");
其中,这段代码的作用是对每个.csv文件中的指定列数据应用HANTS算法进行处理,并将处理后的数据保存为新的.csv文件。具体流程如下:
- 定义了两个文件路径:
all_file_path:待处理的.csv文件所在文件夹路径;output_path:保存处理后数据的文件夹路径。
- 使用
dir函数获取指定文件夹中所有以.csv结尾的文件。 - 遍历每个文件:
- 构建当前文件的完整路径。
- 使用
readtable函数读取.csv文件数据,并保留列名。 - 获取需要处理的列索引(2到8列)。
- 遍历这些列索引:
- 获取当前列的名称和数据。
- 调用
HANTS函数对列数据进行处理,得到处理后的数据(存储在yr中)。 - 将处理后的数据替换原来的列数据。
- 构建保存处理后数据的文件名,并使用
writetable函数将column_data保存为.csv文件。
这里需要注意,HANTS算法的几个参数,大家就依据自己数据的实际情况来设置即可,具体每一个参数的含义在代码包中的HANTS.m文件内就有介绍。通过如上的代码,我们即可实现本文的需求。为了进一步验证HANTS算法是否执行正确,我们可以简单地绘制一个算法处理前后的时间序列数据对比图,如下图所示。

可以看到,经过HANTS算法处理,我们的数据已经平滑了许多。
至此,大功告成。
MATLAB时间序列数据重建与平滑:HANTS滤波的更多相关文章
- Python下opencv使用笔记(图像的平滑与滤波)
对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...
- matlab学习之降噪平滑算法
平滑降噪测试,代码如下 % 平滑降噪 % FFT变换和小波变换 clc clf clear length_of_sig=128; x=linspace(0,2*pi,length_of_sig); % ...
- MATLAB时间序列预测Prediction of time series with NAR neural network
具体请参考:http://lab.fs.uni-lj.si/lasin/wp/IMIT_files/neural/nn05_narnet/ 神经网络预测时间序列数据,有三种模型, 这里是给出的是第二种 ...
- MATLAB灰度图、中值滤波图
x=imread(‘x.jpg’); x=rbg2gray(x); %转成灰度图像 k=medfilt2(x); %中值滤波,默认为3X3矩阵 figure, imshow(k); medfil ...
- MATLAB:图像选取局部区域滤波(roicolor、roipoly、roifill、fspecial、roifilt2函数)
对于某些特殊的图像处理,我们不希望将整张图都进行图像处理.这个时候就用到了roicolor.roipoly.roifill.fspecial.roifilt2函数.代码实现过程如下: close al ...
- verilog实现中值滤波
前言 项目需要,想要实现算法中的其中一步即中值滤波,同时,因为图像处理部分中值滤波相对来说还是比较简单的,将中值滤波的硬件实现作为进入FPGA领域的第一次尝试.虽然说网上有较多关于中值滤波的文档,可是 ...
- MATLAB数字图像处理(二)图像增强
1 图像增强 1.1 直方图均衡化 对于灰度图像,可以使用直方图均衡化的方法使得原图像的灰度直方图修正为均匀的直方图. 代码如下: I2=histeq(I1); ...
- 《Matlab实用案例》系列Matlab从入门到精通实用100例案例教程目录(持续更新)
目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<Matlab使用案例> 3. 专栏目录 [MATLAB统计分析与应用1 ...
- Applying vector median filter on RGB image based on matlab
前言: 最近想看看矢量中值滤波(Vector median filter, VMF)在GRB图像上的滤波效果,意外的是找了一大圈却发现网上没有现成的code,所以通过matab亲自实现了一个,需要学习 ...
- 第十五节、OpenCV学习(四)图像平滑与滤波
图像的平滑与滤波 平滑滤波是低频增强的空间域滤波技术,是图像模糊.消除噪声. 一.2D滤波器cv2.filter2D() 对于2D图像可以进行低通或者高通滤波操作,低通滤波(LPF)有利于去噪声,模糊 ...
随机推荐
- [mysql]安全加固
前言 因等保安全的要求,需要对MySQL用户密码和登录策略进行安全加固,以满足以下需求: 密码至少8位,包含大小写字母.数字和特殊字符. 当密码登录失败一定次数后锁定账户. 密码90天过期 本文使用的 ...
- [prometheus]基于consul的服务发现
前言 prometheus默认使用静态配置文件监控服务,每次添加服务都要重载,比较麻烦.好在官方提供多种动态服务发现的方法,常用的一般有基于文件服务发现.基于consul服务发现和基于dns服务发现, ...
- Golang之旅——内存管理
转载放在最前 一文带你了解,虚拟内存.内存分页.分段.段页式内存管理[Golang三关-典藏版]一站式Golang内存洗髓经 | Go 技术论坛 刘丹冰Aceld感谢以上文章作者,收获满满 存储器管理 ...
- lea指令调用
lea指令(Load Effective Address)在x86汇编语言中的作用是将一个有效地址(即一个内存地址或寄存器地址的偏移量)加载到目标寄存器中,而不是加载一个实际的内存值. lea指令的使 ...
- Java日志系列:日志门面JCL、SLF4J
目录 一.日志门面说明 二.JCL 使用 JCL 入门 JCL 原理 三.SLF4J 使用 配合自身简单日志实现(slf4j-simple) 配置logback日志实现 配置Log4J日志实现(需适配 ...
- STM32中SWD下载不进去的解决方法
这是我第一次写自己的博客,希望以后写博客可以当做自己的个人习惯并坚持下去,作为技术分享,也欢迎各位大佬前来指正.本人本科学习的机械电子工程,了解机械制图.嵌入式编程.目前刚好学习了PCB制板,正在向着 ...
- PyAV 使用浅谈
背景: PyAV是一个用于音频和视频处理的Python库,它提供了一个简单而强大的接口,用于解码.编码.处理和分析各种音频和视频格式.PyAV基于FFmpeg多媒体框架,它本质上是FFmpeg 的Py ...
- 纯干货!一文get昇腾Ascend C编程入门全部知识点
本文分享自华为云社区<昇腾Ascend C编程入门教程>,作者:昇腾CANN . 2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾Ascend C编程语言. ...
- Vs2022安装.Net4.5程序包
因为VS2022将不再支持.NET4.5,即使在Visual Studio Installer中也找不到.NET4.5的选项 我们可以在NuGet包中下载.NET 4.5的工具包 找到程序包管理器控制 ...
- IDEFICS 简介: 最先进视觉语言模型的开源复现
引言 Code Llama 是为代码类任务而生的一组最先进的.开放的 Llama 2 模型,我们很高兴能将其集成入 Hugging Face 生态系统!Code Llama 使用与 Llama 2 相 ...