資源簡介
使用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語言制作
評論
共有 條評論