资源简介
使用C++ 编写的sg滤波,需要依赖GSL库,滤波方法文献参考Chen, et al., 2004. A simple method for reconstructing a high-quality
; NDVI time-series data set based on the Savitzky�Golay filter. Remote Sensing of Environment,

代码片段和文件信息
/***************************************************************************
*
* Time: 2018-3-5
* Project: 滤波函数
* Purpose: 各种滤波函数的实现
* Author: wk
* Copyright (c) 2018
* Describe: 实现各种滤波,以便后续的使用。目前仅实现了S-G滤波(该方法来源于文献Chen et al. 2004),
* 用SavitzkyGolay方法对EVI时序序列进行滤波去噪。
*
****************************************************************************/
#pragma once
#include “Filter.h“
Filter::Filter(){}
Filter::~Filter(){}
/**
* @brief sg滤波
* @param y 平滑数组
* @param iSize 数组大小
* @return 返回值:表示计算过程中出现的各种错误信息
*/
int Filter::SG_Filter(float *yint iSizefloat*Sgresult)
{
float *fQuality = new float[iSize];
memset(fQuality0.0sizeof(float)*iSize);
findNoiceInEVI(yiSize0.2fQuality);
lineInterpol(yiSizefQuality);
delete [] fQuality;
//gsl_vector_free(gslQuality);
//第三步:探测时序的长期趋势
//创建滤波系数
int iFilterSize = 2*5+1;
float * fFilter = new float[iFilterSize];
memset(fFilter0.0sizeof(float)*iFilterSize);
SG_FilterCreate(52fFilter);
//float * fFilter = new float[iFilterSize];
//for (int i= 0;i // fFilter[i] = gsl_vector_get(sgFilteri);
//gsl_vector_free(sgFilter);
//根据滤波进行卷积
float *ytr = new float[iSize];
memset(ytr0.0sizeof(float)*iSize);
gsl_MyConv(yiSizefFilteriFilterSizeytr);
delete [] fFilter;
//cout<<“ytr0: “< //for (int i = 0;isize;i++)
//{
// cout< //}
//gsl_vector_free(sgFilter);
//第四步:设定各点权重
//设定EVI序列各点的权重
//gsl_vector*gvWeight = gsl_CalWeight(yytr);
float * fWeight = new float[iSize];
memset(fWeight0.0sizeof(float)*iSize);
gsl_CalWeight(yiSizeytrfWeight);
//对初始结果的三次拟合结果进行判断,如果第一、二次的拟合指数最小,则滤波结束,否则进入滤波循环
//////////////////////////////////////////////////////////////////////////
float * ffittresulet = new float[3];
memset(ffittresulet0.0sizeof(float)*3);
//////////////////////////////////////////////////////////////////////////
//第一次拟合
//第五步:产生一条新的EVI序列
float* newy1 = new float[iSize];
memset(newy10.0sizeof(float)*iSize);
gsl_GetMaxValueofVectors(yiSizeytrnewy1);
//第六步:用SG滤波处理这条新的NDVI序列
//gsl_vector*sgFilter46 = SG_FilterCreate(46);
int iFilter2Size = 2*4+1;
float * fFilter2 = new float[iFilter2Size];
memset(fFilter20.0sizeof(float)*iFilter2Size);
SG_FilterCreate(46fFilter2);
//for(int i = 0 ; i // fFilter2[i] = gsl_vector_get(sgFilter46i);
//float *newy1 = new float[iSize];
gsl_MyConv(newy1iSizefFilter2iFilter2Sizeytr);
//gsl_vector_free(sgFilter46);
//cout<<“ytr1: “< //for (int i = 0;isize;i++)
//{
// cout< //}
//第七步:计算拟合效果指数
ffittresulet[0]=gsl_CalTotal(ytriSizeyfWeight);
//////////////////////////////////////////////////////////////////////////
//第二次拟合
//第五步,产生一条新的EVI序列
float* newy2 = new float[iSize];
memset(newy20.0sizeof(float)*iSize);
gsl_GetMaxValueofVectors(yiSizeytrnewy2);
//第六步:用SG滤波处理这条新的NDVI序列
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2695 2018-03-08 18:01 Filter.h
文件 754 2018-03-08 18:14 main.cpp
文件 14331 2018-03-08 18:16 Filter.cpp
----------- --------- ---------- ----- ----
17780 3
- 上一篇:模拟 Linux 文件系统 C++
- 下一篇:汽车票管理系统C语言制作
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 中值滤波C语言154954
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
评论
共有 条评论