个人资料
  • 今日访问:2
  • 总访问量:70384
  • 开博时间:2007-05-05
  • 博客排名:第23446位
博文分类
最近访客
博客成员
友情博客
关注更新
你关注的用户没有更新博文!
博客门铃
博文

购书单-2010春天

  记录在2010年的春天所购买的书籍:
  
  李渔:闲情偶寄
  陈丹燕:上海色拉
  王维诗选
  石涛编选:我为书狂
  席星荃:记忆与游走
  皮皮:不想长大
  于坚:诗歌--便条集
  第三代诗歌新编
  茨威格:海滨之屋
  约翰-贝利:当贝利遇到艾利斯
  菲兹杰拉德:了不起的盖茨比
  哈代:苔丝,中文版和英文版各一本
  周振甫译注:李商隐选集
  弗里达-劳伦斯:不是我,是风——劳伦斯妻子回忆劳伦斯
  徐则臣:跑步穿过中关村
  私人行走
  私人味觉
  沈从文--沈从文别集两册:凤凰集,湘行集
  
  附记:
  陈丹燕《上海色拉》的几句话:
  
  四月的时候,要是一个人从来没有背过一首诗,就长大了,一定会遗憾的。
   ——《四月与诗歌》
  
  很早的从前,大人就告诫我,离幻想要远一点,说幻想就像一块冰,看着晶莹,碰上去会让你一直冷到心里。
   ——《风花》
  
  皮皮《不想长大》,这本绘本真是太可爱了。
  菲兹杰拉德《了不起的盖茨比》,我记得家里已经有一本,但是这个故事太好了,忍不住又买一本。
  已经渐渐没有买书的激情了,看《我为书狂》的几篇
分类:书籍 | 评论:0 | 浏览:249 | 收藏 | 查看全文>>

实验室断网事件

  中午来到实验室,打开电脑却一直连不上网,用有线不行再试无线的PEREC也不行;回顾前后左右询问,原来大家都连不上;据说有人盗IP,结果整个教研室的三条进线被信网中心封了网,正等着有关人员去做善后……
  上不了网,那就上不了豆瓣,开不了QQ,登不了邮箱,看不了新闻;优酷 pt BBS 都无法看了,都没有乐趣了,于是我在一个月来首次将电脑重新搬回了宿舍…
  晚上回教研室一看,之前人群满满的教研室大厅只剩下屈指可数的几个人坚守阵地,大家表示:没有了娱乐,哪有心情去科研;人民需要娱乐,没有网的日子不好过。此时的教研室冷冷清清,形单影只,简直就是人烟稀少;有诗一首为证(诗作者YANG),诗曰:
  断网一片尽萧条,
  科研原来是传说。
  
  
分类:经历 | 评论:0 | 浏览:294 | 收藏 | 查看全文>>

有问题就解决问题之 TI库实现2048点或更大点数FFT

TI提供的FFT库(sprc081)使用起来很方便,只要直接调用即可;更重要的是其中做了好些优化,而且是用汇编写成,运算速度肯定要比自己写的C代码更快好多。这个库最大能运算1024点的实数FFT,但实际中我们可能还需要更大点数的FFT,那如何去修改呢?其实修改的地方并不多,以前我曾花了一段时间浏览了一下那些头疼的汇编代码,发现模块化写得很好啊(佩服TI的工程师!),这样修改起来就快多了。
1. 2048点FFT
直接在工程中加入原来的库文件fft.lib,并在代码中作如下修改:
第一步:在有关FFT代码的头文件fft.h中增添如下一段代码:

#define RFFT32_2048P_DEFAULTS { (long *)NULL,\
 (long *)NULL,\
 1024,\
 10,\
 (long *)NULL,\
 (long *)NULL,\
 0,\
 0,\
 1,\
 (void (*)(void *))CFFT32_init,\
 (void (*)(void *))CFFT32_calc,\
 (void (*)(void *))RFFT32_split,\
 (void (*)(void *))RFFT32_mag,\
 (void (*)(void *))RFFT32_win}

结构体RFFT32关键说明:
1. 第一个(long *)NULL,\,是计算缓冲区(ipcb)的指针;
2. 第二个(long *)NULL,\,是查表旋转因子(ft)的指针;
3. 1024指的是FFT的大小,注意这里是2048点实数FFT被打包成1024点的复数,这是这个库的实数FFT运算的特点,这样节省一半运算时间和存储空间;
4. 10即1024是2的10次方,因为这里采用的是基2时间抽取算法;
5. 下面的两个(long *)NULL,\分别是运算结果中存放幅值(mag)以及加窗表格(win)的指针;
6. 下面的两个0分别是计算结果中的峰值幅值与峰值频率,这里初始化0;
7. 下面的1指的是查表的步进值,因在这个sprc081文档的库已经有Q31格式(以及Q30格式)的1024点的正弦因子表,因此对于1024点复数FFT查表步进值设为1即可。
8. 下面其他的就是要调用的函数指针了,不再赘述。

明白上述结构体的定义后,改写其他点数就很容易了,比如这个库最少能做到128点的实数FFT,我们还可以相应改成64点或者更低点数的实数FFT,比如64点的结构体就是如下的一段:

#define RFFT32_64P_DEFAULTS { (long *)NULL,\
 (long *)NULL,\
 32,\
 5,\
 (long *)NULL,\
 (long *)NULL,\
 0,\
 0,\
 32,\
 (void (*)(void *))CFFT32_init,\
 (void (*)(void *))CFFT32_calc,\
 (void (*)(void *))RFFT32_split,\
 (void (*)(void *))RFFT32_mag,\
 (void (*)(void *))RFFT32_win}

第二步:修改源程序代码里的变量定义:
#include "fft.h"
#define N 2048 //定义N的点数,2048点
//分别在数据存储区为ipcb和mag分配足够的地址,具体见下面的连接器文件
#pragma DATA_SECTION(ipcb, "FFTipcb");
#pragma DATA_SECTION(mag, "FFTmag");
//定义变量
RFFT32 fft=RFFT32_2048P_DEFAULTS;
long ipcb[N+2];
long mag[N/2+1];

//其他部分函数调用都是一样的,这里不再列出

第三步:在连接器(.cmd)文件里分配存储地址:
这里给出我在2808上的分配方法:
MEMORY
{
PAGE 1 :
 L0L1RAM : origin = 0x00B000, length = 0x001000
 HL0SARAM : origin = 0x3F8000, length = 0x001010
 DRAMH0 : origin = 0x3F9010, length = 0x000ff0

}
SECTIONS
{
 FFTipcb ALIGN(4096): { }> HL0SARAM, PAGE = 1
 FFTtf :> DRAMH0 , PAGE = 1
 FFTmag :> L0L1RAM, PAGE = 1
}
好,到此为止就修改好了,可以使用这个FFT库实现2048点实数FFT了。

2. 4096点或更大点数的FFT
第一步:修改汇编代码并制成库文件
其实要实现4096点的FFT需要改动的地方也不多,主要因为原来的这个库只提供了1024点的正弦值,我们需要自己算出2048点的Q31(或Q30)格式的一周期正弦值,并将其代替原来汇编代码里的1024点的表格。汇编代码的其他地方不需要改动,不然可能产生不可预知的后果。
在汇编代码文件sel_q.asm里查看设置:
; Select Twiddle factor Q format
TF_QFMAT .set Q30
若是TF表设为Q30,则只需将计算出的正弦值移位成Q30格式即可。另外需注意的是,2048点的FFT需要2048点的TF表,但这个库将其优化成只需2048×3/4 = 1536点,即1.5K大小的表格(见sprc081文档第10页,注意到正弦的第二部分与余弦的第一部分是相重合的,这样便节省了1/4周期的点数)。计算好正弦值并加入到汇编代码里,然后将所有的汇编代码导进CCS里做成一个新的库,到时直接添加到工程里调用。
为了方便这里我已将其做成一个新的库命名为FFT_new.lib,大家直接用即可。

第二步:修改头文件fft.h 结构体定义
增添如下一段代码:
#define RFFT32_4096P_DEFAULTS { (long *)NULL,\
 (long *)NULL,\
 2048,\
 11,\
 (long *)NULL,\
 (long *)NULL,\
 0,\
 0,\
 1,\
 (void (*)(void *))CFFT32_init,\
 (void (*)(void *))CFFT32_calc,\
 (void (*)(void *))RFFT32_split,\
 (void (*)(void *))RFFT32_mag,\
 (void (*)(void *))RFFT32_win}

第三步:修改变量定义和变量存储地址
这里修改的方法与上述相同,不再赘述。必须注意的是对于32位的4096点的FFT,其缓冲区占用8K连续地址,因此分配地址需考虑周全。这里给出我在2808上的一种分配方法。
F2808的片内18K单周期访问RAM按地址连续而言分成两块,即M0、M1的0x0000-0000~0x0000-07FF以及L0、L1、H0的0x0000-8000~0x0000-BFFF(同时映射到地址0x003F-8000~0x003F-BFFF)。M0、M1地址用作未初始化段及堆栈段等,因此只能选用L0等大段RAM空间;另外FFT查表所需的旋转因子常数也需保存在不受冲突的RAM
分类:技术 | 评论:28 | 浏览:4981 | 收藏 | 查看全文>>

有问题就解决问题之 串口传送浮点数

  前段时间应师兄要求,要通过单片机串口实现Modbus协议,在看了协议的内容后写好了程序的框架,然后根据不同的协议功能码分别实现不同的功能,比如对下位机分别读取或者写入线圈状态(位状态)、二进制数据以及浮点数等。其他的数据格式挺好实现,但怎样互相传递浮点数据却让我考虑了一番。
  串口通讯中传递的数据格式不外两种:ASCII码(即可见字符形式)和二进制数据格式(对应Modbus协议中有ASCII模式和RTU模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是ASCII码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码:
  //################################################################
  // 函数名:void Float2Char(float Value,char *array)
  // 描 述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示
  // 参 数:float Value为欲转换的正数浮点数值,转换结果保存在字符数组*array里
  //################################################################
  
  void Float2Char(float Value,char *array)
  {
   Uint16 IntegerPart;
   float DecimalPart;
   Uint16 i = 0;
   Uint16 j = 0;
   char temp;
  
   //分离整数部分与小数部分:
   //整数部分保存在IntegerPart中
   //小数部分保存在DecimalPart中
   if (Value>=1)
   {
   IntegerPart = (Uint16)Value;
   DecimalPart = Value-IntegerPart;
   }
   else
   {
   IntegerPart = 0;
   DecimalPart = Value-IntegerPart;
   }
  
  
   //转换整数部分
   if (IntegerPart == 0)
   {
   array[0] = 0+48;
   array[1] = '.';
   i = 1;
   }
   else
   {
   while(IntegerPart>0)
   {
   array[i] = IntegerPart%10+48;
   IntegerPart = IntegerPart/10;
   i++;
   }
   i--;
  
   //修正转换结果的顺序
   for (j=0;j    {
   temp = array[j];
   array[j] = array[i-j];
   array[i-j] = temp;
   }
   i++;
   array[i] = '.';
   }
  
  
   //转换小数部分,此处设置最多转换到第四位小数
   i++;
   array[i++] = (Uint16)(DecimalPart*10)%10+48;
   array[i++] = (Uint16)(DecimalPart*100)%10+48;
   array[i++] = (Uint16)(DecimalPart*1000)%10+48;
   if (5 == i)
   array[i++] = (Uint16)(DecimalPart*1000)%10+48;
  
   array[i] = '\0'; //结束符
  
  }
  // End of line
  这段代码没有考虑负数的转换,要转换带符号数只需加入符号判断后将正(负)号标志放在数组的第一位即可。这段函数用起来挺好用,但是这种方法有很多不完善的地方,比如要预先设置字符数组*array的大小以足够存储转换后的各位,小数点位置不确定,给接收方还原数据带来了麻烦。
  
  硬件存储浮点数,统一的标准是IEEE754标准,因此更好的方法是通过这个统一的标准来实现串口传送浮点数据的转换和还原。嵌入式硬件使用的float型数据即单精度32位浮点数格式,这在一般应用中已经足够。IEEE754规定了32位数据的格式,分别规定1位符号位、23位尾数位和8位指数位(不知有没有记错?)。比如浮点数34.9,IEEE754标准十六进制显示是0x42 0x0B 0x99 0x9A,二进制显示则是 0 10000100 00010111001100110011010。我最初的想法是根据这个标准规定的各部分位数,写出转换和还原的代码来;但这样确实太麻烦了。因此何妨直接借助编译器来实现这个转换??这样多方便啊
  以下的代码我没有直接写,直接借用了这篇博客文章(http://blog.sina.com.cn/s/blog_4b94ff130100ejyb.html)里的程序:
  /*******************************************
  函数名称:Float2Byte
  功 能:浮点数转换成字节型数组
  参 数:入口参数floatNum,欲转换的浮点数
  返 回 值:byteArry,转换后的字节数组
  ********************************************/
  void Float2Byte(float floatNum,unsigned char* byteArry)
  {
   char* pchar=(char*)&floatNum;
   for(int i=0;i    {
   *byteArry=*pchar;
   pchar++;
   byteArry++;
   }
  }
  
  /*******************************************
  函数名称:Byte2Float
  功 能:字节型(16进制格式)转换成浮点数
  参 数:入口参数*byteArry,转换成的字节数组,每四个字节转换成一个单精度浮点数
  返 回 值:转换后的浮点数
  ********************************************/
  float Byte2Float(unsigned char* byteArry)
  {
   return *((float*)byteArry);
  }
  // End of line
  将以上的代码应用到MSP430单片机的串口通讯中,成功实现了430单片机与PC机通过串口进行浮点数据的传送。PC机的串口发送和接收代码,可直接根据上述程序修改。
  
  后来我想将Modbus协议移植到TMS320F28x的DSP上,但上述浮点数转换还原代码却不能正确运行。经调试后很快发现问题,MSP430单片机的开发环境IAR C430里规定的Char(Unsigned char )类型是1个字节(8位),而28x的开发环境CCS里规定的Char(Unsigned char )类型是双字节(16位)。知道这点后,改动起来也很容易:
  
  //定义一个unsigned char型的临时数组,用来保存接收到的十六进制字节
  unsigned char temp_char[2];
  float FloatNum;
  //将接收到的信号参数解码,按IEEE754浮点数标准还原
  //假设DSP的SCI接收到的4个字节依次保存在RxBuffer[1]~ RxBuffer[4]里
  temp_char[0] = RxBuffer[2]<<8 | RxBuffer[1];
  temp_char[1] = RxBuffer[4]<<8 | RxBuffer[3];
  //还原成原来的浮点数
  FloatNum = *((float*)temp_char);
  
  好了,问题解决了。
  
分类:技术 | 评论:0 | 浏览:6683 | 收藏 | 查看全文>>

没有娱乐的生活

  很长时间不去打球,不去跑步,
  很长时间不看电影,不看小说,
  不常练琴,也不去音乐节 
 
  取消了外出游玩,不再有玩乐的心思  
  然而眼看着春天就已经过去了
  
  你就是一个刻板乏味的人,这一点毫无疑问
  
  
  
  
  
分类:随意 | 评论:0 | 浏览:245 | 收藏 | 查看全文>>

十年后会是怎样

  十年后会是怎样?那不如往回退,让我先想想十年前的样子。十年前,2000年,当时自己还是初中生,每天上学放学,心情应当是无忧无虑的,对未来并无更多的设想;即使偶尔会想到所谓的理想,也是认为以后一切,都应当会顺理成章地实现的吧。
  这次的寒假,2010年2月,回家时还见到带了我初中三年的班主任。十年过去,他还记得我。聊天时,他说出一句话:我是他这么多年来所教过的最优秀的学生。我听着内心一阵羞愧。现在我已是20几了,然而他的这个学生一无所成。一无所成,连之前的理想一词也淡忘地不着边际。
  
  有次聊天时同学说起,我们这些所谓的80后要开始生产10后了。看起来真让人觉得不可思议,还有种恐慌的感觉,结婚生子这些事情忽然地摆到了我们的面前——然而我们总觉得自己还没长到那个年龄呢。即使还没准备好,这些事情总是会来临的。它们就横亘在这个十年内。
  
  
  前几天看到一篇博客文章,作者 樊铧在2007年12月31日写下这篇文章,我暂且大段地摘录一下:
  ……
  我们聊到了十年前彼此的样子,今天的我们,还有,十年后我们可能的样子。十年前我第一次见到师兄,总觉得他跟我不是一个时代的人,也从来没有想过十年后自己在做什么。十年过来,师兄好像没有什么变化,除了家庭和事业都很完满。而我,不经意间发现自己已经成了跟他们一个时代的人。再想想,十年前,师兄遇到老师的时候,老师也不过跟现在的师兄年纪相仿佛,一晃眼,师长们真的老了,而我们已经变成昨天的他们。这有点历史感——25岁之前我从来没有在生活中体会到过历史感。也许人到了这个年龄,都喜欢思考过去和展望未来,因为未来从来没有像现在这样可以被我们掌控,又容易被错过。孔子说三十而立,大约人在三十岁的时候终于能准备充分地站在起点上,之前的人生经历都是被动的接受,这时的起点才是真正决定未来的出发点,若再不发力,人就会无可挽救地滑向平庸。这不奇怪。两天前,我和大学同屋的两位同学吃饭,聊的话题和聊天的方式都与昨晚一样。没有人会在三十岁的时候自甘平庸,不管他们的事业是否已经有了基础。
  我的未来规划其实相当明确,对于未来,我从未像现在一样有把握。但未来毕竟是没有发生的,把握不代表现实。正如那位老师说的,不是又一年过去了,是新的一年到来了。未来还需要时间来实现。这一年我过得不太好,究其原因是自己被生活控制,缺乏自省的能力,但它终究还是过去了,新的一年才是在我手中的。
  ……
  文章题为《 2008年就要来了》,现在已是2010年的清明。我看过作者的照片,戴着眼镜,十分儒雅,脸上有淡淡的笑容。 樊铧会不会想到在08年的清明他会让自己做出这样的选择。
  
  
  现在我已24了,真不知怎么就长到这个年龄。许多该考虑的,尚未考虑——或者是不知如何考虑。从小到大,父母或身边的人只说我成绩好,那就继续学下去吧。然而现在这想法却有些动摇,不知所措。不想十年后怎样,就是两年后毕业了还不知会去哪。我想过自己的最好的状态,内心细致、不浮躁,行事严谨,认真地做好手中的事物,我真希望这种状态能保持。因“若再不发力,人就会无可挽救地滑向平庸”。
  
  十年后会是怎样,这个题目其实来源于声玩的一首曲目。这首曲目关乎情感,又不所限于情感。欧波像是朗诵诗歌一样地念出这首歌词:青春的人啊,想象一个人的十年会怎样?
  十年会怎样,只是足够让许多选择发生,许多人和事来来往往。
  但即便如此,我们又能预料到什么呢?我在回想十年前的那个少年,当时的自己肯定不会想到十年后的我会是怎样,就如同现在的我预料不出,再十年之后,自己又会是什么样子。
  
分类:经历 | 评论:0 | 浏览:631 | 收藏 | 查看全文>>

虚假的生产力

以前上PLC课用的是三菱PLC,现在实验室PLC做项目用的是西门子PLC;以前老师以及现在的师兄只说:国内的PLC行业根本不成气候,我们都只能用国外的产品。
去上现代电力电子课,卓老师说:电力电子技术的发展,基础是电力电子器件的进步;但高质量大容量的IGBT等器件以及高性能的电力电子芯片,很多都还是要靠进口。
去绝缘楼上高电压大电流课,第一节课老师就说:高等级的绝缘与高压的材料和产品,我们追不上国外,很多测试仪器与设备,必须花大量资金从国外买。
DSP课老师讲:DSP数字处理芯片,国内一颗也生产不出来,国内高校那么多实验室,用的几乎都是TI的DSP。
……


作为一个电气学科学生(或许以后还靠这门手艺混饭吃),看到这些情况,嗯,真是让人觉得沮丧:我们解放了那么多年的生产力,都解放到哪儿去了?
我只看到那么多财大气粗的公司企业,都削尖脑袋地去买地;我们发展生产力,原来都是用来发展房地产了。

分类:经历 | 评论:0 | 浏览:222 | 收藏 | 查看全文>>

三月的时光

  每天看着实验室外亮着三月里最好的阳光:桃红李白,杂花生树,草长莺飞,天气安静得如同午后路旁新绽开的绿叶子
  不想那么多心思,何妨静下心来安心科研
  

分类:经历 | 评论:0 | 浏览:250 | 收藏 | 查看全文>>

三本书信集

  最近让自己看三本书信集。其实更准确的说应是三本情书集。
  
  1
  王小波书信集,开始的几篇开头都是:
  你好哇,李银河。你走了以后我每天都感到很闷,……
  你好哇,李银河。今天我诌了一首歪诗。我把它献给你,……
  你好哇李银河。今天又写信给你,……
  你好哇李银河。今天是六月一日,……
  你好哇李银河。我们接着来谈幽冥吧。
  你好哇李银河,……
  ……
  说得如此心直口快,像是个口无遮拦的小孩子。以前一直不怎么看这本书,觉得过于直白,看得我作为读者都觉得不好意思。但现在看则不一样,我已抑郁一个月,我能想象王小波最初写这些信给李银河时的心情,他欢快地喊“你好哇李银河”,他是多么开心,完全像是被爱情冲昏了头脑的年轻人。
  
  他写:
  银河你好,做梦也想不到我把信写到五线谱上吧?
  我对好多人怀有最深的感情,尤其是对你
  不爱你?不会,爱你就像爱生命……
  
  若让我以前看,会觉得直白露骨,肉麻,这什么跟什么啊;但现在看,就改变了之前的观点了。因此觉得这书要在适合的时候看。
  第43页:假如你愿意,你就恋爱吧。
  这句话真好。假如你愿意,你就恋爱吧。
  
  
  2
  沈从文《从文家书——从文兆和书信选》,如果是静下心来看的话,会觉得书信就如同很好的散文一样。沈在信开头一直称“三三”,张兆和则回“二哥”,这样看起来,像是一个失传很久的美好的爱情故事。张最初时还在胡适面前这样说过“我是非常顽固地不爱他”;而到最后接受沈时,这样给他发电报:“乡下人,来喝杯甜酒吧”。
  这真的像是一个久违的美好的爱情故事,而且还有着一些情趣和传奇的意味在里面,这正好可以留给我们这些俗世凡尘的后人去品味和羡慕。沈是以不间断地情书使张兆和最后回转心意的,但我想彼时热恋中的沈是否只是在张的身上,追求自己一厢情愿想象出的影子?——特别是对于他这样一个非常理想主义的文人而言。胡适最初曾对沈说:“这个女子不能了解你,更不能了解你的爱,你错用情了。”但热恋中的人哪肯听这样的话……晚年的张兆和说“从文同我相处,这一生,究竟是幸福还是不幸?……我不理解他,不完全理解他……他不是完人,却是个稀有的善良的人。”似乎胡适的猜测还是预言性地验证,一生的相处还是“不完全理解”,只说他是个“稀有的善良的人”,相处一生得出这样的评价,对沈而言不知是该说幸运还是不幸?
  其实上面这段都是题外话,都与本书无关。我觉得我看本书时总让自己有种局外感,该死的工科生理性思维总侵占在阅读里面。这样不好。
  
  沈从文的文章细腻温婉且充满浪漫的情趣,真的是最适合用来写情书——不知有没有人将其作为情书模板来用?我只说非常好看,热恋中的人的心情微妙波动,都很鲜活地呈现在纸页上。比如说张曾写“我又欣喜你有爱写信的习惯,在这种家书抵万金的时代,我应是全北京城最富有的人了。”等等等等,若是要摘抄的话,简直摘抄不完。
  摘抄不完还是再摘抄这一句,这应当是沈的情书里流传最广的一句话;这句话多好啊,怪不得最初“顽固地不爱他”的张还是免不了动力心,因沈从文在情书里给她写:
  “我行过许多地方的桥,看过许多次数的云,喝过许多种类的酒,却只爱过一个正当最好年龄的人。”
  
  
  3
  鲁迅《两地书》,说实话我开始看时,多少还是抱着一种八卦的心态来看的。我十分好奇在中学语文课本里,让我们感受了他的威严这么久的鲁迅,会在里面写上什么。
  许广平在信头称呼:鲁迅先生,迅师,MY DEAR TEACHER,EL. DEAR,鲁迅师,等。在信尾则自称写上“小学生许广平”、“小鬼许广平”等。像是在老师鲁迅眼下耍些调皮的女学生。
  鲁迅则在每封信开头一本正经地写“广平兄”(而这“兄”字一开始让许很是受宠若惊…)
  我的八卦心态还是有些落空。在信件往来中师生谈论的,也是时局、学校情况、作文解字等,然后或者是一些琐碎的事情,比如天气,吃食,或者是其他更加琐碎的事情。
  更多的还是关于时局变动,总感觉鲁迅在心里郁结着许多气,他在教师群中受排挤、在报上被攻击,他对所见的黑暗面的不满,然后他正好通过信件抒发出来了。文还是如其人,像平时看的他的杂文一样。
  但也有其他,比如鲁迅的独特的幽默感:“如果遇见老虎,我就爬上树去……没有法子,只好请它吃了,但不妨也咬它一口”,在被老虎吃时,不甘心地再反咬老虎一口,再比如:“今夜的月色很好,在楼下徘徊了片时……”“天只管下雨,绣花衫不知如何?放晴的时候,赶紧晒一晒罢…”,嗯,这才是生活化的鲁迅先生呀,而不是教科书里的总是横着“一”字胡须且头发直竖的严肃的作家。记得还有一段,鲁迅似乎颇为气氛,信里写了句“他妈的”,这倒看出他的可爱之处了。但这处忘记在哪页了。
  这本书看下来,通篇并没有所谓缠绵悱恻的语句,甚至连稍微直白一点的话语也没有。但我仍是将其当成一本情书来看,许是鲁迅的学生,还小鲁迅很多,在那时应是与鲁迅最亲近的一人吧;而鲁迅在每封信开头都写上“广平兄”,将所想的观点、或者郁结之气,都写在信里。换句话说,他还是将许当成一个知己来看的。除了正常的议论,还有那些琐碎的生活细节,而从这些生活的琐碎与细节中,才能读出文字掩盖下互相之间的温暖情意。
  
  另外,《两地书》,两地书,这个书名起得真好。
  
  
  4
  写信,在这个年代里真成一种稀缺的事物了。“云中谁寄锦书”,这句话就透着古典主义的行为色彩。然而我已几年未曾写信、也几年未曾收到信了。
  我想我为什么要在近期看这些书信集,而且还是之前一直未曾细细阅读的情书类书信集?因最近一直心绪不宁经常地抑郁起来,是想让自己在书籍中、在这些热烈的文字里给自己找到一些安慰么?我想还是不要让自己伤到了为好。也许已经伤到了还让自己不承认罢。
  
  附:
  王小波《王小波全集-第九卷:书信》云南人民出版社2007年1月版
  沈从文,张兆和《从文家书——从文兆和书信选》上海远东出版社1996年2月版
  鲁迅,景宋《两地书》人民文学出版社2007年7版
  
  
分类:经历 | 评论:0 | 浏览:346 | 收藏 | 查看全文>>

有问题就解决问题之 FFT库计算频谱幅值

群里有不少同学在讨论如何从FFT库调用后的mag数组中计算所要的结果,其实我看问题的关键都集中在如何看待输入输出数据的Q格式问题。好些同学认为既然输出是Q30格式,那就将结果直接除2^30,即将mag数组除以1073741824再开方,比如好些同学就直接用与下面类似的代码:
for(i=0;i<512;i++)
 {
 mag[i]= sqrt(mag[i]/1073741824.0);
 }
但是大家都看到,求得的结果mag值几乎都为0。事实情况是不是这样的呢,或者是不是这样求的,我们可以来试验一下。

因AD采样进的数据受AD参考电压、采样频率精度等影响,为了不让这些误差影响到试验过程和结果,这里采用从MATLAB中仿真计算出一组更理想的且精度更高的采样数值,将其当作外部AD采样的数据,再导入到CCS中让DSP进行FFT计算。用MATLAB计算模拟采样点:
%%%%%%%%%%%%%
%根据实际情况修改下列参数
f1 =5; %频率f1
a1 = 1; %幅值a1
f_sample = 1024; %采样频率
N = 2048; %采样点N

%采样
n = 0:N-1;
t = n/f_sample;
y= a1*sin(2*pi*f1*t);
y_int32=int32(y*2^31); %移位成Q31格式


将这组数据导入到CCS中,从CCS图里打开ipcb观察是否导入成功或导入正确。然后运行与FFT相关的代码,观察mag数组元素值和图形。




 图 1 FFT计算结果

从上图可看出计算结果非常漂亮,就是一根完美的脉冲尖峰线,这正好有利于下面的分析(这就是为什么这里不用带有各种干扰误差且影响分析的AD数据而用MATLAB模拟采样数据的原因)。
对结果进行分析。频率值很好算,mag数组只有mag[10]= 268435451而其余皆为0,故该单频信号的频率值为10* f_sample/ N=5Hz=f1,幅值怎么算?是否直接除2^30?,看看结果:
>> 268435451/2^30
ans =
 0.2500
说明结果并不是为1,因此求幅值并不能简单地直接除以1073741824再开方,观察这里还有个规律,若是:
>> 2*sqrt(268435451/2^30)
ans =
 1.0000
开方后还有个两倍的关系,这时才能是真实的幅度值。我没有仔细研究FFT库里面的汇编程序代码,系数2可能还是Q格式中的移位问题所致。最近因各种事繁忙,我还没仔细往里面找原因。
现在试验是否可以这样求幅值。若输入信号的真实幅值(随便写个数)为0.556458,频率还是5Hz,还是按照上面的方法来计算,FFT后的mag[10]= 83119830,则
>> 2*sqrt(83119830/2^30)
ans =
 0.55645799150412
与真实幅值0.556458对比,上述结果是非常精确的。
其实还可以观察出一些关于FFT输入输出Q格式数据的一些规律。比如上面的计算,因为移位,输入数据(-1~1之间)放大了2^31倍,计算幅值其实是sqrt(83119830/2^28),若是不放大这么多倍,那如何计算?
再随便写个信号幅值数,假定为0.781234,此时移位放大不是2^31而是其他(当然不能移位超出31不然就溢出了,表现在信号上就是信号的上下限被削顶了),假设放大了2^29,将此作为FFT输入,得到mag值
>> 2*sqrt(10239579/2^26)
ans =
 0.78123393995944
我想仔细的同学也能猜得出来规律了。
其实TI 的这个库输入用Q31格式,是为了得到定点处理器运算下FFT最好的精度,我花了一些时间做计算,做了一个表,从中可以看出这一点。按假设输入信号幅值为1.00000,频率为5Hz,在送入DSP运算前进行不同的移位放大,其中FFT计算后的mag[10]值与计算后的幅度值分别如下所示:





从计算出的上表可明显观察到移位放大倍数下降时(即送入FFT的数据越远离Q31格式时),计算的精度下降很多,绝对误差(此处绝对误差值即为相对误差值)也越来越大。
另外,若是以实际AD数据来进行幅值计算,所除的系数肯定要做些修正——因为AD采样数据受影响的因素很多,采样频率不稳,计算得到的频谱展宽等问题都要考虑到。而我在之前以试验的方式得到一组修正的系数值,从这个FFT库计算后以该系数得到的幅度值与真实值之间的相对误差,一直很好地保持在在1%到0.5%之内。
分类:技术 | 评论:6 | 浏览:4397 | 收藏 | 查看全文>>
共10页/96条记录 首页 上一页 1 2 3 4 5 下一页 尾页 返回顶部