3422|2

774

帖子

2

TA的资源

纯净的硅(中级)

楼主
 

BBB频谱仪经验分享之波形显示 [复制链接]

本帖最后由 airqj 于 2014-7-20 21:46 编辑

做这个最开始是想用linux的curses库来做的,就是那种基于终端的显示方式。后来想想效果可能会不是很明显,最后决定使用Qt + qwt库作为显示界面。
前一个文章说道如何读取音频数据并作初步处理,这里则如何使用Qt将音频数据显示在屏幕上。因为篇幅原因,先上主要的代码
  1. void Plot::getdata_from_shm()
  2. {
  3.     float_t *addr_ptr=(float_t *)shm_client_addr;
  4.     fft_client_waiting_for_read(sem_client_id);
  5.     for(Plot::index=d_interval.minValue();Plot::index<d_interval.maxValue();Plot::index+=0.020833)
  6.     {
  7.         const QPointF s(index,*addr_ptr);
  8.         SignalData::instance().append(s);
  9.         addr_ptr++;
  10.     }
  11.     fft_client_release(sem_client_id);
  12. }
复制代码

这里大家估计都看出来了,我这个频谱仪使用了两个进程,服务端进行初步的数据处理,前台进程从共享内存中读取数据后显示在开发板的屏幕上。为什么要使用两个进程来做这个频谱仪呢?主要是因为如果只使用一个进程来做的话,就得既得处理数据又得显示数据,而在处理数据的时候是需要一定的时间的,这样就得停滞,从而实时性可能得不到要求。而且am3359有512M的内存,放着这么多的内存不用起步可惜。这里使用了共享内存作为数据交换的方式,信号量控制读写同步。shm_client_addr就是共享内存的地址,sem_client_id就是信号量在客户端的id。对于这方面不熟悉的同学可以上网查一下这方面的资料.大家可能会对后面那个数字感到奇怪,这个数字主要是因为使用48kHz采样频率,1/48000就可以得到这个数字了
为了便于大家学习,贴上共享内存和信号量在服务器端的主要代码
共享内存:
  1. char * shm_init()
  2. {
  3.     printf("before shmget shm_id is %d\n",shm_id);
  4.     fflush(stdout);
  5.     shm_id=shmget(SHM_KEY,SHM_SIZE,IPC_CREAT|0777);
  6.     char *addr=NULL;
  7.     if(shm_id<=0)
  8.     {
  9.         perror("shmget error\n");
  10.         printf("errorno is %d\n",errno);
  11.     }
  12.     addr=(char *)shmat(shm_id,NULL,0777);
  13.     if(NULL==addr)
  14.     {
  15.         perror("shmat error\n");

  16.     }
  17.     return addr;
  18. }
复制代码
这个是信号量的
  1. union semun {
  2.     int val;
  3.     struct semid_ds *buf;
  4.     unsigned short *array;
  5.     struct seminfo * __buf;
  6. };

  7. void clear_sem(int semid,int sem_nu)
  8. {
  9.     union semun sem_initial;
  10.     sem_initial.val=0;

  11.     if(semctl(semid,sem_nu,SETVAL,sem_initial))
  12.     {
  13.         perror("clear sem faild\n");
  14.         _Exit(1);
  15.     }
  16. }

  17. static int fft_server_sem_id;
  18. int sem_init()
  19. {
  20.     fft_server_sem_id=semget(SEM_KEY,SEM_NUM,IPC_CREAT|0777);
  21.     if(fft_server_sem_id<=0)
  22.     {
  23.         perror("server semget error\n");
  24.         _Exit(1);
  25.     }
  26.     clear_sem(fft_server_sem_id,0);
  27.     clear_sem(fft_server_sem_id,1);
  28.     return fft_server_sem_id;

  29. }

  30. void fft_server_waiting_for_write(int sem_id)
  31. {
  32.     struct sembuf actions[2];  //wait sem 0 is 0 : read sem
  33.     actions[0].sem_num=0;
  34.     actions[0].sem_flg=SEM_UNDO;
  35.     actions[0].sem_op=0;

  36.     actions[1].sem_num=1;
  37.     actions[1].sem_flg=SEM_UNDO;
  38.     actions[1].sem_op=1;

  39.     if(0!=semop(sem_id,actions,2))
  40.     {
  41.         perror("server client semop faild\n");
  42.         _Exit(1);
  43.     }
  44. }

  45. void fft_client_waiting_for_read(int sem_id)
  46. {
  47.     struct sembuf actions[2];
  48.     actions[0].sem_num=1;
  49.     actions[0].sem_op=0;
  50.     actions[0].sem_flg=SEM_UNDO;

  51.     actions[1].sem_num=0;
  52.     actions[1].sem_flg=SEM_UNDO;
  53.     actions[1].sem_op=1;

  54.     if(0!=semop(sem_id,actions,2))
  55.     {
  56.         perror("client read error\n");
  57.         _Exit(1);
  58.     }
  59. }

  60. void fft_server_release(int sem_id)
  61. {
  62.     struct sembuf action;
  63.     action.sem_num=1;
  64.     action.sem_flg=SEM_UNDO;
  65.     action.sem_op=-1;

  66.     if(0!=semop(sem_id,&action,1))
  67.     {
  68.         perror("server release faild\n ");
  69.         _Exit(1);
  70.     }
  71. }

  72. void fft_client_release(int sem_id)
  73. {
  74.     struct sembuf action;
  75.     action.sem_num=0;
  76.     action.sem_flg=SEM_UNDO;
  77.     action.sem_op=-1;

  78.     if(0!=semop(sem_id,&action,1))
  79.     {
  80.         perror("client  release semop faild\n");
  81.         _Exit(1);
  82.     }
  83. }
复制代码
信号量的相对于共享内存稍微复杂一些,有什么问题大家可以回帖提问

最新回复

前来顶贴!!  详情 回复 发表于 2014-7-20 22:21
点赞 关注
 

回复
举报

774

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
写了好一大段字又没了
 
 

回复

1246

帖子

18

TA的资源

五彩晶圆(初级)

板凳
 
前来顶贴!!
个人签名
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表