• 14
  • 12月

Spirit DSP 解码处算法指标

SpiritDSP是一家提供音视频方案的公司。以下主要就是整理一下该公司提供方案的一些算法的指标,以便作为日后的评估及程序优化的一个参考指标。

MP3解码

平台 ARM7 ARM9 ARM9E ARM11 Tensilica HFi2 Cortex-M3 Nios II TI C55xx
平均MIPS 19.5 17.5 8 7.5 5.7 23 18 12
峰值MIPS 25 22 10 9.5 8 28 22 13
程序大小(KB) 16.5 19.7 15 16.5 19.9 13.7 16 11.4
常量大小(KB) 7.5 7.2 6.6 7.5 15 7.6 6.8 7.5
连续变量(KB) 12.1 12.3 12.1 12.1 20.1 12.3 13.3 12.3
临时变量(KB) 0 0 0 0 0 0 0 0
堆栈(KB) 0.5 0.5 0.5 0.5 1 0.5 0.5 0.5
平台 AudioDE Revision2
平均MIPS 5
峰值MIPS 5.5
程序大小(KB) 27
Y Memory(KB) 15
X Memory(KB) 12

WMA解码

阅读剩余部分...

  • 21
  • 11月

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

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

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

  • 10
  • 10月

总算有点看懂wma2wav(ffmpeg)中的IMDCT算法了。只是有点看懂。

wma2wav,其实就是从ffmpeg中将wma解码的程序提取了出来。IMDCT是其中的一个重要部份吧。小结了一下该程序对IMDCT的计算流程。

先是将IMDCT的式子进行分段移位,利用cos函数的对称性,将2N个点的IMDCT转换成N个点的DCT-IV算法。

然后对这N个点进行处理,以偶序列为实部,奇序列的逆序列为虚部,先进行预处理,然后就转换成N/2个点的FFT。计算完后,再进行相关的后处理,即可得到。

整个算法和http://www.ee.columbia.edu/~marios/mdct/mdct_giraffe.html中提到的imdtc4差不多。

花了几天时间终于弄明白这个预处理和后处理的推导流程。其实预处理和后处理的目的就是为了把表达示转换成标准DFT,这样就可以用FFT来进行计算了。仅此而已。

在FFT计算过程中,ffmpeg用的是按时间抽取的FFT算法,也就是先按位逆序来打乱顺序,然后计算,结果就是顺序的了。

  • 27
  • 9月

这几天,一直在看WMA解码的IMDCT及加窗重构部分。

经常了很多资料的查阅,终于对这一块有了一个初步的认识。

第一个认识就是:其实不管是MP3还是WMA解码,整个大的流程都是差不多的。先是一个Huffman解码,反量化,然后就是立体声合成,然后就是IMDCT及加窗,最后,MP3还有一个子带合成。

第二个认识就是重点看了IMDCT这一块了。其实大学时是有学过数字信号处理的。只是大学时感觉这门课好抽象,也没好好学好。现在,也算是一次补课的机会吧。

在音视频中,编码时一般我们会用一些“变换”来对样点进行处理,将时域信号转换到频域,以消除信号的相关性。因此,在解码过程中,需要用“逆变换”来将频域上的点转回时域,还原出原来的音视频信号。

傅立叶变换是整个信号处理的基础。DFT是离散傅立叶变换,它先将傅立叶信号在时域上进行离散,变成离散时间的傅立叶变换,然后在频域上再进行离散,就成了傅立叶变换了。

DCT,即离散余弦变换。它其实是离散傅立叶变换的一个简换,只有实部而没有虚部。DCT的变换公式有很多(8条),在JPEG图像压缩当中就有用到DCT变换。但是DCT变化有一个缺点:DCT变换是分块进行的,块与块之间不能平滑过度,可能会对音频信号带来噪声。

MDCT全称是改进的离散余弦变换。主要在DCT变换进行改进,对前后块进行混叠处理。也就是说2N的样点的输入,得到N的样点的输出。IMDCT则相反,N个样点的输入,得到2N的样点的输出。但是需要注意的是:假设原信号为
a, b, c。 MDCT(a, b) = A, MDCT(b, c) = B。 然后 IMDCT(A) = a1, b2,IMDCT(B) = b1, c2。然后再进行混叠,b1+b2才是b的输出样点。

加窗这一块暂时还没搞懂,还需要进一步学习。