高手来帮帮忙吧·····感激
本人的毕业设计由于要用到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;
double xpb;
Set1D (B, M, 5.1);
for (n=M-1; n<(N-1); n++)
{
p=n-M+1;
Add1D (&x, B, M, xpb);//扁平结构B=B
MaxMin1D (&x, M, &vmax, &maxin, &vmin, &minin);
xb=(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;
double xpb;
Set1D (B, M, 5.1);
for (m=0; m<(N-M); m++)
{
p=m+0;
Sub1D (&x, B, M, xpb);
MaxMin1D (&x, M, &vmax, &maxin, &vmin, &minin);
xb=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;
double NOI;
double COS;
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=ok-10.0;
ok=ok-10.0;
ok=ok-10.0;
ok=ok-10.0;
for (i=0; i<128; i++)
{
ok=0.0;
ok=ok*0.8;
ok=ok*1.2;
}
SineWave (64, 10.0, 30*7.8125e-3, &ph, NOI);
Add1D (&ok, NOI, 30, &ok);
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, 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, 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)*0.5;
}
Sub1D (&out, out, l-2, out);*/
for(i=0;i<l-6;i++)
{
MaxMin1D (&out, 5, &vmax, &maxin, &vmin, &minin);
// MaxMin1D (&out, 4, &vmax2, &maxin, &vmin2, &minin);
out=(vmax-vmin)*0.5;
if(out<vdmax) out=0.0;
else sig=1;
}
return sig;
}
但是有错误,高手能帮看看嘛,或者能帮改一下的直接发在我邮箱吧 leexwd@163.com不甚感激啊~~~~~谢谢~~~ 你最好把整个工程文件上传,这样调试起来比较容易!
像你这样上传的代码,看起来太累!
页:
[1]