打印

[相关资料]关于FFT结果的意义,可以看一下圈圈以前写的**

[复制链接]
楼主: computer00
手机看帖
扫描二维码
随时随地手机跟帖
41
liguligu886| | 2009-3-20 15:25 | 只看该作者 回帖奖励 |倒序浏览

d

实际上,对音频频谱的显示,通常纵坐标是取对数,横坐标是按照
倍频关系来的,这里为了程序简单,都是用的线性关系。

使用特权

评论回复
42
laoniu85| | 2009-3-21 12:55 | 只看该作者

偶也 我解放了 可以开始研究东西咯

先弄到圈圈的这个代码再说 嘎嘎 

使用特权

评论回复
43
armecos| | 2009-4-9 12:12 | 只看该作者

GPS导航的资料和思路这里有,ucgui里也有个例子,

**************************************************
* 用EASYARM2200或SMARTARM2200玩电子地图和GPS导航 *
**************************************************
    2009/03/04  asdjf@163.com  www.armecos.com
    
    图1 世界地图。
    
    
    图2 世界地图局部放大,点右键显示鼠标所在位置的经纬度。
    
    
    图3 世界地图局部再放大,点右键显示鼠标所在位置的经纬度。比例尺比较大,地理图形显示粗糙,换小比例尺地图数据库就可以显示细节,不过数据库比较大。
    
    
    图4 某公司使用ecos设计的GPS电子地图导航产品。
    
    
    图5 小比例尺地图,从其他地图库导入。
    
    
    图6 最短路径选择。
    
    
    图7 矢量图形(填充/空心):直线、折线、多边形、圆、圆弧、文字。
    
    
    图8 位图放大,有锯齿现象。
    
    
    图9 矢量图放大,没有锯齿现象,放大多少都没问题,因为都是通过计算得到的。
    
    
    图10 地图显示。
    
    
    图11 矢量地图放大,可以看出就是由填充/空心的直线、折线、多边形、圆、圆弧、文字等基本元素构成。GUI只需要画出这些矢量图形即可
    
    
    图12 自行采集GPS数据,制作电子地图。全部线段绘制完成后,可转换为标准的电子地图。
    
    
以下是关于ecos电子地图原理、制作、操作、算法。完全底层直接操作,比WINCE效率高。

    矢量图形
    计算机绘图分为位图图像和矢量图形两大类:
    1、位图图像
        位图图像也叫作栅格图像,由像素组成,每个像素都被分配一个特定位置和颜色值。位图图像与分辨率有关,即在一定面积的图像上包含有固定数量的像素。因此,如果在屏幕上以较大的倍数放大显示图像,或以过低的分辨率打印,位图图像会出现锯齿边缘。图8中可以清楚地看到将图7(以位图格式存储)放大2倍后的效果。
        
    2. 矢量图形
        矢量图形由矢量定义的直线和曲线组成,矢量图形根据轮廓的几何特性进行描述,数据量小。图形的轮廓画出后,被放在特定位置并填充颜色。移动、缩放或更改颜色不会降低图形的品质。矢量图形与分辨率无关,可以将它缩放到任意大小和以任意分辨率在输出设备上打印出来,都不会影响清晰度。因此,矢量图形是文字(尤其是小字)和线条图形(比如徽标)的最佳选择。图9显示了将图7(以矢量图形格式保存)放大4倍的效果。

    电子地图就是矢量图形,可以任意放大缩小而不失真。由图11可以看出构成电子地图的基本元素是:填充/空心的直线、折线、多边形、圆、圆弧、文字。通过这些元素表示道路、植被、区块、湖泊河流、地名等地理信息。

    GPS数据采集和电子地图制作
    获得电子地图的途径主要有三种:一买二抄三制作。
    1、购买现成的地图数据库,转换为自己需要的格式。
    2、扫描公开发行的纸质地图,在mapinfo软件中打开,作为背景图(底层),给出三个地点的准确经纬度坐标进行配准(三点定面),然后手工抄录,再转换为标准格式保存,就可以得到电子地图。
    3、使用GPS采集实际路段数据,转换成mapinfo可以识别的格式,增加路段号、路段名称、路段类型和长度等属性,其他属性信息的添加可在Mapinfo界面中完成,然后创建方格网的标准Mif图。
    
    地图操作
    显示、放大、缩小、漫游、鹰眼、距离测量、地图旋转等操作。还可附加语音导航、GPS定位、路径跟踪、关键字搜索和区域搜索及其定位等功能。

    导航算法
    略

使用特权

评论回复
44
computer00|  楼主 | 2009-4-9 12:23 | 只看该作者

俺没钱买大一点的屏,只能玩1602或者12864之类的,

只好用文本显示了。而且大的屏拿着不方便。就使用这个NOKIA的屏显示也不错~~~~~

使用特权

评论回复
45
armecos| | 2009-4-11 02:03 | 只看该作者

呵呵,可以用软件虚拟屏幕,不花钱。当然,虚拟的屏太大

使用特权

评论回复
46
computer00|  楼主 | 2009-4-11 23:23 | 只看该作者

不懂你的意思,连个大屏幕都没有,如何软件虚拟啊?晕死

软件虚拟的屏幕能看得到吗?照你这样说,我只买台电脑主机就行了,然后用软件虚拟一个10000*10000的屏幕,那我岂不是爽死了?还省了一堆钱????

使用特权

评论回复
47
armecos| | 2009-4-12 00:53 | 只看该作者

就是利用你的电脑主机的屏幕显示,

通过网络把显存中的数据发送到主机服务器,由服务器负责解析并把图像数据显示出来。只传输和显示变动的部分,这样效率高。

屏幕、键盘、鼠标、触摸屏一下子都可以解决了,不会增加任何费用,特别适合开发阶段。分辨率取决与你的网络带宽和色深。

其实,你现在已经有条件玩GUI了,2210上都能玩了,你却还在等LCD硬件,有这时间,早就把minigui、mirceowindows、ucgui、QT......玩个遍了。当然前提是要有TCP/IP协议栈和OS。

使用特权

评论回复
48
computer00|  楼主 | 2009-4-12 02:09 | 只看该作者

我无语……既然用了电脑的显示屏了,那我干脆直接写个上

通过USB传输数据,在应用软件上显示地图就行了,何必还多此一举去搞什么虚拟屏幕?

难道我每次出去都要背个电脑我的GPS才能使用???

如果有电脑可以用了,我何必还要去想使用文本LCD显示………………

使用特权

评论回复
49
古道热肠| | 2009-4-12 13:57 | 只看该作者

哈哈,比较实用的就是在PC机上做个图形控制面板,与底层联机

就象将PC当超级终端用一样,如果能整个图形超级终端,通过USB来通讯,根本不需要什么OS还有网络,搞那么复杂,AT91SAM7S64就那点Flash,根本玩不起来.
ZLG就曾经开发过一个.不过是串口通讯的.

使用特权

评论回复
50
computer00|  楼主 | 2009-4-12 23:19 | 只看该作者

俺现在的问题是没屏幕……而且还要便携,不能用电脑。

使用特权

评论回复
51
xwj| | 2009-4-13 11:45 | 只看该作者

与圈圈同感

其实,也不用太“便携”,一般DIY只要做成个完整点的东东(设备)即可
要想拿得出手的话那去找软盘盒、光盘盒、磁带盒等装一下,有时做个纸盒也好过没有:-)
还要跟好看点那就去找更好的盒子或者自己DIY

其实,俺大多的东西都是裸板,试过、玩过就扔箱子里不管了,从没想过什么“便携”或啥的...

使用特权

评论回复
52
computer00|  楼主 | 2009-4-13 12:48 | 只看该作者

你就知道同感,也不帮忙做一个。

使用特权

评论回复
53
xwj| | 2009-4-13 13:03 | 只看该作者

嗯,下午开工,把上次准备发的界面程序再整理下

使用特权

评论回复
54
armecos| | 2009-4-13 17:35 | 只看该作者

虚拟屏和上位机仿真还是有区别的,

程序在目标机上跑,可以验证硬件效果。而上位机是纯软件仿真,无法了解目标硬件性能。

你用虚拟屏调试开发非常方便省钱,可以灵活设置屏的色深、分辨率,当你真正想便携时,只要把驱动改成相应屏的即可。如果直接用真实屏,那你就要针对各种情况各自准备出一块。万一不合适只能换屏而虚拟屏只要改参数,明白?

使用特权

评论回复
55
computer00|  楼主 | 2009-4-13 18:39 | 只看该作者

不明白。如果我都打算用真实的屏了,何必又要去虚拟?

万一虚拟的行了,换成现实的又不行那不是死翘翘?要干就真刀实枪的干,要不就不搞。

总之我是打算搞个想12864那样就能用GPS的系统,谁也不能动摇俺的决心。只有简单的、廉价的,才是DIY能够搞得起的。

使用特权

评论回复
56
mxinfa| | 2009-4-15 19:04 | 只看该作者

那个FFT代码

圈圈的那个FFT代码是不是只要修改FFT.h中的LENGTH和bL就可以用在更多点数的fft运算中?当然还要添加相应点数的正弦和余弦表。先不管运算时间的事情。
谢谢了

使用特权

评论回复
57
computer00|  楼主 | 2009-4-15 19:32 | 只看该作者

是的。已经有很多表可以用了。

当然你也可以改成不用表格的,改成临时计算,这个删掉那个用表的宏即可。

使用特权

评论回复
58
nz122911| | 2009-7-12 15:56 | 只看该作者

用00的FFT试了下,好像结果不正确啊

试验为 256点FFT
用的数组为STM32版面里么“小试256点fft,望圈圈、lut1lut、香版主指教”
https://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=3286380&tp=%u8FD9%u4E2A%u4FFA%u5C31%u4E0D%u6E05%u695A%u4E86%u54E6%u2026%u2026%u6CA1%u7528%u8FC7%u8FD9%u4E2A%u5E93%u7684FFT%u2026%u2026%u6211%u7528%u7684%u662F%u81EA%u5DF1%u7684FFT

用STM32的汇编代码,得到结果确实符合00**里说的
0点、50点、75点
2   : 3  :1.5

但用00的代码,结果第50点和第75点都是Not a Number
还麻烦00帮忙看下哪里有问题呢,主要部分代码:
IN_TYPE InBuffer0[LENGTH] = {
        4708, 2910 ,  1756 , 36   , -294 , 4118 ,6191 ,918  , -2275,  1807 , 4805 , 3353 , 1998 ,527  ,
        -656 , 2851 ,  6434 , 2487 , -2270, 534  ,4594 ,3844 , 2228 ,  998  , -689 , 1616 , 6150 ,3999 ,
       -1732 , -675 ,  4038 , 4313 , 2498 , 1397 ,-454 ,563  , 5403 ,  5255 , -712 , -1645, 3154 ,4668 ,
        2844 , 1711 ,  -43  , -200 , 4320 , 6098 , 665 ,-2225, 2014 ,  4808 , 3275 , 1960 , 445  ,-620 ,
        3065 , 6431 ,  2224 , -2308, 747  , 4653 ,3761 ,2188 , 924  ,  -704 , 1813 , 6232 , 3760 ,-1857,
        -485 , 4155 ,  4240 , 2448 , 1337 , -508 , 720 ,5555 , 5071 ,  -911 , -1507, 3321 , 4621 , 2780,
        1664 , -119 ,  -96  , 4517 , 5992 , 418  ,-2160,2217 , 4804 ,  3198 ,1921  , 362  , -574 ,3278 ,
        6413 ,1960  ,  -2331, 960  , 4702 , 3679 ,2149 ,847  , -712 ,  2014 ,6301  , 3514 , -1968,-290 ,
        4262 ,4165  ,  2401 , 1274 , -557 , 886  ,5696 ,4876 ,-1099 ,  -1359, 3482 , 4568 , 2719 , 1615,
        -193 ,18    ,  4708 , 5871 , 176  ,-2083 ,2415 ,4791 , 3123 ,  1881 , 279  , -519 , 3491 , 6380,
        1697 , -2339,  1174 , 4741 , 3596 , 2111 ,769  ,-711 , 2219 ,  6356 , 3263 , -2066, -90  , 4360,
        4087 , 2355 ,  1208 , -600 , 1058 , 5827 ,4670 ,-1276, -1200,  3634 , 4511 , 2660 , 1564 , -264,
         141 ,4894  ,  5736 , -58  , -1992, 2609 ,4770 ,3050 ,1841  ,  197  , -454 , 3703 , 6332 , 1434,
       -2332 ,1387  , 4771  , 3514 , 2073 , 690  , -702,2428 ,6396  ,  3008 , -2148,  115 , 4448 , 4007,
        2311 ,1140  , -636  , 1238 , 5947 , 4455 ,-1441,-1033,3778  ,  4449 , 2604 , 1511 , -332 ,  273,
        5072 ,5589  , -285  , -1888, 2797 , 4743 , 2979,1799 ,116   ,  -379 , 3912 , 6269 , 1174 , -2311,  
        1598 ,4793  , 3433  , 2035 , 609  , -683 , 2639,6423 ,2749  , -2216 , 323  , 4526 , 3926 ,  2269,
        1070 ,-666  , 1424  , 6055 , 4231 , -1593, -858,3912 ,4383  ,   2550,  1455, -395 , 413  , 5242 ,
        5428 ,-503  , -1773 , 2978};
float y[LENGTH/2] = {0};

int main(void)
{
    u16 i = 0;

        
          InitBitRev();  //初始化FFT用的位反转用的表格
      while (1)
      {
        FftInput(InBuffer0);       //位倒序
          FftExe(InBuffer0,Re,Im);   //做FFT运算

        y[0]=sqrt(Re[0]*Re[0]+Im[0]*Im[0])/LENGTH;   //计算模值 
        for(i=1;i<LENGTH/2;i++)
        {
            y=2*sqrt(Re*Re+Im*Im)/LENGTH;   //计算模值 
        }
      }
}

使用特权

评论回复
59
computer00|  楼主 | 2009-7-12 20:03 | 只看该作者

是不是因为溢出了?

使用特权

评论回复
60
nz122911| | 2009-7-13 08:50 | 只看该作者

确实应该是数据溢出了

寝室没网上,今天跑回实验室查看了一下。

Re[]和Im[]这两个数组都是long int 类型的范围应该是
-2147483647——2147483647
运行后查看Re[]的值,并没有溢出,但在取模时应该是溢出了

后来试验将试验数组里的数都缩小10倍,然后运算,得出
第50点, 70点确实3 : 1.5的关系了,但第0点又变成Not a Number了。
查看Re[0],其值为52371,取模时先平方就为2742721641,超过了long int 的范围
所以应该是这个问题吧
然后试验将 long int  改为 long long 类型,得到正确结果,符合比例。

多谢00提醒

顺便请问下00:这个FFT程序的话
一般AD精度如果是12位的话,采到的数据传入做FFT,也会溢出啊
请教00怎么处理这个问题呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则