• 25
  • 11月

在这个感恩节,除了感谢父母外,还要感谢的就是FU哥了。

出来工作两年多快三年了。一直是FU哥关照着。在出来的这两年多里,在FU哥的领导下,也感觉自己在技术方面上有了较大的成长。

刚进公司时,其实还不是跟FU哥的,但感觉那是面缘吧,不知为什么,一进公司就认准了FU哥当老大了。后来在自己的努力争取下,终于跟了FU哥,事实证时,这是我进公司后,做的一项最正确的决定了。

FU哥也一直肩负着公司核心技术的重任吧。我想,我能做的最好的报答FU哥的方式,就是努力学好技术,早日能够为FU哥分担一些吧。

也就这些了。

感谢一切关心我的朋友。不管是认识的,还是陌生的,只要在关心Hanny,在支持Hanny,Hanny都真诚地感谢你。

我看好多文章都说别忘了感谢敌人之类的话。可是实在想不起来自己有什么敌人之类了,这里就作罢。

  • 21
  • 11月

最近一直在看FFMPEG程序的WMA解码程序,主要要做一个解码算法的优法。

这里就简单做一个笔记吧。

在IMDCT或MDCT中,有一个叫s->inverse的变量,主要是对sin的值进行取反。一开始一直没弄懂,取反这个有什么意义。最后才明白,这个MDCT与IMDCT的计算函数有一定的通用性。当s->inverse为0时,计算的FFT为e^-jπ2w,而当s->inverse为1时,计算的为e^jπ2w,即傅立叶的反变换。

  • 11
  • 11月

偶然间,接触了一款DSP,认识了这么一个叫定点小数的东西。而之前接触到的却全是定点整数。

以8位为例,定点整数可以表达-128~127范围的数值。从右到左,每一位的权重分别为:2^0,2^1……2^6,最高位为符号位。而定点小数的表达范围则为-1 ~ 1-2^-7。从左到右,最高位为符号位,剩下位数的权得为:2^-1,2^-2……2^-7。

举个简单的例子,00010101,如果是定点整数,该值为16+4+1=21;如果是定点小数,该值为1/8+1/32+1/128=0.1640625。

那么,定点小数和定点整数,除了表达的数值外,在运算上会有什么区别呢?

先是位扩展。当8位扩至16位时,如果是定点整数,则在该数前补8个符号位。而如果是定点小数,则在该数后补8个0。再是16位到8位,定点整数则是丢弃高8BIT,定点小数则是丢弃低8BIT。因此,定点整数将会发生严重的溢出,而定点小数只会丢失部分精度。

在计算加减的时候,定点小数与定点整数没有太大的区别。在乘法上,就有一些区别了。比如说00000001 x 00000001。在定点整数的时候,由于1x1=1,因此结果为00000000 00000001。但是在定点小数时,由于00000001不再表示1,而是2^-7,因此,相乘的结果为 00000000 00000010,即2^-14。

也可以这么理解。由于定点小数的权重是由左向右的,由于两个带符号位的定点小数相乘,使得前面多出了一个符号位,因此需要左移一位来移出这个符号位。这样,从编码的字面值来看,定点小数相乘的结果是定点整数相乘结果的两倍。

那么定点小数究竟有什么好处呢?Hanny是这么理解的。在做乘法或乘加运算时,定点整数需要不断地移位来防止溢出,而定点小数则可直接实现。因为是小于1,所以定点小数在乘法运算过程永远不会溢出。

最后,今天是光棍节!55555

  • 6
  • 11月

11月15日,我真不该,唉~

  • 3
  • 11月

话说,C语言中最精髓的就是指针的操作了。当然,本文不对C语言的指针做详细的描述。Hanny在这里只想小结一下KeilC中的指针类型。

在KeilC中,我们会常见到下述的指针定义方式:
char *ptr1;<br />
char code *ptr2;<br />
char data *ptr3;<br />
char xdata *ptr4;<br />
char *data ptr5;<br />
char code *data ptr6;<br />
char data *data ptr7;<br />
char xdata *data ptr8;<br />
char *xdata ptr9;<br />
char code *xdata ptr10;<br />
char data *xdata ptr11;<br />
char xdata *xdata ptr12;


看到这里,可能会有人有点乱了吧。其实要理清上面这一堆东西很简单。

首先,我们需要了解51的内存结构。简单地说,就是51包括data/idata、xdata、code三大块。定义指针时,*后面的修饰符是用来表示指针的存储位置。如:ptr5、ptr6、ptr7、ptr8存储在data区中,ptr9、ptr10、ptr11、ptr12存储在xdata中。ptr1、ptr2、ptr3、ptr4的存储位置则取决于KeilC中的设置(使用内存的模式)。

*之前的修饰符,则是用来表示指针所指向的数据的存储位置,即指针类型。ptr2、ptr6、ptr10的指针,指向一个存储在code中的数据。ptr3、ptr7、ptr11的指针,指向一个存储在data中的数据。ptr4、ptr8、ptr12的指针,指向一个存储在xdata中的数据。

ptr1、ptr5、ptr9这三个指针有一点点特殊。没有修饰类型这表示这是一个通用指针,它将用3Byte来表示。其中第一字节表示指针类型,后两个指针存放指针地址。而类型中,0xff表示指针存放在code中,0x00表示data/idata,0x01表示xdata。

综上所述,若一个指针为char xdata * xdata,如ptr12,则该指针表示一个存放在xdata中的指针,并且该指针指向一个xdata的数据。

在使用过程中,只要注意到了这些类型,应该是不会出什么问题的。