当你理解了相关的Matlab程序后,将其转换成相应的C语言程序是非常容易的。对于Matlab仿真程序,我们列出了仿真的输入、计算项和仿真的输出,这些概念和DSK程序的概念非常类似,只是名称稍有变化。对于DSK,我们将使用项目“声明”和“算法过程”。我们对Matlab的算法流程几乎不做修改。
●DSP必须实时地处理来自ADC的相关数据。因此,我们不能等到接收了所有的信息采样点后再开始算法过程。
●实时的DSP本质上是一个中断驱动的过程,输出的采样点只有使用终端服务过程(ISR)才能进行处理。在这个情况下,DSP程序员很难满足周期性信号的采样过程的实时需求。同时要记住输入和输出的ISR是异步的。除非你对DSP使用合适的接收和发射ISR进行编程,否则不能对DSP硬件输入和输出任何东西。
●ADC和DAC的数字部分本质上说是整数的。无论ADC的输入范围如何,模拟输出电压被映射到一个整数,对于一个16位的转换器而言,使用二进制补码表示,可能的数值范围为+32767~-32768。既然-32768是DSP接受到的信号数值的最大负数,那么不大于+32768的偏置电平可能阻止接收机处的包络失真。大于+32768的偏置电平一定可以保证产生正确的AM信号。
基于上述考虑,程序被分割为下面的几个部分:
●声明
偏置电平
载波频率
●算法过程
读取来自ADC对的信号采样
计算下个载波的数值
计算AM信号的数值(www.xing528.com)
对AM信号进行归一化以适应DAC的输出需要
将AM的信号输出到DAC中
看一下本书CD中第13章的ccs\AmTx文件夹下的相关工程文件。我们可以提供这个工程的两种实现方法,一个直接的方法(使用文件ISRs.c)和一个更有效率的方法(使用文件ISR_Table.c)。选择这两个文件中的其中一个(只能一个)载入你的CCS工程。使用ISR_Table.c然后修改StartUp-c文件使得函数调用FillSi-neTable没有被注释掉。该段代码将是针对写入一个高速立体声编码器的。如果你使用编码器C6711,你将会降低信号电平和载波的频率。
如果我们通过方程s(t)=Ac[B+m(t)]cos(2πfct来直接产生AM信号,而不去考虑DAC的输入信号的归一化的需求,我们可能会超过需要的电平范围。我们必须假设ADC的整个范围对于输入数据CodecData-Channel[LEFT]是-32768~+32767。因此,偏置必须至少是+32768,从而避免bias+CodecData-Channel[LEFT]这个组合项变成负数。记住这个组合项不能为负数,或者说当使用一个包络检波器时候在接收机输出不能够发生信号失真。如果偏置被设定为大于+32768,那么bias+CodecData.Channel[LEFT]最大的数值为32768+32767=65535。我们对一个载波产生的正弦信号的幅度是|sin(·)|≥1,所以这意味着需要一个0-5的归一化因子来阻止AM信号数值超过DAC所允许的范围[4]。这个AM的产生方程可以通过下面的程序来实现。注意,由于这个页面有限,所以对下面程序中的一行代码进行了换行。
程序清单13.2:DSB-LC AM的归一化实现部分的C语言代码
粗略观察一下代码,容易观察到接收机的ISR仍然是大多数DSP计算资源中最常用的。这是由于函数sinf。虽然看上去很容易计算,但仍然是计算量非常大的子程序,它的原型声明在math-h的头文件中。正如本书第5章讨论的,可以用许多技术来产生一个正弦波。代码综合了这个概念来产生一个AM信号。对StartUp.c惟一变化的是注释掉了调用函数FIllSineTable()的相应行,工程的这个版本使用的中断调用程序包含在ISR_Table.c中。
对数组SineTable填充数据后,下面的代码行从一个查找表中提取非插值的正弦函数和正弦波形产生与归一化相关的计算代码如下。
程序清单13.3:从查找表中提取正弦函数值的C语言代码
此代码与AM波形发生器最终计算结果相结合,再进行等比例计算。
程序清单13.4:带正弦查找表的DSB-LC AM等比例应用的C语言代码
粗略查看一下使用新的载波产生的算法,可以看到它大约节省了80%的发射机ISR的计算资源。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。