|
发表于 2018-10-27 23:04:45
|
显示全部楼层
在ubuntu上编译了一下,感受一下这个项目。 本人有一定无人机,无人机通信项目,arm/linux开发经验。
首先安装解析音频文件需要的两个库到电脑:
1. alsa/asoundlib.h 是一个声音接口
运行:apt-get install libasound2-dev
2.sndfile.h
libsndfile 音频解码库,用来打开例子wav的。
http://www.mega-nerd.com/libsndf ... dfile-1.0.28.tar.gz
下载,解压,目录内执行:
./configure
make
make install
现在就安装好了。
3.进入楼主的源代码,运行 make编译, 运行 ./ sudo ./acarsdec -f ./test.wav 进行文件解码
[#2 (E:0) --------------------------------
Aircraft reg: .PH-BXR Flight id: KL1681
Mode: E Msg. label: 5V
Block id: 4 Ack: !
Msg. no: S53A
Message :
[#4 (E:0) --------------------------------
Aircraft reg: .LN-DYY Flight id: DY083J
Mode: 2 Msg. label: Q0
Block id: 4 Ack: !
Msg. no: S46A
Message :
[#2 (E:0) --------------------------------
Aircraft reg: .LN-DYY Flight id: DY083J
Mode: E Msg. label: Q0
Block id: 6 Ack: !
Msg. no: S47A
Message :
[#1 (E:0) --------------------------------
Aircraft reg: .F-GTAE Flight id: AF7728
Mode: G Msg. label: H1
Block id: 3 Ack: !
Msg. no: D65C
Message :
#DFB00000/V206,05,124,183,02,00,00000/V3XX,XX,XXX,XXX,XXXX/V4XX,XX,XXX,XXX,XXXX/V5XX,XX,XXX,XXX,XXXX/V6XX,XX,XXX,XXX,XXXX/V7044,078,00081,22222222222111/V8042,083,00061,22222222222111/
[#1 (E:0) --------------------------------
Aircraft reg: .LN-DYY Flight id:
Mode: x Msg. label: _d
Block id: A Ack: 5
Msg. no:
Message :
[#3 (E:0) --------------------------------
Aircraft reg: .G-DBCK Flight id: BA031T
Mode: 2 Msg. label: _d
Block id: 0 Ack: W
Msg. no: S64A
Message :
[#3 (E:0) --------------------------------
Aircraft reg: .G-DBCK Flight id: BA031T
Mode: E Msg. label: Q0
Block id: 9 Ack: !
Msg. no: S63A
Message :
原来声音里面调制了编码,来达到通信的目的。
看一下解码文件算法
- static float fst_atan2(float y, float x)
- {
- float r,angle;
- float abs_y = fabs(y)+1e-10; // kludge to prevent 0/0 condition
- if (x>=0)
- {
- r = (x - abs_y) / (x + abs_y);
- angle = M_PI_4 - M_PI_4 * r;
- }
- else
- {
- r = (x + abs_y) / (abs_y - x);
- angle = 3*M_PI_4 - M_PI_4 * r;
- }
- if (y < 0)
- return(-angle); // negate if in quad III or IV
- else
- return(angle);
- }
- static void putbit(float v,channel_t *ch)
- {
- ch->outbits>>=1;
- if(v>0) {
- ch->outbits|=0x80;
- }
- ch->nbits--;
- if(ch->nbits<=0)decodeAcars(ch);
- }
- void demodMsk(float in, channel_t *ch)
- {
- int idx,j;
- float iv,qv,s,bit;
- float dphi;
- float p,sp,cp;
-
- /* oscilator */
- p=ch->MskFreq+ch->MskDf;
- ch->MskClk+=p;
- p=ch->MskPhi+p;
- if(p>=2.0*M_PI){
- p-=2.0*M_PI;
- }
- ch->MskPhi=p;
- idx=ch->idx;
- if(ch->MskClk>3*M_PI/2) {
- ch->MskClk-=3*M_PI/2;
- /* matched filter */
- for(j=0,iv=qv=0;j<ch->flen-1;j++) {
- int k=(idx+1+j)%ch->flen;
- iv+=ch->h[j]*ch->I[k];
- qv+=ch->h[j]*ch->Q[k];
- }
- if((ch->MskS&1)==0) {
- if(iv>=0)
- dphi=fst_atan2(-qv,iv);
- else
- dphi=fst_atan2(qv,-iv);
- if(ch->MskS&2) {
- bit=iv;
- } else {
- bit=-iv;
- }
- putbit(bit,ch);
- } else {
- if(qv>=0)
- dphi=fst_atan2(iv,qv);
- else
- dphi=fst_atan2(-iv,-qv);
- if(ch->MskS&2) {
- bit=-qv;
- } else {
- bit=qv;
- }
- putbit(bit,ch);
- }
- ch->MskS=(ch->MskS+1)&3;
-
- /* PLL */
- dphi*=ch->MskKa;
- ch->MskDf=PLLKc*ch->MskDf+dphi-PLLKb*ch->Mska;
- ch->Mska=dphi;
- }
- /* DC blocking */
- s=in-ch->Mskdc;
- ch->Mskdc=(1.0-ch->Mskdcf)*ch->Mskdc+ch->Mskdcf*in;
- /* FI */
- sincosf(p,&sp,&cp);
- ch->I[idx]=s*cp;
- ch->Q[idx]=s*sp;
- ch->idx=(idx+1)%ch->flen;
- }
复制代码
以上,读入1k的数据,进行解码,原子操作。快速数学算法已经提供。移植难度很小,基本复制粘贴。 |
|