离散余弦变换(DCT)的DSP程序设计与实现_fft的实现dsp编程
离散余弦变换(DCT)的DSP程序设计与实现由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“fft的实现dsp编程”。
《DSP技术及应用实习》
DSP课程设计论文
题 目 离散余弦变换(DCT)的DSP实现
专 业 电气工程及其自动化
姓 名
陈梦泽 班 级 11东电气
学 号 11811527
执行学期 2014-2015
《DSP技术及应用实习》
离散余弦变换(DCT)的DSP实现
一、实验目的 1.掌握离散余弦变换的概念和实现方法; 2.掌握用 C 语言或汇编语言编写 DSP 程序的方法; 3.熟悉DCT原理;
二、实验设备
1.一台装有 CCS 软件的计算机; 2.DSP 实验箱的TMS320C5410 主控板; 3.DSP 硬件仿真器;
三、实验原理论述
1、原理
离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算。在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。对于给定的实际数据序列x(0),X(1),x(2)....X(N-1)的DCT(FDCT)算法如下:
z(k)N12(2n1)k(k)x(n)cosN2Nn0
(1)
其中: 1 for k=0 2(k)1 for k0(k)
(2)
二维离散余弦变换(FDCT):
N1N12(2m1)k(2n1)l z(k,l)(k)(l)x(m,n)coscosN2N2Nn0m0(3)
其逆运算是: 2
《DSP技术及应用实习》
N1N12(2m1)k(2n1)l x(m,n)(k)(l)z(k,l)coscosN2N2Nk0l0(4)其中 N= 8 为 8x8 DCT.2、DCT的DSP 程序设计
无论是C语言还是汇编语言,程序流程均分为初始化、行变换、列变换和移位输出四个步骤。行、列变换具有相似性,如果对行变换的结果矩阵转置,则列变换程序跟行变换一样。对于汇编而言,初始化部分主要初始化FP指针以指向前一函数地址,初始化数据和指针寄存器以保存返回数据等。由于DCT行变和列变换过程相似,且列变换是在行变换操作的基础上进行的。则可利用多种索引寻址寄存器的灵活组合,把行变换结果直接以转置方式存储而不增加实际的存储时间,这样行列变换可使用同一代码循环两次实现,减小了实际代码大小。本程序实现的是FDCT,可以使用2次一维DCT变换来实现二维DCT变换。
3、DCT的DSP实现
二维DCT 变换时结果为两次无理数sqrt(8)相乘,产生了有理项,因此,在程序里首先多乘一次sqrt(8),然后在两次DCT 变换结束以后,使用右移3位以达到正常输出。
四、方案论证及系统设计
本次实习有两种方案,C语言和汇编语言实现,由于考虑到DSP程序的特点,我采用汇编语言实现。
1.打开CCS软件,编制程序简化行列变换的代码如下: 2.B0 = R0;
B3 = R1;
B2 = R2;„
LSETUP(DCT_START, DCT_END)LC0 = P0;
DCT_START:„
LSETUP(ROW_START,ROW_END)LC1=P2;3
《DSP技术及应用实习》
ROW_START: „
ROW_END:„
B1 = B0;
B0 = B2;DCT_END:B2 = B1;
五、一维DCT变换流程图
《DSP技术及应用实习》
六、程序模块源程序 DSP程序:.mmregs.def entry.sect “INIT” * * Initialise * entry NOP NOP SSBX SXM;set sign extension mode SSBX OVM;enable saturation LD #0, DP;set data page STM 0FFE0h, PMST;Init PMST reg.RSBX FRCT.include “fdct_dat.inc”;FDCT data storage declaration MODE.SET 1;MODE=1 TEST ON SIMULATOR PAGE0.SET 0 PAGE4.SET 4 PAGE24.SET 24d PAGE25.SET 25d B0.SET 0200h B1.SET 0300h B2.SET 060h PA1BIS.SET 1 PA2BIS.SET 2 PA3BIS.SET 3 PA4BIS.SET 4 PA5BIS.SET 5
《DSP技术及应用实习》
PA6BIS.SET 6 * Initialization of the registers.sect “FDCT” INIT LD #PAGE24, DP ST #21407, E_P6 ST #8867, F_P6 ST #2000H, ROUND1 TBL: LD #PAGE25, DP ST #21407, E_P7 ST #8867, F_P7 ST #4000H, ROUND2 ST #40H, ROUND3 START * IF MODE = SIMULATOR.IF MODE=1 STM #63, AR0;AR0= # of inputs to be takenX3*E_P6 MAS *AR1+0, A;X5*F_P6 MAS *AR1-, A;X6*16 SUB *AR1-, 4, A;X2*16 SUB *AR1-, 4, A;F_P6*X4 MAS *AR1-0, A;E_P6*X1 MAC *AR1+0, A;+ E_P6*X2 MAC *AR1+, A;+ E_P6*X5 8(D*X0-C*X1+B*X2-A*X3+A*X4-B*X5 8
《DSP技术及应用实习》
MAS *AR1+, A;1 STM #Z00, AR1;AR1= addr of first output BEG1 PORTW *AR1+, #PA2BIS;Send output value BANZ BEG1, *AR0-;Repeat above proce(64x)
EXIT NOP.ENDIF B START;Go to start of program.;Grab another 64 pixels COEF_F1.WORD-22725,-19266,-12873,-4520,4520,12873,19266,22725 9
《DSP技术及应用实习》
COEFF2.WORD 19266,-4520,-22725,-12873,12873,22725,4520,-19266 COEFF3.WORD 12873,-22725,4520,19266,-19266,-4520,22725,-12873 COEF_F4.WORD-4520,12873,-19266,22725,-22725,19266,-12873,4520 * with: A = cos(?16)*?*16384 = 22725 * B = cos(3?16)*?*16384 = 19266 * C = cos(5?16)*?*16384 = 12873 * D = cos(7?16)*?*16384 = 4520 * E = cos(?8)*?*16384 = 21407 * F = cos(3?8)*?*16384 = 8867 *.END 链接文件:-m fdct.map-o fdct.out-e entry fdct.obj
MEMORY {
PAGE 0: OCDARAM1: origin = 00080h length = 00880h DARAM */
OCDARAM2: origin = 00900h length = 00300h
OCDARAM4: origin = 00C00h length = 00400h
OCDARAM5: origin = 01000h length = 00400h
EXTERNAL: origin = 01400h length = 0EB80h
INTRVECS: origin = 0FF80h length = 00079h
/* on-chip 10
《DSP技术及应用实习》
PAGE 1: MMREGS:
origin = 00000h length = 00060h
SPRAM:
origin = 00060h length = 00020h
OCDARAM1: origin = 00080h length = 00400h
/* on-chip DARAM */
OCDARAM2: origin = 00480h length = 0077Fh
OCDARAM4: origin = 00C00h length = 00400h
OCDARAM5: origin = 01000h length = 00400h
EXTERNAL: origin = 01400h length = 0EC00h }
SECTIONS {
INIT
> OCDARAM1 PAGE 0
FDCT
> OCDARAM1 PAGE 0
.b
> OCDARAM4 PAGE 1 }
七、仿真调试及性能分析与实验
1.开电,运行CCS软件,打开项目文件fdct.prj,编译运行并下载。
2.设置断点,再点击“运行”按钮,如下图所示。这里的相关算法是在程序中编写的。
《DSP技术及应用实习》
3.Build 程序 并 run 程序
4、导入.OUT 文件: 12
《DSP技术及应用实习》
5、点击View->Graph->Time/Frquence打开图形属性对话框,如下设置。
1、点击“OK”后,可以看到如下波形。
《DSP技术及应用实习》
八、心得体会:
在本次实验中,经过老师的悉心指导和认真教学,通过不断的查找资料和反复研究与课题有关的CCS软件,编写了一个实现离散余弦变换的程序。本次的实验是为培养我们的专业技术而开设的专业综合实验课,目的是让我们熟悉和掌握专业实验中常用的仪器设备和开发工具,通过为期几周的学习和实验实践培养我们综合利用所学知识进行信号处理的能力,为今后的工作学习打下坚实的基础。通过本次的实验,使我更加了解和认识DSP在实践当中的应用,意识到了它的重要性和可实用性。并且让我激发了学习好DSP技术的决心。通过这次的实验我们还复习了C语言和汇编语言相结合的应用技术。现在是高科技发展的时代,DSP的应用领域十分广泛,因此我们一定要学好DSP技术。对之后的发展很有帮助,让我倍感兴奋。