亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? resp.c

?? 采用呼吸阻抗法
?? C
字號:
#include "comuse.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

////////////////////////////////////////////////////////////////////////////////
int SAMPLE_RATE=125;
//#define SAMPLE_RATE     125    //8ms調(diào)用一次所以是125
#define CALPERIOD 2000         //最小是15/分的呼吸波,4秒一個(gè)波形,4秒500個(gè)點(diǎn),2000個(gè)點(diǎn)16秒,4個(gè)波形

int resp_rate=0;
int iCalCnt=0;
void calculate(int Restdata)	//
{
// constant definitions
#define INIT_VALIDDIRLEN	8	// initial ValidDirCheckLen(Rising/Falling enough length)
#define INIT_MAXDISTURBLEN	2	// initial Maximum disturb length						
#define RESET_PERIOD	        30	// Timer in Second for no valid Reset found reset   
#define VALIDDIRLEN_PROP	8	// Properation of ValidDirectCheckLen as RespPeriod 
#define MIN_VALIDDIRLEN	        2	// Minimum ValidDirCheckLen for disturb tolerence //
#define MAX_VALIDDIRLEN	        40	// Minimum ValidDirCheckLen for MaxRespRate find  //
#define MAXDISTLEN_PROP	        4	// Properation of MaxDisturbLen as ValidDirectCheckLen
#define MIN_MAXDISTLEN	        1	// Minimum MaxDisturbLen  //
#define INIT_RESPPERIOD	        300	// Init Resp Period(for RespRate=15 at 80hz sample rate) 有問題,采樣率是125應(yīng)該是500次一個(gè)呼吸周期(resprate=15)
#define INIT_DIR_LEN            2       // minimum length of first Rising/Falling
// disturb ___means Falling/Rising while count the length of Rising/Falling
// if define this constant,the discret disturb will all be counted
// else only continous disturb will be counted
//#define DISCRET_DISTURB		1	

// define this constant for running in Windows enviroment
//#define RUN_IN_WINDOWS		1

// define this constant if want a mark to be drawn on key pos
//#define DRAW_MARK			1
	static short ValidDirLenUp = INIT_VALIDDIRLEN;	// up threthold of sucessive Rising/Falling length
	static short MaxDisturbLen = INIT_MAXDISTURBLEN;	// up threthold of sucessive disturb length
	static short ProcStage = 0;		// process stage counter
	static unsigned short BegRisingPos = 0;	// first(initial) Rising position
	static unsigned short SecondRisingPos;	// Second(after valid length of falling) Rising position
	static unsigned short PeriodCnt = 0;		// counter for remember the postion
	static unsigned short PeriodAveragePos = 0;	// begin pos of PeriodAverage
	static short RisingCount = 0;		// Sucessive Rising length counter
	static short FallingCount = 0;	// Sucessive Falling length counter
	static short LearnOver = 0;		// flag for any valid peak found
	static unsigned long PeriodAverage = 0;	// average of every period for checking of SecondRising validity
	static unsigned long PeriodAverageRn = 0;	// average of every rising renew the PeriodAvarege
	static short LastData = 128;

	short Data = Restdata;	// the current sample data

//#if !defined RUN_IN_WINDOWS
//#define DRAW_SMP_RATE       4
//	static short DrawCount = DRAW_SMP_RATE;
//#define SAMPLE_RATE         82
//#endif

	static short ResetCnt = 0;		// Process reset WatchDog timer counter
	static short CntRespPeriod = INIT_RESPPERIOD;		// current found RespPeriod
	static short LastRespPeriod = INIT_RESPPERIOD;	// Last found RespPeriod
	static short PeriodAcc = 0;		// Accumulate of RespPeriod when not accept
	static short PeriodAccCnt = 0;	// Count of RespPeriodACC when not accept

#define WEIGHT_ACC_LEN	12			// up limit of PeriodAcc length that will be accept

	static short Weight[4]={WEIGHT_ACC_LEN,6,3,2};
	static short WeightAcc = 0;

#define MIN_RESPRATE	3
#define MAX_RESPRATE	120

	if(iCalCnt++>=CALPERIOD)           
		iCalCnt=0;
	PeriodCnt++;
	if( PeriodCnt == 0 )
	{
		PeriodCnt = (BegRisingPos < SecondRisingPos) ? BegRisingPos : SecondRisingPos;    //取小的
		PeriodCnt = (PeriodCnt < PeriodAveragePos) ? PeriodCnt : PeriodAveragePos;
		BegRisingPos -=  PeriodCnt;    //從PeriodCnt開始記一個(gè)新的周期
		SecondRisingPos -= PeriodCnt;
		PeriodAveragePos -= (PeriodCnt-1); 
		PeriodCnt = 0-PeriodCnt;
	}
	// If the time period of no valid resp found more than given period,reset the
	// process to learning again
	ResetCnt++;
	if( LearnOver && ResetCnt>RESET_PERIOD*SAMPLE_RATE )
	{ 
		ProcStage = 0;
		ValidDirLenUp = INIT_VALIDDIRLEN;  //8
		MaxDisturbLen = INIT_MAXDISTURBLEN;   //2
		ResetCnt = 0;
		PeriodCnt = 1;
		LearnOver = 0;
		RisingCount = 0;
		FallingCount = 0;
		CntRespPeriod = INIT_RESPPERIOD;		// current found RespPeriod=300
		LastRespPeriod = INIT_RESPPERIOD;	// Last found RespPeriod=300
		PeriodAveragePos = 0;
		PeriodAverage = 0;
#if !defined RUN_IN_WINDOWS
		resp_rate = -1;		// for indicator of no RespRate detected
#endif
	}
	Data = (Data+LastData+1)/2;		// average with roundup
	PeriodAverage += Data;
	if(ProcStage==0)
	{
		if( Data > LastData )
		{
			RisingCount++;
			if( RisingCount == INIT_DIR_LEN )   //INIT_DIR_LEN =2
			{
				BegRisingPos = PeriodCnt;     //上升沿起始位置1
				ProcStage++;
				RisingCount = 0;              //上升沿計(jì)數(shù)清零
				FallingCount = 0;             //下降沿計(jì)數(shù)清零 
			}
		}
		else if( Data < LastData ) RisingCount = 0;   //找上升沿起始位置 
    }		
 	else if(ProcStage==1)                             
 	{
		if( Data >= LastData )
		{
			RisingCount++;
			if( RisingCount > ValidDirLenUp )    //ValidDirLenUp=8
			{
				ProcStage++;
				RisingCount = 0;                //如果找到8個(gè)連續(xù)的上升就認(rèn)為找到上升沿了 
				FallingCount = 0;
			}
//#if defined DISCRET_DISTURB
//			if( Data > LastData ) FallingCount = 0;
//#else
			FallingCount = 0;                    
//#endif
		}
		else if( Data < LastData )                    //如果有兩個(gè)連續(xù)的 下降沿就說明有干擾,重新開始算
		{
			FallingCount++;
			if( FallingCount > MaxDisturbLen )
			{
				ProcStage = 0;
				ValidDirLenUp = INIT_VALIDDIRLEN;     //8
				MaxDisturbLen = INIT_MAXDISTURBLEN;   //2
				ResetCnt = 0;
				PeriodCnt = 0;
				LearnOver = 0;
				RisingCount = 0;
				FallingCount = 0;
				CntRespPeriod = INIT_RESPPERIOD;		// current found RespPeriod
				LastRespPeriod = INIT_RESPPERIOD;	// Last found RespPeriod
				PeriodAveragePos = 0;
				PeriodAverage = 0;
#if !defined RUN_IN_WINDOWS
				resp_rate = -1;		// for indicator of no RespRate detected
#endif
			}
		}
	}
	if(ProcStage==2)                         //找下降沿
	{
		if( Data < LastData )
		{
			FallingCount++;
			if( FallingCount == INIT_DIR_LEN )      //如果發(fā)現(xiàn)連續(xù)2個(gè)下降沿就進(jìn)入procstage3
			{
				ProcStage++;
				FallingCount = 0;
				RisingCount = 0;
			}
		}
		else if( Data > LastData ) FallingCount = 0;
    }
	else if(ProcStage==3)                       
	{
		if( Data <= LastData )
		{
			FallingCount++;
			if( FallingCount > ValidDirLenUp )   //如果有8個(gè)連續(xù)的下降沿 說明找到下降沿了
			{
				ProcStage++;                 //進(jìn)入procstage4
				RisingCount = 0;
				FallingCount = 0;
			}

//#if defined DISCRET_DISTURB 
//			if( Data < LastData ) RisingCount = 0;
//#else
			RisingCount = 0;
//#endif
		}
		else if( Data > LastData )
		{
			RisingCount++;
			if( RisingCount > MaxDisturbLen ) ProcStage = 2;   //如果有上升沿的干擾,那么重新開始找下降沿
		}
    }
	else if(ProcStage==4)         //找第二個(gè)上升沿
	{
		if( Data > LastData )
		{
			RisingCount++;
			if( RisingCount == INIT_DIR_LEN )  // 如果連續(xù)2個(gè)上升沿且不大于平均值
			{	// if the Second Rising pos is above average,invalid   
				if( Data <= (int)(PeriodAverage/(PeriodCnt-PeriodAveragePos)) )
				{
					SecondRisingPos = PeriodCnt;            
					PeriodAverageRn = PeriodAverage;	// remeber the begin of Re-Average

					ProcStage++;            
					RisingCount = 0;
					FallingCount = 0;
				}
				else
					RisingCount = 0;
			}
		}
		else if( Data < LastData ) RisingCount = 0;
    }
	else if(ProcStage==5)
	{
		if( Data >= LastData )
		{
			RisingCount++;
			if( RisingCount > ValidDirLenUp )      //連續(xù)發(fā)現(xiàn)8個(gè)上升沿
			{
				CntRespPeriod = SecondRisingPos-BegRisingPos;  //計(jì)算CntRespPeriod
				FallingCount = 0;
				RisingCount = 0;
				// a valid wave peak found and to calculate the RespRate
				// to check its validity
				if( LearnOver )	// valid check only when any valid found before
				{	// for RespRate<MIN_RESPRATE,To find initial Rising
					if( CntRespPeriod >= 60*SAMPLE_RATE/MIN_RESPRATE )
					{
						ProcStage = 0;
						ValidDirLenUp = INIT_VALIDDIRLEN;
						MaxDisturbLen = INIT_MAXDISTURBLEN;
						ResetCnt = 0;
						PeriodCnt = 0;
						LearnOver = 0;
						RisingCount = 0;
						FallingCount = 0;
						CntRespPeriod = INIT_RESPPERIOD;		// current found RespPeriod
						LastRespPeriod = INIT_RESPPERIOD;	// Last found RespPeriod
						PeriodAveragePos = 0;
						PeriodAverage = 0;
#if !defined RUN_IN_WINDOWS
						resp_rate = -1;		// for indicator of no RespRate detected
#endif
						return;
					}
					// for RespRate>MAX_RESPRATE,Continue to find new Rising after enough falling
					else if( CntRespPeriod <= 60*SAMPLE_RATE/MAX_RESPRATE)
					{
						ProcStage = 4;
						return;
					}
					else
					{
						int WeightIndex;

						ResetCnt = 0;
						
						PeriodAcc +=CntRespPeriod;
						PeriodAccCnt++;

						if( CntRespPeriod>LastRespPeriod )
						{
						WeightIndex = (2*CntRespPeriod-LastRespPeriod)/(2*LastRespPeriod);
						}
						else
						{
						WeightIndex = 4*(LastRespPeriod-CntRespPeriod)/LastRespPeriod;
						}

						BegRisingPos = SecondRisingPos;
						PeriodAveragePos = SecondRisingPos;
						PeriodAverage -= PeriodAverageRn;

						WeightAcc += Weight[WeightIndex];
						if( WeightAcc < WEIGHT_ACC_LEN )
						{	// research from Stage2
							ProcStage = 2;	// (To find Falling)
							return;
						}

						CntRespPeriod = PeriodAcc/PeriodAccCnt;
						LastRespPeriod = (CntRespPeriod+LastRespPeriod+1)/2;

					}
				}
				// for LeasrnOver = 0,accept the Period directly
				else
				{
					LastRespPeriod = CntRespPeriod;
					LearnOver = 1;
				}
				PeriodAcc = 0;
				PeriodAccCnt = 0;
				WeightAcc = 0;

				// renew the deciding limit
				ValidDirLenUp = LastRespPeriod/VALIDDIRLEN_PROP;
				if( ValidDirLenUp < MIN_VALIDDIRLEN ) ValidDirLenUp = MIN_VALIDDIRLEN;
				if( ValidDirLenUp > MAX_VALIDDIRLEN ) ValidDirLenUp = MAX_VALIDDIRLEN;
				MaxDisturbLen = ValidDirLenUp/MAXDISTLEN_PROP;
				if( MaxDisturbLen < MIN_MAXDISTLEN ) MaxDisturbLen = MIN_MAXDISTLEN;

				ProcStage = 2;	// (To find Falling)
				resp_rate = (60*SAMPLE_RATE+LastRespPeriod/2)/LastRespPeriod;
				//if(bSampleRT200==1)resp_rate=resp_rate-(resp_rate/5);//(resp_rate<<2)/5;

			}

//#if defined DISCRET_DISTURB
//			if( Data > LastData ) FallingCount = 0;
//#else
			FallingCount = 0;
//#endif
		}
		else if( Data < LastData )
		{
			FallingCount++;
			if( FallingCount > MaxDisturbLen ) ProcStage = 4;
		}
	}
	LastData = Data;
}

////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品123| 91丝袜高跟美女视频| 成人app在线观看| 欧美电影一区二区| 亚洲国产成人自拍| 久久国产成人午夜av影院| 91猫先生在线| 国产亚洲美州欧州综合国| 亚洲高清在线精品| 99精品欧美一区二区三区小说| 欧美不卡一二三| 亚洲成人免费在线| 91啦中文在线观看| 中文字幕第一页久久| 老色鬼精品视频在线观看播放| 91成人国产精品| 国产精品三级在线观看| 国模无码大尺度一区二区三区 | 亚洲精品高清在线观看| 国产精品一区久久久久| 日韩一区二区在线观看| 亚洲国产精品欧美一二99| 91在线高清观看| 中文一区二区完整视频在线观看| 老司机免费视频一区二区| 91精品国产综合久久久蜜臀粉嫩 | va亚洲va日韩不卡在线观看| 精品国产一区二区精华| 免费观看一级欧美片| 91麻豆精品国产91久久久更新时间 | 欧美aa在线视频| 欧美日韩在线免费视频| 亚洲黄色免费电影| 色综合久久久久综合99| 亚洲乱码中文字幕综合| 日本韩国一区二区| 亚洲综合丁香婷婷六月香| 91视频免费看| 亚洲愉拍自拍另类高清精品| 色噜噜久久综合| 亚洲午夜久久久| 在线观看亚洲一区| 亚洲国产精品影院| 在线播放中文字幕一区| 日韩精品乱码免费| 精品美女被调教视频大全网站| 麻豆成人91精品二区三区| 精品国免费一区二区三区| 国产精品资源站在线| 国产无人区一区二区三区| 成人国产视频在线观看| 亚洲欧美日韩系列| 欧美日韩成人在线一区| 裸体歌舞表演一区二区| 中文子幕无线码一区tr| 在线观看亚洲专区| 久久精品国产免费| 国产精品美女久久久久久| 色屁屁一区二区| 性久久久久久久久| 国产日韩欧美一区二区三区综合| 成人av手机在线观看| 亚洲午夜久久久久| 久久婷婷国产综合国色天香 | 亚洲欧美日韩国产另类专区| 欧洲一区在线电影| 欧美aaa在线| 亚洲欧洲精品一区二区三区 | 欧美日韩中文字幕精品| 天天综合网 天天综合色| 久久久久9999亚洲精品| 日本精品一级二级| 久久 天天综合| 一区二区在线电影| 日韩精品一区二区三区四区 | 亚洲视频资源在线| 欧美日韩成人在线一区| 福利视频网站一区二区三区| 亚欧色一区w666天堂| 欧美国产日韩亚洲一区| 欧美日韩一级视频| 懂色av中文字幕一区二区三区| 亚洲国产日韩a在线播放性色| 久久久久久9999| 欧美疯狂性受xxxxx喷水图片| 国产大片一区二区| 日韩成人免费在线| 亚洲免费av在线| 国产欧美一区二区精品仙草咪| 欧美日韩精品一二三区| 成人网男人的天堂| 国产美女视频一区| 日本在线不卡一区| 夜夜爽夜夜爽精品视频| 欧美国产一区视频在线观看| 日韩精品一区二区三区老鸭窝| 一本一道综合狠狠老| 国产精品18久久久久久久久| 日韩av一区二区在线影视| 亚洲免费观看高清完整| 国产精品乱码久久久久久| 欧美v日韩v国产v| 制服.丝袜.亚洲.中文.综合| 91一区二区在线| 99久久99久久久精品齐齐| 国产成人在线电影| 国产福利不卡视频| 国产另类ts人妖一区二区| 国内精品免费**视频| 欧美色窝79yyyycom| 一本色道亚洲精品aⅴ| zzijzzij亚洲日本少妇熟睡| 成人免费看黄yyy456| 国产一区二区在线观看免费| 麻豆国产精品一区二区三区| 日本最新不卡在线| 美腿丝袜亚洲色图| 久久99精品久久久久久动态图| 蜜桃一区二区三区在线观看| 免费观看日韩电影| 蜜桃精品视频在线| 韩国三级在线一区| 国产98色在线|日韩| 成人sese在线| 91福利精品视频| 欧美剧情电影在线观看完整版免费励志电影| 91国在线观看| 欧美美女直播网站| 欧美一二三区精品| 久久九九影视网| 国产精品国产三级国产普通话三级 | 一本大道久久a久久综合婷婷| av一区二区三区在线| 一本一道久久a久久精品| 欧美日韩精品一区二区三区蜜桃| 91精品综合久久久久久| 日韩免费福利电影在线观看| 久久人人97超碰com| 国产精品成人在线观看| 一区二区三区在线免费播放| 日日摸夜夜添夜夜添国产精品| 久久精品国产亚洲高清剧情介绍 | 欧美撒尿777hd撒尿| 91精品蜜臀在线一区尤物| 久久综合999| 中文字幕永久在线不卡| 亚洲香肠在线观看| 毛片av一区二区| 成人久久视频在线观看| 日本精品裸体写真集在线观看| 91精品国产高清一区二区三区蜜臀 | 欧美一区二区国产| 中文字幕av免费专区久久| 亚洲国产aⅴ成人精品无吗| 精品一区二区综合| www.久久精品| 欧美一级生活片| ...av二区三区久久精品| 日日夜夜精品视频天天综合网| 国产不卡视频一区二区三区| 欧美人xxxx| 中文字幕制服丝袜一区二区三区| 午夜电影一区二区三区| 成人一道本在线| 一区二区三区精品在线观看| 视频一区在线视频| 91啪亚洲精品| 久久夜色精品一区| 亚洲成av人片一区二区梦乃| 国产剧情一区在线| 91精品福利在线一区二区三区 | 91黄色激情网站| 欧美国产精品专区| 裸体健美xxxx欧美裸体表演| 色婷婷久久久久swag精品| 久久精品视频在线看| 日韩精品欧美精品| 日本精品视频一区二区三区| 久久精品在这里| 国产在线日韩欧美| 欧美一区二区三区视频| 一区二区三区在线观看网站| 国产精品亚洲第一| 精品精品国产高清a毛片牛牛| 午夜国产精品一区| 欧美私人免费视频| 亚洲激情第一区| 99精品久久只有精品| 亚洲国产成人自拍| 国产91精品一区二区麻豆网站| 精品乱人伦一区二区三区| 肉丝袜脚交视频一区二区| 欧美日韩国产免费| 亚洲 欧美综合在线网络| 欧美亚洲一区三区| 亚洲第一会所有码转帖| 欧美三级电影精品| 日韩在线一区二区三区| 欧美剧情电影在线观看完整版免费励志电影| 一区二区欧美国产|