




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DSP课程实验报告 DTMF信号的产生及检测 学 院: 电 子 信 息 工 程 学 院 组 员: 王乾乾 12213051 蒋雨涵 12213038 指导教师: 李居朋 时 间: 2015年6月8日 一、设计任务书- 0 -二、设计内容- 0 -2.1基本部分- 0 -2.2发挥部分- 0 -三、 设计方案、算法原理说明- 0 -3.1 DTMF (双音多频)信号简介- 0 -3.2 DTMF信号的产生- 1 -3.3 DTMF 信号的检测、接收部分原理- 3 -四、程序设计与结果分析- 8 -4.1 DTMF信号的产生- 8 -4.2 DTMF信号的检测- 11 -4.3运行结果及分析- 15 -4.4发挥部分- 18 -五实验总结与感想:- 27 -六参考文献- 28 -一、设计任务书 (1)编写C语言程序,并在CCS集成开发环境下调试通过。 (2)实现设计所要求的各项功能。 (3)按要求撰写设计报告。二、设计内容2.1基本部分 (1) 使用C语言编写DSP下DTMF信号的产生程序, 要求循环产生 09、 *、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。 (2) 使用C语言编写 DSP 下DTMF信号的检测程序,检测到的DTMF编码在CCS调试窗口中显示,要求既不能漏检,也不能重复检出。 (3) DTMF信号的发送与接收分别使用不同的实验板完成。2.2发挥部分 (1) 使用一个DSP工程实现DTMF信号的自发自收功能。 (2) 改进DTMF信号的规定指标,使每秒内可传送的 DTMF 编码加倍。 (3) 发送的DTMF信号的幅度在一定范围内可调,此时仍能完成DTMF信号的正常检测。三、 设计方案、算法原理说明图1 DTMF信令的编码3.1 DTMF (双音多频)信号简介双音多频 DTMF(Dual Tone MultiFrequency)信号在全世界范围内得到广泛应用, 将 DTMF 信号的产生与检测集成到含有数字信号处理器(DSP)的系统中, 是一项较有价值的工程应用。双音多频 DTMF(Dual Tone MultiFrequency)信号,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信号。 近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和 ATM 终端等。将 DTMF 信号的产生与检测集成到任一含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。DTMF 编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的 DTMF 信号中检测击键或数字信息的存在性。CCITT(国际电报电话咨询委员会)建议, 国际上采用 697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz、1633Hz 8 个频率, 并将其分成两个群, 即低频群和高频群。从低频群和高频群中任意抽出一个频率进行叠加组合, 具有16种组合形式, 让其代表数字和功率,电话机键盘上每一个键通过由图中行频与列频唯一确定。DTMF的编解码方案无需过多的计算量,可以很容易的在DSP系统里与其他任务并发执行。 组成 DTMF 信号的频率有一些特有的属性:所有的音频都位于人的可听范围内,因此当按键按下时人可以监测到;8个频率中没有一个频率是其他任意一个频率的倍数;8个频率中任意两个频率的组合,如相加或相减,都不等于其他任意一个频率。这些特性不仅简化了DTMF信号的解码同时也降低了DTMF误检的概率。这样便使得接收端几乎可以立即检测出按键的信息并可以摒弃语音或噪声的谐波能量。 因此语音或者噪声被误检为DTMF信号的概率就大大减小。3.2 DTMF信号的产生 DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件, 就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是7001700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件。 正弦波是任何波形构成的基本单元, 产生正弦波的方法一般有: 采样回放法、查表法、泰勒级数展开法、数字正弦振荡器法。 我们用的是sin函数产生离散的正弦值,因为这种方法我们比较熟悉而且通过查阅资料这种方法的也能达到误差要求,生成DTMF的公式为: 其中t为采样序数,由0开始递增;f1,f2为生成DTMF信号的两个正弦波的频率;fs为采样频率;buffert为序数t时的得出的采样值。将这些数据转换为Q15格式然后通过codec发送出去。 CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms内其他时间为静音,以便区别连续的两个按键信号。我们使用8000Hz的采样频率,即1秒采样8000个点,则100ms采样800个点,我们设置800个点的缓存,其中用400个缓存产生的 DTMF 信号值,即音频信号必须持续50ms,另外400个存0值,即静音信号。数字振荡器的二阶系统其传递函数 H(z)没有零点。只有一对在单位圆上的共扼极点,单位冲击响应为恒幅度震荡,即产生了正弦信号,。经变换后得函数的差分方程:,其中,fs为采样频率,f0为输出频率。该式初值为y(-1)=0,y(2) =Asin0,A 为输出正弦波的幅度。DTMF发生算法原理框图如图:图2 DTMF信号的产生原理框图对于DTMF所产生的频率和采样频率为:row频率: 697Hz770Hz,852Hz,941Hz;column频率:1209Hz,1336Hz,1477Hz,1633Hz采样频率:fs=8KHz另外,需要注意的是,由于本实验需要用到 BJTU-DSP5502 实验系统板上的CODEC模块,因此在编写的程序中还需要写入A/D、D/A 转换部分。图3 DTMF信号产生的试验系统原理框图3.3 DTMF 信号的检测、接收部分原理DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转换到频域,然后得出对应的数字信息。由于DSP芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片进行处理。在信号接收端,需要对DTMF信号进行检测,即寻找信号的行频和列频,最后根据DTMF键盘信息确定相应的数字或符号。对DTMF信号的检测方法可以有多种。主要分为从信号时间域处理和从信号频率域处理两大类。前一种方法包括:过零点位置检测法、信号峰值位置检测法、过零点位置及信号幅值检测法等。其特点是实现简单,可以通过8880等芯片加上外围电路实现,易于集成化。缺点是易受干扰,对信噪比要求高。现在广泛用于一般的脉冲拨号电话机,通过采用神经网络等辅助判别方法可以大大提高信号的识别率。后一种方法包括:频率判断、能量判断两类。频率判断主要通过滤波器提取DTMF相应的频率信号进行比较判断,滤渡器可以用窄带、低通、高通滤波器,应用方式可有并联,级联,混合等方式。能量判断是直接计算对DTMF信号相应的能量进行计算,找出高、低频率群中最强的信号,进行判断。包括DFT法(Discrete Fourier Transform),FFT(Fast Fourier Transform),Goertzel 算法等。我们在这里采用的改进Goertzel法,与其他方法比较,对信噪比要具有很强抗噪声能力。频率检测时,检测出DTMF信号的基波及二次谐波,DTMF信号只在基波上有较高能量,而话音信号则在基波上叠加有较强的二次谐波,检测二次谐波的作用是用来区分DTMF信号与语言和音乐信号。3.3.1 Goertzel 算法原理 采用Goertzel基本算法能得出与常规离散傅立叶变换(DFT)或FFT相同的频率实部和虚部。如果需要的话,还可以从该频率实部和虚部中算出幅度和相位信息。Goertzel优化算法则比Goertzel基本算法更快也更简单,但Goertzel优化算法并不给出频率实部和虚部分量,它只能给出相关的幅度平方。如果需要幅度信息,可通过对该结果开方得到,但该方法无法得到相位信息。下面将对Goertzel基本算法和Goertzel优化算法进行讨论。Goertzel基本算法在每次采样后立即进行处理,在每个第N次采样进行一次音调检测。在采用FFT算法时,我们要对成块的采样进行处理,但这并不意味着必须按块来处理数据。数字处理的时间很短,因此如果每次采样都存在一次中断,那么这些数字处理完全可以在中断服务程序(ISR)内完成。或者,如果系统中存在采样缓存,那么可以持续采样,然后进行批处理。在真正运行 Goertzel 算法之前,必须进行下面的初步计算:1)决定采样率;2)选择块大小,即 N;3)预先进行一次余弦和正弦计算;4)预先计算一个系数。这些计算均可以预先完成, 然后硬编码到程序中, 从而节省 RAM 和 ROM 空间,也可以动态方式计算。在采样率和块大小确定之后, 只须通过下面几个简单的计算来得出处理时所需要的常数:: 其中,采样频率(sampling_rate)和目标频率(target_frequency)。每一次采样处理中都需要3个变量,我们称其为Vkn-2、Vkn-1和Vkn。Vkn-1是前一次采样处理的Vkn值,Vkn-2是在两次采样前的Vkn值(或Vkn-1在本次采样前的值)。 在每个采样块的开始时,都必须将Vkn-1和Vkn-2初始化为0。每个采样都需要按照下面三个等式进行计算:在进行 N 次预采样计算之后,可以检测到音调是否存在 这时只需进行一次简单的幅度门限测试就可以判断出是否有音调存在。之后将Vkn和Vkn-1复位到0,开始下一次采样。3.3.2 Goertzel 优化算法Goertzel 优化算法比 Goertzel 基本算法所需的计算量小,但这是以损失相位信息为代价。 Goertzel算法实质是以一个二阶IIR带通滤波器为基础,该带通滤波器具有如下的传递函数:利用该算法可以有效地计算DTMF信号的DFT值。以往实验已经表明该算法对于提取DTMF输入信号既有效又快速。 该滤波器的直接型实现可以表述为以下差分方程:由于在DTMF检测中,输入的信号是实数序列,并不需要检测出8个行频/列频的相位,只需要计算出其幅度平方即可。对于实序列x(n),Goertzel算法所需的内部变量k n也为实数。因此计算| xk | 2如下:在 Goertzel 优化算法中每个采样处理完全一样,但处理的结果与 Goertzel基本算法不同。在 Goertzel 基本算法中,通常需要计算信号的实部和虚部,然后将实部和虚部的计算结果转换为相应的幅度平方。而在优化 Goertzel 算法中则不需计算实部和虚部,用上式的计算可完全避免复数运算。当幅值的平方大于某一定值时即可判定其频率点上有对应的信息。该滤波器所对应的网络结构如图所示。其中,xn是输入的采样值,并且Vk-1=Vkn-2=0,k=2fk=2kfs/N。代表Goertzel算法的递归部分。图4 Goertzel算法的原理框图3.3.3 Goertzel 算法具体实现及性能分析首先,由于DTMF信号在时域是模拟的,因此对它的检测需要先对其采样形成数字信号。 从组成DTMF信号的高、 低频率组中可以看到其最大频率为1633Hz,采用fs=8kHz的采样频率对其采样显然满足奈奎斯特采样定律。此外N的选取决定了频率分辨率以及捕捉N个样值所需要的时间,对基于Goertzel 算法的DTMF信号检测的有效性来说至关重要。Goertzel算法中的块大小N与相应的FFT中的点数类似,它控制了频率分辨率的大小。例如,若采样率为8kHz,而N为100个采样,那么频率分辨率就是80Hz。这就可能使我们为了获取最大的频率分辨率而尽量将N取高。然而N越大,检测到每个音调所需的时间就越多, 因为我们必须等所有这N个采样都完成后才能开始处理。例如,采样率为8kHz时,累积800个采样需要 100ms。若想缩短检测音调的时间,就必须适当调整 N的值。影响 N 的选择的另一个因素是采样率和目标频率之间的关系。比较理想情况是目标频率在相应的频率分辨率的中点范围内,也就是说,我们希望目标频率是sample_rate/N比值的整数倍。值得庆幸的是,Goertzel 算法中的N与FFT中不同,不必是2的整数次幂。频率分辨率被用来选择IIR滤波器中所需的DTMF信号的频率,这可以通过计算下式中的k来实现:fk=(kfs)/N 这样计算出的 DTMF 信号频率可能与实际的DTMF信号频率有一定的差别,但可以通过加大N的选取来减小这种频率差异。然而从另外一方面来考虑,虽然加大了N的选取会使频率的差异减小,但这势必会带来捕捉N个样值所需要的时间的增加,而这个时间的增加势必会对检测的效果造成一定的影响。 因此,需要在频率分辨率和捕捉N个样值所需要的时间这两个因素之间做出权衡。由 DTMF 信号频率所具有的特性不难发现要选取一定的N值使得计算出的频率和真实的DTMF信号的频率相一致几乎不可能,而实际中也并不需要计算出来的频率值与其真实频率相一致,只需偏差保持在15即可认为是 DTMF 信号的真实频率。在对DTMF信号采样以及确定N,k 值之后就可以进行检测。下面对 k 的绝对误差最小时 N 的取值进行简要的论证:任取一有效频率进行证明,如941 Hz,令y1表示k的绝对误差,t表示对x变量替换后的变量,y2是y1的上取整表示。问题便简化为以下数学模型:T 为何值时y1=|941 / 8000 -941 / 8000 |可取得最小值?其中 N 的变化区间用 x 表示:160x250 。通过变量代换求得:序列 241,187,244,170,225,179,195,196。求兼顾所有 8 个频率误差的 N 值。构造,对其求导得到极点204.625 x时使 y 最小,x是步长为1的整数,可以得到205 x时使 y最小。因此,当 N 取值为 205 时检测到的频率对应的 k 的绝对误差最小。所以此时对应的频率检测的正确率最高。实验还发现,采用 FFT 提取 DTMF 信号的频谱与 Goertzel 算法上的效果相近,但它在运算次数方面要远远逊色于 Goertzel算法。对这两种算法的运算次数比较如表所示,所以对 DTMF 信号的检测时选取 N 值为 205。3.3.4 DTMF信号的有效性检测 得到了DTMF信号的基波及二次谐波的频谱平方幅度信息后, 需要通过一系列检测才能确定信号的有效性: (1)DTMF信号的强度是否足够大,行列频率分量平方幅度和是否高于规定的门限值。 (2)如果DTMF信号存在,比较行列频率的最大频率分量差值,因为电话线具有低通特性,列频比行频衰减得要厉害,因此要设置一门限值。 (3)分别在行列频率组比较频谱分量,最强的谱线至少要比其他音频信号高一个门限值。 (4)二次谐波分量是否小于某个值。 (5)判断DTMF信号是否包含稳定的数字信息,只有数字信息被连续检测到两次,才认为数字信息是稳定的。 (6)最后要检测数字信息之后是否有停顿状态,只有这样才将当前的数字作为有效数字。在每一个接收中断到来时,表明采到一个新样点。样点值代入式,迭代计算8个行频列频的中间变量v(n)(k为8个行频列频分别对应的数字频率),直到采到N=125个样点(在8kHz采样频率下,约为15ms)。此时再按式计算8个行频列频的幅度平方|xk |2。接下来将|xk |2与门限作比较,并作二次谐波检测,判决出有效的音频信号。将音频信号映射为数字信号后,再与上一个检测到的数字信号比较,最终判决出有效的数字信号。四、程序设计与结果分析4.1 DTMF信号的产生DTMF 编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是 7001700Hz,选取 8000Hz作为采样频率,即可满足 Nyquist 条件。基于我们的试验条件和知识水平,我们没有使用硬件设计二阶数字正弦波振荡器来产生余弦函数,而是使用软件产生,即直接调用c程序中自带的math.h中的正弦函数。发送程序如下:/*-头文件-*/#include #include #include #include #include #include #include #include #include #include #include CODEC.h#include volume.h#undef CODEC_ADDR#define CODEC_ADDR 0x1A/ 定义McBSP的句柄MCBSP_HandlehMcbsp;/*-*/ / 主函数 / /*-*/*-定义变量-*/ Int16 buffer800; /float buffer1800;float A=163; /产生信号的幅度int gain = MINGAIN; floatx,y;int k=0;inti=0;intnum=0;/int count=0;floatfreq162= 941,1336, /0 697,1209, /1 697,1336, /2 697,1477, /3 770,1209, /4 770,1336, /5 770,1477, /6 852,1209, /7 852,1336, /8 852,1477, /9 697,1633, /A 770,1633, /B 852,1633, /C 941,1633, /D 941,1209, /* 941,1477 /# ;float pi=3.1415926;/*-定义发射400个有效点、400个静音点的子程序-*/void generate(intnum)floatx,y;int k=0;while(1)for(k=0;k800;k+)while(!MCBSP_xrdy(hMcbsp) ;MCBSP_write16(hMcbsp, bufferk);/左声道输出while(!MCBSP_xrdy(hMcbsp) ;MCBSP_write16(hMcbsp, bufferk);/右声道输出if(num=17) /依次输出0-#等16个音num=0;x=freqnum0/8000; /f/fsam行频y=freqnum1/8000; /f/fsam列频num+;for(k=0;k400;k+)bufferk=(sin(2*pi*y*k)+sin(2*pi*x*k)*(A+10*gain);/把有用信号扩大到16位bufferk+400=0;/静音信号/*- FUNCTION: MAIN -*/void main()/ CSL初始化CSL_init();/ 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数,频率设置为240MHzPLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);/EMIF初始化Emif_Config(); /打开McBSP port 1 产生McBSP句柄hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);/ ConfigMcBSPport 1 by use previously defined structureMcbsp_Config(hMcbsp);/I2C初始化I2C_cofig(); /CODEC寄存器初始化inti_AIC(); /*-*/ Receive the ADC output data of CODEC / Then output the received data to DAC of CODEC /*-循环产生16个符号值-*/generate(num);4.2 DTMF信号的检测在输入信号中检测 DTMF 信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索 DTMF 信号频谱的存在。 整个检测过程分两步: 首先采用 Goertzel 算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。第一步:采用 Goertzel 算法在输入信号中提取频谱信息。根据之前对优化的 Goertzel 算法的阐述,对每个采样点递归计算,并在N个样点采集并计算完成后,计算8个频谱值。第二步:有效性检查: 当频谱值计算出来后,还要进行 DTMF 有效性检验,以判定是否为有效的DTMF信号。即高、低频段的最大幅值都必须大于某个门限值。并且可以还原为输入数字。主要程序如下:#include #include #include #include #include #include #include #include #include #include #include CODEC.h#undef CODEC_ADDR#define CODEC_ADDR 0x1A/ 定义McBSP的句柄MCBSP_HandlehMcbsp;float buffer125;float pi=3.1415926;Int16 test125;Int16 dacdata;int k=0;inti,j;int x;int y;void detect() /Goertzel算法程序float w8,a83,amp8;w0=2*cos(2*pi*11/125); w1=2*cos(2*pi*12/125); w2=2*cos(2*pi*13/125); w3=2*cos(2*pi*15/125); w4=2*cos(2*pi*19/125); w5=2*cos(2*pi*21/125); w6=2*cos(2*pi*23/125); w7=2*cos(2*pi*26/125); for(i=0;i8;i+)ai0=0;ai1=0;for(j=1;j=125;j+)ai2=wi*ai1-ai0+bufferj-1;ai0=ai1;ai1=ai2;ampi=ai1*ai1+ai0*ai0-wi*ai1*ai0;/计算频谱的幅度平方值/printf(The amp %d is %f.rn,i,ampi);j=0;for(i=0;i0.1)j+;if(j=1)x=i;else if(j=2)y=i;i=-1;if(j=2)if(x=0&y=4)i=1;else if(x=0&y=5)i=2;else if(x=0&y=6)i=3;else if(x=1&y=4)i=4;else if(x=1&y=5)i=5;else if(x=1&y=6)i=6;else if(x=2&y=4)i=7;else if(x=2&y=5)i=8;else if(x=2&y=6)i=9;else if(x=3&y=5)i=0;else if(x=0&y=7)printf(The DTMF signal is An);else if(x=1&y=7)printf(The DTMF signal is Bn);else if(x=2&y=7)printf(The DTMF signal is Cn);else if(x=3&y=7)printf(The DTMF signal is Dn);else if(x=3&y=4)printf(The DTMF signal is *n);else if(x=3&y=6)printf(The DTMF signal is #n);if(i!=-1)printf(The DTMF signal is %drn,i); /输出判断结果void main()/ Initialize CSL library - This is REQUIRED !CSL_init();/ The main frequency of system is 240MHz/ 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); /EMIF初始化Emif_Config(); / Open McBSP port 1 and get a McBSP type handlehMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);/ ConfigMcBSPport 1 by use previously defined structureMcbsp_Config(hMcbsp);/I2C初始化I2C_cofig(); /CODEC寄存器初始化inti_AIC(); while(1)while(!MCBSP_rrdy(hMcbsp) ;dacdata=MCBSP_read16(hMcbsp);testk=dacdata;while(!MCBSP_rrdy(hMcbsp) ;dacdata=MCBSP_read16(hMcbsp);bufferk=dacdata/16384.0; /控制增益,防止结果溢出k+;if(k=125)k=0;detect();4.3运行结果及分析1.发送端时域波形:频域波形:(右击选择refresh可以刷新不同时刻的波形)。2. 接收端程序运行界面如下:时域波形:频域波形:结果分析:通过接收端我们可以很清楚的看出接收到的“0#”,通过频域波形的两个波峰可以读出接收到的数据。4.4发挥部分 (1) 使用一个 DSP 工程同时实现 DTMF 信号的发送和检测功能。 (2) 改进 DTMF 信号的规定指标,使每秒内可传送的 DTMF 编码加倍。为了使每秒可传送的DTMF编码加倍,我们在发送端将将采样点数修改,就可以提高发送的速率,由此来实现编码加倍。自发自收程序如下:#include #include #include #include #include #include #include #include #include math.h /*add to a new .h file*/#include 5502_FLASH.h#include E2PROM_Function.h#include CODEC.h#undef CODEC_ADDR#define CODEC_ADDR 0x1A#pragma DATA_SECTION (buffer,.Audio_in_data1);#pragma DATA_SECTION (out_buffer,.Audio_in_data2);void generate(intnum);voidReceiveDate();void detect();void delay(int period);/ 定义McBSP的句柄MCBSP_HandlehMcbsp;floatinbuffer256;Int16 receive256;Int16 dacdata;int key=0;int M=0; /*-*/ FUNCTION: MAIN/*-*/Int16 out_buffer800=0;float buffer400;Uint16 num=0;int count=0;int flag;floatfreq162= 941,1336, /0 697,1209, /1 697,1336, /2 697,1477, /3 770,1209, /4 770,1336, /5 770,1477, /6 852,1209, /7 852,1336, /8 852,1477, /9 697,1633, /A 770,1633, /B 852,1633, /C 941,1633, /D 941,1209, /* 941,1477 /# ;float pi=3.1415926; void delay(int period)inti, j;for(i=0; iperiod; i+) for(j=0; j1; j+); void main(void)/*初始化*/ Initialize CSL library - This is REQUIRED !CSL_init();/ The main frequency of system is 240MHz/ 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0); /EMIF初始化Emif_Config(); / Open McBSP port 1 and get a McBSP type handlehMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);/ ConfigMcBSPport 1 by use previously defined structureMcbsp_Config(hMcbsp);/I2C初始化I2C_cofig(); /CODEC寄存器初始化inti_AIC(); /*初始化*/generate(num);void generate(intnum)floatx,y;int k=0;inti;i=0;while(1)/ Wait for sample from handset while(!MCBSP_xrdy(hMcbsp) ;MCBSP_write16(hMcbsp,out_bufferi);delay(500);ReceiveDate();i+;if(i=800) i=0;num+;if(num=16) num=0;x=freqnum0/8000;y=freqnum1/8000;k=0;flag=1;while(flag=1)bufferk=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k)*16384;out_bufferk=bufferk;out_bufferk+399=0;k+;if(k=400)flag=0;voidReceiveDate()while(!MCBSP_rrdy(hMcbsp);dacdata=MCBSP_read16(hMcbsp);receiveM=dacdata;inbufferM=dacdata/16384.0;M+;if(M=256) M=0;detect();void detect() inti,j,x,y;float w8,a83,amp8;w0=2*cos(2*pi*18/205);w1=2*cos(2*pi*20/205);w2=2*cos(2*pi*22/205);w3=2*cos(2*pi*24/205);w4=2*cos(2*pi*31/205);w5=2*cos(2*pi*34/205);w6=2*cos(2*pi*38/205);w7=2*cos(2*pi*42/205); for(i=0;i8;i+)ai0=0;ai1=0;for(j=1;j=205;j+)ai2=wi*ai1-ai0+inbufferj-1;ai0=ai1;ai1=ai2;/计算频谱的幅度平方值ampi=ai1*ai1+ai0*ai0-wi*ai1*ai0;/printf(The amplitude %d is %f.rn,i,ampi);j=0;for(i=0;i40) /门限设为40 j+;if(j=1)x=i; else if(j=2)y=i;i=-1;if(j=2)if(x=0 & y=4) i=1; else if(x=0 & y=5) i=2; else if(x=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 渔业政策效果评价-洞察及研究
- 油墨厂耐戊苯试验细则
- 手抄报课件设置
- 四川省成都市浦江县2025-2026学年高一上学期第一次月考历史试题(含答案)
- 河南省郑州市新郑市2024-2025学年四年级下学期期末英语试题(含答案无听力原文无听力音频)
- 广西河池市2024-2025学年九年级上学期第一次月考化学试题(无答案)
- 手影变变变课件
- 印刷厂售后服务处理办法
- 学生自身安全培训计划课件
- 学生消防安全培训意义课件
- 中药处方点评管理办法
- 国企纪法教育实施路径
- 药品发放登记管理制度
- 临床科室科研管理制度
- 铁艺围栏采购合同
- 中国皮肤基底细胞癌诊疗指南2023
- 卫星通信技术在电力行业中的应用场景分析
- 黄旭华人物介绍
- 《医疗机构工作人员廉洁从业九项准则》解读
- 教育行业重难点分析及解决措施
- 合伙开工厂 合同范例
评论
0/150
提交评论