用C语言实现一个简单的眼图显示工具

    xiaoxiao2025-04-20  12

    matlab实现

    function eye_plot(A,vcm,VPH)     A = A';     imagedata = diff(A);     s=sum(sum(imagedata));     if s <0         imagedata = -imagedata;     end     c = imagedata;     xx = find(c ~=0);     if ~length(xx) > 1         ac = (diff(abs(c(xx))) == 0);         ac1(2:length(ac)+1)=ac;         ac1(1)=ac(1);         pr = xx(union(find(ac==1),find(ac1==1)));         imagedata(pr)=0;     end     ax = find(imagedata<0);     az=ax(2:end-1);     imagedata(az) = (imagedata(az-1)+imagedata(az)+imagedata(az+1))/3;     imagedata(abs(imagedata)<10)=0;     if max(imagedata)==0         img=imagedata;     else         img=255*imagedata/max(max(imagedata));     end     my_fig=figure();     my_imag=image(img);     empty=0;     scope_colormap(empty);     my_axes=get(my_fig,'CurrentAxes');     set(my_imag,'XData',[0 2]);     set(my_imag,'YData',[2/3*vcm/1023*VPH -2/3*vcm/1023*VPH]);     set(my_axes,'XLim',[0 2]);     set(my_axes,'YLim',[2/3*vcm/1023*VPH -2/3*vcm/1023*VPH]);     set(my_axes,'Ydir','normal');     set(my_axes,'Xdir','XGrid','on','Xcolor',[.25 .25 .25],'YGrid','on','Ycolor',[.25 .25 .25]);     ylable('Volatage(V)');     xlabel('UI','color','k');     title('eye plot','fontweight','bold'); end

    C语言实现

    #include<stdio.h> #include<stdlib.h> #include<string.h>

    typedef unsigned int u32; typedef struct POS{     int *p;     int len; }POS;

    typedef struct matrix{     int *data;     int row;     int cols; }mtx;

    void display_matrix_(mtx *mtx) {     int i,j;          if(mtx->row < 0 || mtx->cols < 0)     {         printf("invalid para\n");         return ;     }

        if (mtx->row == 0 || mtx->cols == 0)     {         printf("[]\n");         return ;     }     for(i = 0; i < mtx->row; i++)     {         for(j = 0; j < mtx->cols; j++)         {             printf(" = ", *(mtx->data + i * mtx->cols +j));         }         printf("\n");     }     printf("\n"); }

    void transpos_matrix_(mtx *dst, mtx *src) {     int i,j;          printf("A\n");     display_matrix_(src);     for (i = 0; i < src->row; i++)         for (j = 0; j < src->cols; j++)             *(dst->data + j * src->row + i) = *(src->data + i*src->cols + j);     printf("A'\n");         dst->row = src->cols;     dst->cols = src->row;     display_matrix_(dst); }

    void diff_(mtx *dif, mtx *src) {     int i;     int j;

        dif->cols = src->cols;     dif->row = src->row - 1;          for (i = 0; i < dif->row; i++)     {         for (j = 0; j < dif->cols; j++)         {             *(dif->data + i * dif->cols + j) = *((src->data + (i+1) * src->cols +j)) - *(src->data + i*src->cols + j);         }     }          printf("diff(A')\n");     display_matrix_(dif); }

    void Sum_(mtx *res, mtx *mtx) {     int i;     int j;     int x;     int y;          *(res->data) = 0;     x = mtx->row;     y = mtx->cols;     if (x == 1)     {         for(i = 0; i < y;i++)         {             *(res->data) += *(mtx->data + i);         }         res->cols = 1;         res->row = 1;         return;     }else if(x > 1)     {         for(j = 0; j < y;j++)         {             for(i = 0; i < x; i++)                 *(res->data + j) += *(mtx->data + i*y +j);         }         res->cols = y;         res->row = 1;         return;     }      }

    void oposite_(mtx *mtx) {     int i;     int j;     int x;     int y;

        x = mtx->row;     y = mtx->cols;          for (i=0; i<x; i++)     {         for(j = 0; j < y; j++)             *(mtx->data + i * y + j) = 0 -(*(mtx->data + i * y + j));     }     display_matrix_(mtx); }

    int find_(mtx *dst, mtx *src, char compare,int val) {     int i;     int j;     int x;     int y;     int len = 0;

        x = src->row;     y = src->cols;

        for(j = 0; j < y; j++)     {         for(i = 0; i < x; i++)         {             if (compare == '~')             {                 //printf("src[%d][%d]:%d\n", i, j, *(src->data + i*y + j));                 if(*(src->data + i*y + j) != val)                 {                     *(dst->data + len) = x*j+i;                     len += 1;                 }             }             else if(compare == '=')             {                 if(*(src->data + i*y + j) == val)                 {                     *(dst->data + len) = x*j+i;                     len += 1;                 }             }             else if(compare == '>')             {                 if(*(src->data + i*y +j) > val)                 {                     *(dst->data + len) = x*j+i;                     len += 1;                 }             }             else if(compare == '<')             {                 if(*(src->data + i*y +j) < val)                 {                     *(dst->data + len) = x*j+i;                     len += 1;                 }             }             else             {                          }             dst->cols = len;             dst->row = 1;         }     }

        printf("find elements which are %c %d \n",compare,val);     display_matrix_(dst);          return 0; }

    int length_(mtx *mtx) {     int x;     int y;          x = mtx->row;     y = mtx->cols;     return (x>y)? x:y ; }

    void replace_(mtx *mtx_, mtx *seq, int postval) {     int i;

        if (seq->row > 1)     {         printf("invalid para\n");         return;     }          for(i = 0; i < seq->cols; i++)     {         *(mtx_->data + (*(seq->data + i) / mtx_->row) + (*(seq->data + i) % mtx_->row) * (mtx_->cols)) = postval;     } }

    void abs_(mtx *abs_mtx, mtx *mtx) {     int i;     int j;

        abs_mtx->row = mtx->row;     abs_mtx->cols = mtx->cols;

        for(i = 0; i < mtx->row; i++)     {         for(j = 0; j < mtx->cols; j++)         {             int tmp = *(mtx->data + i * mtx->cols + j);             if (tmp < 0)             {                 *(abs_mtx->data + i * abs_mtx->cols + j) = - *(mtx->data + i * mtx->cols + j);             }             else             {                 *(abs_mtx->data + i * abs_mtx->cols + j) = *(mtx->data + i * mtx->cols + j);             }         }     }             }

    void max_(mtx *logic_mtx, mtx *mtx) {     int i;     int j;     int tmp;

        if (mtx->cols == 0 || mtx->row == 0)         return ;          if (mtx->cols == 1 || mtx->row == 1)     {         tmp = *(mtx->data);         for(i = 0; i < mtx->row * mtx->cols; i++)         {             if (tmp < *(mtx->data + i))                 tmp = *(mtx->data + i);         }         *(logic_mtx->data) = tmp;         logic_mtx->cols = 1;         logic_mtx->row = 1;     }     else     {         for(i = 0; i < mtx->cols; i++)         {             tmp = *(mtx->data + i);             for(j = 0; j < mtx->row; j++)             {                 if (tmp < *(mtx->data + j * mtx->cols + i))                     tmp = *(mtx->data + j * mtx->cols + i);             }             *(logic_mtx->data + i) = tmp;             logic_mtx->cols = mtx->cols;             logic_mtx->row = 1;         }     }          }

    void mul_(mtx *mul_mtx, mtx *mtx, int num) {     int i;

        for (i = 0; i < mtx->row * mtx->cols; i++)         *(mul_mtx->data + i) = *(mtx->data + i) * num;     mul_mtx->cols = mtx->cols;     mul_mtx->row = mtx->row; }

    void chu_(mtx *chu_mtx, mtx *mtx, int num) {     int i;

        for (i = 0; i < mtx->row * mtx->cols; i++)         *(chu_mtx->data + i) = *(mtx->data + i) / num;     chu_mtx->cols = mtx->cols;     chu_mtx->row = mtx->row; }

    int main(int argc, char **argv) {     int i;     int j;     int ret;     int k;     int len;     mtx src_mtx, dst_mtx, dif_mtx, sum_ret, ssum_ret;     mtx c_mtx, xx_mtx, ax_mtx, az_mtx, abs_mtx, logic_mtx;     int fd;

        fd = open("eye_data",O_RDWR,0666);     if(fd == -1)     {         perror("open");         return -1;     }          src_mtx.row = 6;     src_mtx.cols = 8;     src_mtx.data = malloc(src_mtx.row * src_mtx.cols * sizeof(int));     if (!src_mtx.data)     {         printf("malloc failed\n");         goto src_failed;     }

        read(fd, src_mtx.data, src_mtx.row * src_mtx.cols * sizeof(int));

        dst_mtx.row = src_mtx.cols;     dst_mtx.cols = src_mtx.row;     dst_mtx.data = malloc(dst_mtx.row * dst_mtx.cols * sizeof(int));     if (!dst_mtx.data)     {         printf("malloc failed\n");         goto dst_failed;     }

        for(i = 0; i < src_mtx.row / 2; i++)             for(j = 0; j < src_mtx.cols; j++)                 *(src_mtx.data + i * src_mtx.cols + j) = 20 * (i * src_mtx.cols + j);     for(i = src_mtx.row / 2; i < src_mtx.row; i++)             for(j = 0; j < src_mtx.cols; j++)                 *(src_mtx.data + i * src_mtx.cols + j) = 0 - 5 *(i * src_mtx.cols + j);             

        transpos_matrix_(&dst_mtx, &src_mtx);     dif_mtx.data= malloc((dst_mtx.row - 1) * dst_mtx.cols * sizeof(int));     if (!dif_mtx.data)     {         printf("malloc failed\n");         goto dif_failed;     }     diff_(&dif_mtx, &dst_mtx);

        sum_ret.data = malloc(dif_mtx.cols * 1 *sizeof(int));     if (!sum_ret.data)     {         printf("malloc failed\n");         goto sum_failed;     }     Sum_(&sum_ret, &dif_mtx);     display_matrix_(&sum_ret);     ssum_ret.data = malloc(sizeof(int));     if (!ssum_ret.data)     {         printf("malloc failed\n");         goto ssum_failed;     }     Sum_(&ssum_ret, &sum_ret);     printf("ssum: %d\n", *(ssum_ret.data));     if (*(ssum_ret.data) < 0)         oposite_(&dif_mtx);

        c_mtx.row = dif_mtx.row;     c_mtx.cols = dif_mtx.cols;     c_mtx.data = malloc(c_mtx.row * c_mtx.cols * sizeof(int));     if (!c_mtx.data)     {         printf("malloc failed\n");         goto c_failed;     }     memcpy(c_mtx.data, dif_mtx.data, dif_mtx.row * dif_mtx.cols * sizeof(int));          printf("diff(A') == c_mtx:\n");     display_matrix_(&c_mtx);     xx_mtx.data = malloc(c_mtx.row * c_mtx.cols * sizeof(int));     if (!xx_mtx.data)     {         printf("malloc failed\n");         goto xx_failed;     }     find_(&xx_mtx, &c_mtx, '~', 0);

        /*     if ~length(xx) > 1        ac = (diff(abs(c(xx))) == 0);        ac1=(2:length(ac)+1)=ac        ac1(1)=ac(1)        pr=xx(union(find(ac==1),find(ac1==1)))        imagedata(pr)=0      end     */     if (!(length_(&xx_mtx) > 1))     {         printf("=======\n");         //todo     }

        ax_mtx.data = malloc(dif_mtx.row * dif_mtx.cols * sizeof(int));     if (!ax_mtx.data)     {         printf("malloc failed\n");         goto ax_failed;     }     find_(&ax_mtx, &dif_mtx, '<', 0);     if(ax_mtx.cols <= 2)         return -1;     az_mtx.cols = ax_mtx.cols - 2;     az_mtx.row = 1;     az_mtx.data = malloc(az_mtx.cols * 4);     if (!az_mtx.data)     {         printf("malloc failed\n");         goto az_failed;     }     memcpy(az_mtx.data, ax_mtx.data + 1, (az_mtx.cols) * sizeof(int));

        display_matrix_(&ax_mtx);     display_matrix_(&az_mtx);     display_matrix_(&dif_mtx);     for(k = 0; k < az_mtx.cols; k++)     {         int x = dif_mtx.row;         int y = dif_mtx.cols;         int *p = az_mtx.data;         int az = *(p + k);

            *(dif_mtx.data + az / x + az % x * y) = (              *(dif_mtx.data + (az + 1) / x + (az + 1) % x * y) +              *(dif_mtx.data + (az - 1) / x + (az - 1) % x * y) +              *(dif_mtx.data + az / x + az % x * y)               )/3 ;     }     printf("dif\n");     display_matrix_(&dif_mtx);

        abs_mtx.data = malloc(dif_mtx.cols * dif_mtx.row * sizeof(int));     if (!abs_mtx.data)     {         printf("malloc failed\n");         goto abs_failed;     }     abs_(&abs_mtx,&dif_mtx);     printf("abs(dif)\n");     display_matrix_(&abs_mtx);     find_(&xx_mtx, &abs_mtx, '<', 10);      printf("prev dif\n");     display_matrix_(&dif_mtx);     replace_(&dif_mtx, &xx_mtx, 0);     printf("post dif\n");     display_matrix_(&dif_mtx);

        logic_mtx.data = malloc(dif_mtx.cols*sizeof(int));     if (!logic_mtx.data)     {         printf("malloc failed\n");         goto logic_failed;     }     max_(&logic_mtx,&dif_mtx);     if (logic_mtx.data == 0)     {

        }     else     {         int tmp;                  printf("max(dif_mtx)\n");         display_matrix_(&logic_mtx);         max_(&logic_mtx,&logic_mtx);         printf("max(max(dif_mtx))\n");         display_matrix_(&logic_mtx);         tmp = *(logic_mtx.data);         printf("tmp:%d\n",tmp);         display_matrix_(&logic_mtx);         mul_(&dif_mtx,&dif_mtx,255);         display_matrix_(&dif_mtx);         chu_(&dif_mtx,&dif_mtx,tmp);         display_matrix_(&dif_mtx);     }

        //mtx src_mtx, dst_mtx, dif_mtx, sum_ret, ssum_ret;     //mtx c_mtx, xx_mtx, ax_mtx, az_mtx, abs_mtx, logic_mtx;              free(logic_mtx.data); logic_failed:     free(abs_mtx.data); abs_failed:     free(az_mtx.data); az_failed:     free(ax_mtx.data); ax_failed:     free(xx_mtx.data); xx_failed:     free(c_mtx.data); c_failed:     free(ssum_ret.data); ssum_failed:     free(sum_ret.data); sum_failed:     free(dif_mtx.data); dif_failed:     free(dst_mtx.data); dst_failed:         free(src_mtx.data); src_failed:     close(fd);          return 0; }

    源码链接:https://pan.baidu.com/s/1K_jkevrYby_6iNJ9HN8upQ  提取码:eg0v 

    最新回复(0)