本人的毕业设计由于要用到cvi仿真
设计一个形态滤波器 用于检测电能质量
其中要用数学形态学运算
具体程序如下:
#include <utility.h>
#include <ansi_c.h>
#include <analysis.h>
#include <cvirte.h>
#include <userint.h>
#include "mm.h"
static int panelHandle;
void xab(double *x,double *xb,int M);
void xsb(double *x,double *xb,int M);
int detp(double *data,double vdmax,double *out,int l);
/* (x+B)(n) x[]输入数据,2048个。xb[]输出数据,(2048-M)。扁平结构,M=6个,幅值0.1.*/
void xab(double *x,double *xb,int M)
{
int minin;
int maxin;
double vmin;
double vmax;
//int M=5;
int N=1024;
int n,m,p;
double B[64];
double xpb[64];
Set1D (B, M, 5.1);
for (n=M-1; n<(N-1); n++)
{
p=n-M+1;
Add1D (&x[p], B, M, xpb); //扁平结构B[n]=B[n-p]
MaxMin1D (&x[p], M, &vmax, &maxin, &vmin, &minin);
xb[n-M+1]=(vmax+vmin)*0.5;
}
}
/* (x-B)(n) x[]输入数据,2048个。xb[]输出数据,(2048-M)。扁平结构,M=6个,幅值0.1.*/
void xsb(double *x,double *xb, int M)
{
int minin;
int maxin;
double vmin;
double vmax;
//int M=5;
int N=1024;
int n,m,p;
double B[64];
double xpb[64];
Set1D (B, M, 5.1);
for (m=0; m<(N-M); m++)
{
p=m+0;
Sub1D (&x[p], B, M, xpb);
MaxMin1D (&x[p], M, &vmax, &maxin, &vmin, &minin);
xb[m]=vmin;
}
}
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "041452.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK OkCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ double ph=90.0;
double vl=100.0;
int ss;
int mm;
int hh;
int k;
double ok[2048];
double NOI[2048];
double COS[2048];
int minin;
int maxin;
double vmin;
double vmax;
int i;
switch (event)
{
case EVENT_COMMIT:
SineWave (128*8, 100.0, 7.8125e-3, &ph, COS);
WhiteNoise (1024, 4.0, 1, NOI);
Add1D (COS, NOI, 1024, ok);
SineWave (128*8, 3.0, 3.0/128, &ph, COS);
Add1D (COS, ok, 1024, ok);
SineWave (128*8, 1.0, 5.0/128, &ph, COS);
Add1D (COS, ok, 1024, ok);
ok[27]=ok[27]-10.0;
ok[28]=ok[28]-10.0;
ok[29]=ok[29]-10.0;
ok[30]=ok[30]-10.0;
for (i=0; i<128; i++)
{
ok[i+600]=0.0;
ok[i+102]=ok[i+102]*0.8;
ok[i+360]=ok[i+360]*1.2;
}
SineWave (64, 10.0, 30*7.8125e-3, &ph, NOI);
Add1D (&ok[920], NOI, 30, &ok[920]);
SetCtrlAttribute (panelHandle, PANEL_GRAPH_2, ATTR_XUSE_LABEL_STRINGS, 1);
InsertAxisItem (panelHandle, PANEL_GRAPH_2, VAL_BOTTOM_XAXIS, -1, "Thd", -1.0);
PlotWaveform (panelHandle, PANEL_GRAPH_2, ok, 1024, VAL_DOUBLE, 1.0, 0.0, 0.0, 20.0/128.0,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
GetSystemTime (&hh, &mm, &ss);
SetCtrlVal (panelHandle, PANEL_NUMERIC, ss);
SetCtrlVal (panelHandle, PANEL_NUMERIC_3, mm);
for(k=0;k<1600;k++)
{
vl=10;
detp(ok,vl,NOI,2048);
/* xab(ok,ok,2);
// xsb(ok,ok,5);
// PlotWaveform (panelHandle, PANEL_GRAPH_3, ok, 1014, VAL_DOUBLE, 1.0, 0.0, 5*20.0/128.0,
// 20.0/128.0, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);
//
Sub1D (&ok[1], ok, 1017, NOI);
Abs1D (ok, 1024, ok);
PlotWaveform (panelHandle, PANEL_GRAPH, ok, 1024, VAL_DOUBLE, 1.0, 0.0, 0.0, 20.0/128.0,
VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
for(i=0;i<1013;i++)
{
MaxMin1D (&NOI, 4, &vmax, &maxin, &vmin, &minin);
// NOI=(vmax+vmin)-2*NOI;
NOI=(vmax-vmin);
if(NOI<8.6) NOI=0.0;
}
*/ }
GetSystemTime (&hh, &mm, &ss);
SetCtrlVal (panelHandle, PANEL_NUMERIC_2, ss);
SetCtrlVal (panelHandle, PANEL_NUMERIC_4, mm);
/* xab(NOI,COS,4);
xsb(NOI,NOI,4);
Sub1D (COS, NOI, 1015, NOI);
for(i=0;i<1015;i++) if(NOI<10.0) NOI=0.0;*/
PlotWaveform (panelHandle, PANEL_GRAPH_3, NOI, 1015, VAL_DOUBLE, 1.0, 0.0, 10*20.0/128.0,
20.0/128.0, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_DK_RED);
/* xsb(ok,ok,6);
xab(ok,ok,6); */
for(i=0;i<1012;i++)
{
MaxMin1D (&ok, 5, &vmax, &maxin, &vmin, &minin);
ok=(vmax+vmin)/2.0;
}
xab(ok,ok,64);
PlotWaveform (panelHandle, PANEL_GRAPH_3, ok, 960, VAL_DOUBLE, 1.0, 0.0, 42*20.0/128.0,
20.0/128.0, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_BLUE);
break;
}
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
int detp(double *data,double vdmax,double *out,int l)
{
int i,sig;
int maxin,minin;
double vmax,vmin,vmax2,vmin2;
Sub1D (&data[2], data, l-2, out);
/* for (i=0; i<(l-2); i++)
{
out=out*0.5;
} */
/* for (i=0; i<(l-1); i++)
{
// MaxMin1D (&data, 2, &vmax, &maxin, &vmin, &minin);
out=(data+data[i+1])*0.5;
}
Sub1D (&out[1], out, l-2, out); */
for(i=0;i<l-6;i++)
{
MaxMin1D (&out, 5, &vmax, &maxin, &vmin, &minin);
// MaxMin1D (&out[i+3], 4, &vmax2, &maxin, &vmin2, &minin);
out=(vmax-vmin)*0.5;
if(out<vdmax) out=0.0;
else sig=1;
}
return sig;
}
但是有错误,高手能帮看看嘛,或者能帮改一下的直接发在我邮箱吧 leexwd@163.com 不甚感激啊~~~~~谢谢~~~ |