正如上述几个BLOG所描述的,我们这个FSK的基本思路就是传递数据0时候一个频率,传递1时候是另外一个频率。我们通过DDS合成不同的频率,而通过过零检测实现对接收到基带频率统计周期的计算,从而判断是在那个频率点上,以解调出来0或者1。
我们这里做一个接口,查看一下在不同的频率设置点上,收到的信号周期都是多少。
这个cnt寄存器索引到axi lite的4号寄存器里面。
unsigned int FSK_GET_CNT(){
unsigned int r = *(volatile unsigned int *) (0x43c00000 + 4*4) ;
return ( r );
}
之后循环设置不同的step数值,调用这个函数看一下周期数duosh。
while(1){
FSK_TX_SET (0,0,i,i);
usleep(1000);
t32=2;
while(t32--)
{
printf("%d , %d ,\n",i,FSK_GET_CNT());
usleep(100);
}
while(1) if ( 0x0d == getchar())break;
i++;
}
我们看一下结果:
很显然发送时设置的步进step和收的周期计数器cnt基本成反比,即在误差允许范围内step*cnt=360
文本的统计我列下来:
/*
*1 , 359 ,
2 , 179 ,
3 , 118 ,
4 , 89 ,
5 , 71 ,
6 , 59 ,
7 , 51 ,
8 , 44 ,
9 , 39 ,
10 , 35 ,
11 , 32 ,
12 , 29 ,
13 , 26 ,
14 , 25 ,
15 , 23 ,
16 , 22 ,
17 , 21 ,
18 , 19 ,
19 , 18 ,
20 , 17 ,
21 , 17 ,
22 , 16 ,
23 , 15 ,
24 , 14 ,
25 , 14 ,
26 , 13 ,
27 , 14 ,
28 , 12 ,
29 , 12 ,
30 , 11 ,
31 , 11 ,
32 , 11 ,
33 , 10 ,
34 , 10 ,
35 , 10 ,
36 , 9 ,
37 , 9 ,
38 , 9 ,
39 , 9 ,
40 , 8 ,
41 , 8 ,
42 , 8 ,
43 , 8 ,
44 , 8 ,
45 , 7 ,
46 , 7 ,
47 , 7 ,
48 , 7 ,
49 , 7 ,
50 , 7 ,
51 , 7 ,
52 , 6 ,
53 , 6 ,
54 , 6 ,
55 , 6 ,
56 , 6 ,
57 , 6 ,
58 , 6 ,
59 , 6 ,
60 , 5 ,
61 , 5 ,
62 , 5 ,
63 , 5 ,
64 , 5 ,
65 , 5 ,
66 , 5 ,
67 , 5 ,
68 , 5 ,
69 , 5 ,
70 , 5 ,
71 , 5 ,
72 , 4 ,
73 , 4 ,
74 , 4 ,
75 , 4 ,
76 , 4 ,
77 , 4 ,
78 , 4 ,
79 , 4 ,
80 , 4 ,
81 , 4 ,
82 , 4 ,
83 , 4 ,
84 , 4 ,
85 , 4 ,
86 , 4 ,
87 , 4 ,
88 , 4 ,
89 , 4 ,
90 , 3 ,
91 , 3 ,
92 , 3 ,
93 , 3 ,
94 , 3 ,
95 , 3 ,
96 , 3 ,
97 , 3 ,
98 , 3 ,
99 , 3 ,
100 , 3 ,
101 , 3 ,
102 , 3 ,
103 , 3 ,
104 , 3 ,
105 , 3 ,
106 , 3 ,
107 , 3 ,
108 , 3 ,
109 , 3 ,
110 , 3 ,
111 , 3 ,
112 , 3 ,
113 , 3 ,
114 , 3 ,
115 , 3 ,
116 , 3 ,
117 , 3 ,
118 , 3 ,
119 , 3 ,
120 , 2 ,
121 , 2 ,
* */
另外我也记录一下设置不同数值时候频谱状况(因为是不变频率的基带,所以也算不上频谱,就说频率吧)。
为了能在频谱仪上显示的明显一些并且好换算,如果是设置了基带采样率是36M,这样当360个点DDS出一个基带波形时候,基带频率应该是 0.1M ,在频谱仪上显示的结果的是RF频率加0.1M。我们以RF频率2.4G设置为中心,频谱仪每格设置成2M,分辨率50KHZ进行试验。我实际试验用的基带采样频率是默认的37M(忘记设置成36M,等发现的时候已经拍照很多了),这样大家看到的频谱和36M有一点点差别,可以自行脑补一下。
以下是截图:
还有对应step数值更多图,我上传到了网盘了:
链接:https://pan.baidu.com/s/1_1xezYx4v9SDzluuNvU9uA
提取码:3psm
图上能反应出以下几个问题:
1,当step是能被360整除的数时候,污染的频谱很少。
2,当step是能被360整除的数时候,有一定频谱的污染,这个可以归结在我们my_dds模块的简单实现。所以这里有继续研究ADI官方DDS和XILINX的DDS现成的IP和的必要。但是当符合被360整除时候,还是简单医用的。
3,另外返现有一个镜像的频率出现,这个点需要仔细研究一下。对比其他DDS实现研究一下是问题来源。
我们这里取两个点step点表示0和1,分别是25和14,而区分这两个点的cnt分别设置15和24。
void FSK_SET (){
FSK_TX_SET (0,0,25,14);
FSK_RX_SET(14+1,25-1);
}