leexwd 发表于 2009-5-24 15:28:34

高手来帮帮忙吧·····感激

本人的毕业设计由于要用到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不甚感激啊~~~~~谢谢~~~

netcreature 发表于 2009-5-25 08:37:30

你最好把整个工程文件上传,这样调试起来比较容易!
像你这样上传的代码,看起来太累!
页: [1]
查看完整版本: 高手来帮帮忙吧·····感激