noise_process.c
#include <math.h>
#include "otdr_const.h"
#include "haar.h"
#include "otdr_bufferfilter.h"
WORD32 windowsize=200;
WORD32 backnum=900;
extern void filter(double *a, double *b, CurveData *data, int n);
void ReverseCurveData(CurveData *pCurveDataIn,CurveData *pCurveDataOut,WORD32 len)
{
WORD32 i;
i=len;
while(i--)
pCurveDataOut[len-(i+1)].y=pCurveDataIn[i].y;
}
void CurveMinusData(CurveData *pCurveDataIn,double data, WORD32 len)
{
WORD32 i=0;
for(i=0;i<len;i++)
pCurveDataIn[i].y=pCurveDataIn[i].y-data;
}
void FilterCurve(WORD32 plsWid, CurveData *pCurveData,const WORD32 len)
{
double a[2] = {0}, b[2] = {0};
NOISE_LPF_BUTTER(plsWid,a,b);
filter(a, b, pCurveData, len);
}
void CurveAddData(CurveData *pCurveDataIn,double data, WORD32 len)
{
WORD32 i=0;
for(i=0;i<len;i++)
pCurveDataIn[i].y=pCurveDataIn[i].y+data;
}
double getMean(CurveData *pCurveDataIn, WORD32 start,WORD32 n)
{
WORD32 i=0;
double ymean=0.0;
for(i=start;i<start+n;i++)
ymean+=pCurveDataIn[i].y/(double)n;
return ymean;
}
double getStd(CurveData *pCurveDataIn,WORD32 n)
{
WORD32 i=0;
double ymean=0.0,var=0.0,std=0.0;
for(;i<n;i++)
ymean+=pCurveDataIn[i].y/(double)n; /*getMean*/
for(i=0;i<n;i++)
var+=((pCurveDataIn[i].y-ymean)*(pCurveDataIn[i].y-ymean));
var/=(float)n;
std=sqrt(var);
return std;
}
WORD32 foundDataNo(CurveData *CurveDataIn,double ymean,double y2std,WORD32 found,WORD32 len)
{
int i=0;
double ymn=0.0;
for(i=0;i<len/windowsize-1;i++)
{
ymn=getMean(CurveDataIn,i*windowsize,windowsize);
if((ymn-ymean)>6*y2std)
{
if(i<(len/windowsize-1))
{
ymn=getMean(CurveDataIn,(i+1)*windowsize,windowsize);
if(ymn-ymean>3*y2std)
{
found=i;
break;
}
}
}
else if(ymn<ymean)
{
ymean=ymn;
}
}
return found;
}
void CaculateNoise(CurveData *pCurveDataIn1,CurveData *pCurveDataIn2,WORD32 found,WORD32 len,double *noise)
{
WORD32 j=0;
WORD32 k=found*windowsize-backnum ;
for(j=0;j<found*windowsize-backnum;j++)
{
noise[j]=pCurveDataIn1[len+backnum-found*windowsize+j].y - pCurveDataIn2[k--].y;
}
}
void ReconstructData(CurveData *pCurveDataIn,WORD32 found,WORD32 len,double *noise,double ymn,CurveData *pCurveDataOut)
{
WORD32 j = 0;
for(j = 0;j <=(len-found*windowsize+backnum-1);j++)
{
/* if(j>500 || j>found*windowsize-backnum)
break;*/
pCurveDataOut[j].y=pCurveDataIn[j].y-ymn;
}
for(j = (len-found*windowsize+backnum);j<len;j++)
{
pCurveDataOut[j].y=noise[j-(len-found*windowsize+backnum)];
}
for(j=0;j<len;j++)
{
pCurveDataIn[j].y=pCurveDataOut[j].y;
}
}
WORD32 NoiseProcess(Curve *pCurveOut,WORD32 sampinterval, WORD32 sampperiod, WORD32 len)
{
CurveData *data1=NULL;
CurveData *data2=NULL;
double ymean=0.0;
double y2std=0.0;
double ymn=0.0;
double *noise=NULL;
WORD32 found=0xff;
double endata = 0.0;
data1=(CurveData *)malloc(len * sizeof(CurveData));
if(NULL==data1)
{
return ERROR;
}
memset(data1,0,len);
data2=(CurveData *)malloc(len* sizeof(CurveData));
if(NULL==data2)
{
free(data1);
return ERROR;
}
memset(data2,0,len);
ReverseCurveData(pCurveOut->data,data1,len);
endata = getMean(pCurveOut,len-100,100);
CurveMinusData(data1,endata,len);
FilterCurve(pCurveOut->config.comm.plsWid,data1,len);
CurveAddData(data1,endata,len);
if(len<windowsize || len<500)
return ERROR;
ymean=getMean(data1,0,windowsize);
y2std=getStd(data1,500);
found=foundDataNo(data1,ymean,y2std,found,len);
printf("found:%d\n",found);
if((found*windowsize-backnum-30)<0 || found == 0xff)
{
return ERROR;
}
ymn=getMean(data1,found*windowsize-backnum-30,30);
noise=(double *)malloc((found*windowsize-backnum)* sizeof(double));
if(NULL==noise)
{
free(data1);
free(data2);
return ERROR;
}
memset(noise,0,found*windowsize-backnum);
CaculateNoise(pCurveOut->data,data1,found,len,noise);
ReconstructData(pCurveOut->data,found,len,noise,ymn,data2);
free(data1);
free(data2);
free(noise);
return OK;
}
//没有专门的求任意底数对数的函数,不过可以用
//log(x)/log(y)表示log y x
noise_process.c的更多相关文章
- 套题T7
P4712 铺瓷砖 时间: 1000ms / 空间: 65536KiB / Java类名: Main 描述
随机推荐
- uc 下载页面 记录备份
记录一下 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...
- 相等(==)、严格相等(===)、NaN、null、undefined、空和0
(===)如果两个引用值指向同一个对象.数组.或函数,则他们是相等的.如果指向不同的对象,则他们是不相等的,尽管两个对象具有完全一样的属性. (==)如果其中一个值是true,则将其转换为1再进行比较 ...
- Pytho并发编程-利用协程实现简单爬虫
from gevent import monkey;monkey.patch_all() import gevent from urllib.request import urlopen def ge ...
- Adobe Photoshop CC 2017-18.0安装教程
Adobe Photoshop CC 2017-18.0安装教程 注:下载链接在文章后面 第一步:首先请将电脑的网络断开,很简单:禁用本地连接或者拔掉网线,这样就可以免除登录Creative Clou ...
- Git 码云操作
https://www.cnblogs.com/lanxiang/p/7487971.html 将项目提交到码云 在码云创建项目 然后在项目目录下: 打开后输入: git init 目录下出现.git ...
- JDK源码分析(一)——ArrayList
目录 ArrayList分析 ArrayList继承结构 ArrayList字段属性 ArrayList构造函数 重要方法 ArrayList Iterator迭代器 总结 ArrayList分析 ...
- ActiveMQ (三):项目实践
1. 简单项目demo Com.hoo.mq路径下(除了com.hoo.mq.spring)是普通java中使用activeMQ. Com.hoo.mq.spring路径下是非web环境spring集 ...
- Python下读取转换unicode的json格式
转自: https://blog.csdn.net/felcon/article/details/38524317 JSON(JavaScript Object Notation) 是一种轻量级的数据 ...
- 机器学习之路:python支持向量机回归SVR 预测波士顿地区房价
python3 学习使用api 支持向量机的两种核函数模型进行预测 git: https://github.com/linyi0604/MachineLearning from sklearn.dat ...
- QT学习笔记5:QMouseEvent鼠标事件简介
一.QMouseEvent的详细描述 首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理. QMouseEvent ...