全波形反演方法利用叠前地震波场的运动学和动力学信息,重建地下速度结构,具有揭示复杂地质背景下构造与岩性细节信息的潜力。根据研究需要,全波形反演既可以在时间域进行也可以在频率域实现。
/*********************************************************// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M
// 正弦波频率50Hz
// 高电平的宽度Tpw = Tt/2*(1+Msimwt)
// 低电平的宽度Tpw = Tt/2*(1-Msimwt)
// Tt周期
// T2是产生SPWM波形,并从P1^1输出,用导线连接到P3.4作为测试频率使用。
// T1工作在定时方式1,定时1s
// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。
// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行
// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。
//信号频率的计算方法:
// T0工作在计数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:
// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)
//使用12MHz时钟,测量的最大范围是不大于500KHz。
*********************************************************/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp[8]={0,0,0,0,0,0,0,0}
uchar FreStr[]="Friquency is:"
uchar T0count,T1count
uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,
97,7,89,15,78,26,66,38,38,66,26,78,15,
89,7,97,2,102,1,103,1,103,2,102,7,97,15,
89,26,78,38,66}
uchar ky,kc,count=255
sbit L1=P1^1
void delayms(uchar ms)
{
uchar i
while(ms--)
{
for(i = 0 i <120 i++)
}
}
//LCD定义开始
//以下三个是定义LCD的引脚
sbit lcden=P0^5
sbit lcdwrite=P0^6
sbit lcdrs=P0^7
//延时程序
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
//lcd的写指令
void write_com(uchar com)
{
lcdrs=0
lcden=0
P2=com
delay(5)
lcden=1
delay(5)
lcden=0
}
//lcd的写数据
void write_data(uchar da)
{
lcdrs=1
lcden=0
P2=da
delay(5)
lcden=1
delay(5)
lcden=0
}
//初始化
void Lcd_init()
{
lcdwrite=0
lcden=0
write_com(0x38)//16*2显示,5*7点阵,8位数据
write_com(0x0c)//显示开,关光标
write_com(0x06)//移动光标
write_com(0x01)//清除LCD的显示内容
}
//LCD定义结束
//计算频率值
void calc()
{
uchar i
long frequency
frequency=(T0count*256+TH0)*256+TL0
for(i=7i>0i--)
{
disp[i]=frequency%10
frequency=frequency/10
}
disp[0]=frequency
}
void init()
{
T0count=0
T1count=0
TH0=0
TL0=0
}
void main()
{
uchar dis
init()
Lcd_init()
TMOD=0x15
TH1=(65536-5*110592/12)/256
TL1=(65536-5*110592/12)/256%10
ET1=1
ET0=1
EA=1
TR1=1
TR0=1
//以下四句的作用是在P1.1引脚上形成1000Hz的脉冲,用导线连接到P3.4作为测试用。将其中
//高8位和低8位的初始值更改后可输出不同频率的脉冲。
T2MOD = 0x02
TH2=255-x[ky]
TL2=255-x[ky]
ET2=1
EX0=1
TR2=1
L1=1
write_com(0x80)
for(dis=0dis<12dis++)
write_data(FreStr[dis])
while(1)
{
write_com(0xC0)
for(dis=0dis<8dis++)
write_data(disp[dis]+0x30)//显示频率
}
}
//计算输入脉冲的次数
void time0() interrupt 1
{
T0count++
}
//计算1s时间
void time1() interrupt 3
{
TH1=(65536-5*110592/12)/256
TL1=(65536-5*110592/12)/256%10
if(T1count==20)
{
calc()
init()
}
else T1count++
}
//这是产生SPWM波形、
void M() interrupt 5
{
TH2=255-x[ky]
TL2=255-x[ky]
kc++
if(kc==count)
{
kc=0
L1=~L1
ky++
if(ky==49) ky=0
}
}
//这是使用外部中断0可以调整输出波形的频率
void MM() interrupt 0
{
delayms(300)
if(INT0==0)
{
count=count-5
if(count==0) count=255
}
}
一般假定 时间序列 为 y[t], 离散数据 个数 为 n.计算波形个数,通常要假定一条基线,基线以上为峰,基线以下为谷。
通常用时间序列平均值为基线 0。
然后 用 上跨 0 的方法判断 “进峰”,或下跨 0 的方法判断 “进谷”。
例如,海浪。
int n_wave(double *y, int n)
{
double mean=0.0
int N=0
for (i=0i<ni++) mean = mean + y[i]
mean = mean / n //得平均值
for (i=0i<ni++) y[i] = y[i] - mean // 扣去平均值
for (i=0i<n-1i++){
if (y[i+1] >0 && y[i] <= 0 ) N++ // 上跨 0 则得1个峰
}
return N
}
==================
工程实用时,还可以考虑一个 或值 dy (或字 是 门字头,里面一个 或),
也就是 y > dy 才算 进峰,y <-dy 才算 进 谷。-dy 到 dy 之间 处理为 0 。
上跨0和下跨0得到的波的个数在波形很不规则时会有一点差。海浪波谱分析里一般以下跨0为准。
像你这种波形像似风增水和波浪的叠加,也可以 用 滤波方式,消去 倾斜趋势 后再统计峰的个数。
另外,像你这种波形,波形尾部 的 “坏数据”需要截 去后,再作统计计算。
这些都是锦上添花。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)