全文 4 Cordic算法实现求模
目前实现Cordic算法主要有两种基本的结构:较为简洁的状态机和高速全流水线处理器。在此采用高速全流水线处理器。在流水线结构中,各阶段数据处理不影响后面数据的输入,在每个时钟周期到来是将各阶段的数据不断前移,后面的数据不断输入,犹如一个FIFO缓冲期,在每个时钟周期到来时地址不断向前移一位,后来的数据不断的往里输,在各时钟周期不同地址间数据不会相互影响。这就保证了实时系统的数据能不断地流入而不会导致冲突。图4所示为5级迭代快速Cordic流水线结构:
如图5所示,采用QuartusⅡ的SignalTap采集的数据,经计算其准确率高达98%以上,能够满足设计的需求。根据图5所示计算mmsource_ exp信号,此信号是指数修正信号,是有符号型,将其转换成十进制数的-2。先计算头二组mmsource_real信号和mmource_imag信号数据。它们也是有符号数,因此将其转化为十进制数,转换结果为{-1,-80;-2,-17;-11,-53;26,-51},而根据Cordic算法得出的结果从图5中读出,依次为{5 209;1 113;3 517;3 723}。而实际经模修改后得到的标准值分别为{5 120;1 088;5 317;3 648}。
5 稳定处理
FFT阈值法的原理是先对原始信号做FFT处理,适当预设滤波阈值,将低于该阈值的频带设定为无效信号,定义为接收器没有接收到信号。当然阈值以下,并不能代表该周期产生了单频信而由于信道上或者硬件本身的干扰,单检测周期的测量值超过阈值或者在号或没产生。仅凭单检测周期的阈值检测而产生PTT控制信号会带来话音控制的不稳定性。
设计的算法能极大地提高阈值测试的稳定性。具体处理如下,流程如图6所示。
为实现该功能,需自定义一个计数器,初始值为0,计数器值定义在0到T(T》0)之间。若在加操作中使计数器值大于T,则将计数器值饱和到T;若在减操作中使计数器小于0,则将计数器值饱和到0。
第一步,检测测量值是否过阈值。若过阈值,计数器值加m,进行第二步;若不过阈值,计数器值减n,进行第四步。
第二步,若计数器值大于T,则饱和到T值。进行第三步。
第三步,检测计数器值,若计数器值等于T,则启动输出PTT控制信号,结束流程;若计数器值小于T,则维持上一次的PTT控制信号输出状态,结束流程。
第四步,若计数器值小于0,则饱和到0值。进行第五步。
第五步,检测计数器值,若计数器值等于0,则取消输出PTT控制信号,结束流程;若计数器值大于0,则维持上一次的PTT控制信号输出状态,结束流程。
在流程中,m,n值的选择取决于信道上或者硬件本身干扰的大小。若没有单频信号而误检出单频信号的错误概率比较大,则m的取值应较小;反之,若没有单频信号而误检出单频信号的错误概率比较小,则m的取值可以较大。同理,若有单频信号而未检出单频信号的错误概率比较大,则n的取值应较小;反之,若有单频信号而未检出单频信号的错误概率比较小,则n的取值可以较大。
图7所示,在CycloneⅢ实验板运行时采用SignalTapⅡ对状态机的各项内容进行验证,保证状态机运行良好。将相关程序下载到Cyclone-Ⅲ芯片里,实时采集音频数据对状态机进行分析。
在图7中,mmod在一个采样周期结束后ostart信号被触发,其获得的总能量为1 427,比预设阈值要低,因此ocounter1的状态不变,仍保持在第0状态,而ocounter2的状态则由第3状态跳到第2状态,这实践的结果和理论都是保持一致的,可以说明程序的正确性,状态机运行正常。
6 结语
本文可以用于一切需要PTT信号端的设备上,应用极其广泛,如:对讲机、飞机场指挥塔的应答系统以及目前已在美国推出的PTT手机业务等均运用到该技术。而在做该课题时遇到一些问题,如:陷波滤波器其阻带带宽偏大,需要寻求一种更好的算法来解决其带宽问题;其次,FIR消耗内存较大,这样会消耗大部分的FPGA逻辑资源,会导致较大系统的资源不够,因此需要设计更好的数据流结构和算法来处理这个问题。这将是笔者以后需要继续研究学习的。