|
今天是活动最后一天,恰好是周末,就有了点时间来写东西(一周要上六天班,每天七点下班.看了一天电脑回到住的地方就再也不想看着电脑屏幕了)
做的这个频谱仪在采集音频数据的时候本来是想用耳机自己搭一个音频采集电路,用AM3359的AD和耳机进行音频采集。但是在做AD数据采集的时候发现am3359可以用读取in_voltagex_raw文件(具体可以参考
wytalfred的文章)的形式来采集数据样本,感觉达不到实时的要求,(尽管am3359的性能已经足够,但是感觉还是不合适)。具体可以参考http://beagleboard-gsoc13.blogspot.com/2013/07/sampling-analogue-signals-using-adc-on.html。文中使用echo 1 > /sys/bus/iio/trigger0/trigger_now的方式进行AD触发数据采集,在generic_buffer中使用poll等待数据可读。这个使用的是sysfstrig的方式进行触发。实际上在IIO中还有一种触发方式,就是使用GPIO进行触发,这个方法相对于使用sysfstrig来说实时行会有一定的提高,可以把linux内核源码翻了个底朝天也没有找到具体方式,应该是要重新写驱动的。 后来想起anananjjj的提醒,可以使用am3359的IIS进行数据采集,于是赶紧查资料然后买了USB声卡写了代码找了耳机来试了一下,果然效果不错.。详细介绍请看这个链接http://www.ibm.com/developerworks/cn/linux/l-audio/(网上中文的关于linux下音频编程的百分之八十都是抄这个的)。
我的代码- #include "my_soundcard.h"
- void soundcard_init(int fd)
- {
- int arg;
- arg=SAMPLE_RATE;
- if(ioctl(fd,SOUND_PCM_WRITE_RATE,&arg))
- {
- perror("set sample rate faild");
- _exit(1);
- }
- arg=SIZE;
- if(ioctl(fd,SOUND_PCM_WRITE_BITS,&arg))
- {
- perror("set sample size faild\n");
- _exit(1);
- }
- arg=AFMT_U16_LE;
- if(ioctl(fd,SNDCTL_DSP_SETFMT,&arg))
- {
- perror("set data format faild\n");
- _exit(1);
- }
- }
复制代码
|
|