网学网为广大网友收集整理了,FFT的 c语言定点程序设计,希望对大家有所帮助!
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
3.2转换中的关键步骤 在定点数中通过设定小数点在16位数中的不同的位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法。同样一个16位数,若小数点设定的位置不同,它所表示的数也就也就不同。例如:十六进制数2000H=8192,用Q0表示,十六进制数2000H=0.25 ,用Q15表示。不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是-32768到32767,其精度是1,而Q15的数值范围从-1到0.9999695,精度为1/32768=0.00003051。因此对于定点数来说,数值范围和精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;要想提高精度,则表示数的范围就相应的要减小。在实际的运算中一定要考虑到这点以达到最佳的性能。 浮点数与定点数的转换关系可表示为 浮点数(x)转换为定点数(): 定点数()转换为浮点数(x): 为了最大限度地保持数的精度,在将浮点转换成定点数时,可以采取上取整的方法,在取整运算前,先加上0.5,即浮点数(x)为定点数(): 在转换当中,控制了输入的情况下,加法不会产生溢出,关键在于乘法的移位处理。 设浮点乘法的运算的表达式: float x,y,z; z=xy; 假设经过统计后x 的定标值为Qx,y的定标值为Qy,乘积z的定标值为Qz,则 所以定点表示的乘法为: int x,y,z; long temp; temp=(long)x; z=(temp*y)>>(Qx+Qy-Qz); 3.3误差分析 将定点程序在turboc 环境下运行,得到的结果如下: 7369 0 -821 1978 -819 820 -821 340 -819 0 -819 -340 -819 -820 -819 -1978 再跟上面浮点一样,在matlab中调用fft函数,函数中的输入即为上述输入的浮点数的定点形式,具体matlab程序如下: %MATLAB PROGRAM N=8; n=0:N-1; xn=[204 409 614 819 1024 1228 1433 1638]''; Xk=fft(xn) 运行得到的结果如下: Xk = 1.0e+003 * 7.3690 -0.8200 + 1.9772i -0.8190 + 0.8200i -0.8200 + 0.3392i -0.8190 -0.8200 - 0.3392i -0.8190 - 0.8200i -0.8200 - 1.9772i 这是用科学记数方式表示的。对比两组结果,我们不难发现这种将浮点形式转换为定点形式的方法是可行的。具体误差分析如下: 我们在两组结果中任取4个相对应的数进行分析,如取了如下4组:7369和7369.0,-819和-819.0,-340和-339.2,-1978和-1977.2。对这4组进行误差分析,第1、2组的误差是0.0%,第3组为(340-339.2)/340=0.235%,第4组为(1978-1977.2)/1978=0.044%。由分析可知,这种变换的误差是非常小的。但误差的大小具体由表示定点数的位数决定。在这里我们是 用16位来表示的。当需要的误差还要小,你可以用更多的位数来表示,这样精度就越高,误差也越小。 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |