• 大小: 6KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-07-17
  • 语言: C/C++
  • 标签: C++  S-G  滤波  

资源简介

使用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


评论

共有 条评论