已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DSP课程设计实 验 报 告语音压缩、存储和回放计院(系):电子信息工程学院 设计人员:吴 迪 班 级:通信0806学 号:08211153指导教师:杨 恒目 录一、设计任务书3二、设计内容3三、算法原理说明.3四、设计方案8五、程序设计、调试与结果分析11 六、设计(安装)与调试的体会22 七、参考文献22语音的压缩、存储与回放一、实验目的1、应用DSP算法实现对语音信号的压缩、存储和回放。2、熟悉使用C语言编写较复杂的程序; 3、熟悉C语言对外设(DSK板或示波器)的访问(软件编程、硬件连接); 4、熟练使用软件CCS5000对程序的完整调试过程。二、实验设计要求及目标1、使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。2、采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。3、存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。4、使用指示灯对语音存储和回放过程进行指示。三、实验原理1、语音编码 语音编码一般分为两类:一类是波形编码,一类是被称为“声码器技术”的编码。PCM编码即脉冲编码调制。波形编码的最简单形式就是脉冲编码调制(Pulse code modulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅 度进行编码,所以叫做脉冲编码调制。脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。2、量化: 脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方 式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。国际上有两种非均匀量化的方法:A律和u律,u律是最常用的一种。在美国,7位u律是长途电话质量的标准。 而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。3、DPCM&ADPCM:降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。因为差分信号比原语音信号的动态范围和平均能量都小。这种编码叫Differential PCM,简称DPCM,即差分脉冲编码调制。ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。CCITT(国际电报电话咨询委员会)在1984年提出的32 kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。这种ADPCM编码方案达到64 kbit/s PCM的语音传输质量,并具有很好的抗误码性能。4、A律压缩本实验中采用了A律压缩。语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信躁比,压缩比特速率,可为非线性量化。语音压缩是把16位的数据比特转化为8位数据比特,从而到达语音压缩的目的。在主程序中通过A/D抽样量化,可以得到16位的线性编码,再由编码表通过软件计算得到8位A律编码,其中最高位为符号位,第6位到第4位为段落码,低4位为段内码。将8位的压缩结果存储到系统RAM中进行缓存,根据抽样率、语音存储时间以及系统RAM的容量设置语音存储缓冲区的大小,待缓冲区存满后,将缓冲区内的数据进行解压缩,然后输出到SPEAKER接口输出端。若使用A/D转换器,必须首先对A/D转换器进行初始化设置,即设置A/D转换器的工作模式、输入增益以及抽样频率等。A律的压缩可以按照下列公式进行定义:其中:A是压缩参数(在欧洲,A=87.6)x是需要压缩的归一化整数。A律压缩示意图如下:从线性到A律的压缩转换如下表所示:其中,压缩后的码字组成:比特0-3表矢量化值,比特4-6表示段值,压缩后的码字符号放在比特7,为了简化未写出。压缩前的码字丢弃的比特数压缩后的码字输入值段值,量化值比特:11 10 9 8 7 6 5 4 3 2 1 0比特:6 5 4 3 2 1 0 0 0 0 0 0 0 0 a b c d x 10 0 0 a b c d 0 0 0 0 0 0 1 a b c d x1 0 0 1 a b c d 0 0 0 0 0 1 a b c d x x2 0 1 0 a b c d 0 0 0 0 1 a b c d x x x 3 0 1 1 a b c d 0 0 0 1 a b c d x x x x 5 1 0 0 a b c d 0 0 1 a b c d x x x x x6 1 0 1 a b c d 0 1 a b c d x x x x x x 7 1 1 0 a b c d 1 a b c d x x x x x x x 8 1 1 1 a b c d 5、律压缩律压缩的特点是:其中:y为归一化的压缩输出电压,即y=压缩器输出电压/压缩器可能输出最大电压;x为归一化的压缩输入电压,即x=压缩器输入电压/压缩器可能输入最大电压; 为压扩参数,表示压缩的程度。在使用律的处理过程为:压缩和解压,压缩是指在发送端对输入信号进行压缩处理,再均匀量化,相当于非均匀量化;解压是在接收端进行相应的解压处理,以恢复原始信号。经过压缩的采样信号,按8位二进制编码,编码表如下:0000000wxyza000wxyz0000001wxyza001wxyz000001wxyzab010wxyz00001wxyzabc011wxyz0001wxyzabcd100wxyz001wxyzabcde101wxyz01wxyzabcdef110wxyz1wxyzabcdefg111wxyz8位码有三部分组成:极性码(0:负极性信号;1:正极性信号)、段落码、电平码。律解压编码表与编码表左右相反。律编码=极性码(musign)+段落码(muchord)+电平码(mustep),算法如下:muchord=(19-T|EXP)4=190-(T|EXP)*16+10H;musign=(AH*(-1)7=(AH*FFFFH)*128=AH*(FFFFH7)=AH*FF80H;mustep=(|int|+33)(T|EXP)-26)-10;6、语音采集与输出模块语音采集与输出模块采用的是TI公司推出的一款高性能的立体声音频Codec芯片TLC320AD50C,内置耳机输出放大器,支持MIC和LINE IN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigmadelta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。与此同时,AD50还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。由于具有上述优点,使得AD50是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3)、录音机等数字音频领域2。由TLC320AD50C组成的语音输入与输出模块不仅采样率高最高可达96K,且外围电路简单,性价比高。7、 DSK 包括:主芯片 1枚:100 MHz TMS320VC5402 DSPRAM 1枚:1个软件等待的64K16bit的SRAM(CY7C1021V33)FLASH 1枚:256K16bit 的 FLASH存储器(AM39VF400A)接口 2个:一个连接到PC机并口的主机端接口HPI和用于仿真的JTAG测试总线控制器 信号采集和输出端口:麦克风/耳机音频接口8、TMS320C5402的结构及原理 TMS320C5402采用先进的改进的哈佛结构和8条总线结构,解决了冯诺伊曼(Von-Neumann)结构中高速数据传输时的传输通道上的瓶颈现象,使处理器的性能大大提高,程序数据总线相互独立,允许同时访问程序存储器和数据存储器,实现高度并行操作。此外,还可以在数据总线与程序总线之间相互传送数据,从而使处理器具有在单个周期内同时执行算数运算、逻辑运算、移位操作、乘法/累加运算以及访问程序和数据存储器的强大功能。TMS320C5402的内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间;指令执行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求如FIR、IIR、FFT等运算。由于C5402有7种有效灵活的寻址方式的软件特点,仅为10ns的指令执行周期,还有一些特殊的运算指令更好地满足了数字信号处理中特有的运算需要。 TMS320C5402具有高速的,全双工串行口,可用来与系统中的其他C54x器件,编码解码器,串行A/D,D/A转换器以及其他的串行器件直接接口。这两个串行口均为多通道缓冲串行口McBSP(Multi-channel Buffered Serial Port)。它支持全双工通信,双缓冲数据寄存器,允许连续的数据流。内置-律和A-律压扩硬件。DSP功能框图9、AD50的结构与原理AD50是单片音频接口芯片(AIC)。它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置。在DAC之前有一个插值滤波器以保证输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。 AD50内部有7个数据和控制寄存器,用于编程控制它们的工作状态。它的数据传输模式和采样速率都可以通过DSP对其控制寄存器的编程来实现,因此,在许多场合下,AD50都作为DSP的AIC来实现音频处理。寄存器0:空操作寄存器。 寄存器1:软件复位 软件掉电 选择16位或15位工作方式 硬件或软件二次通信请求方式的选择 寄存器2:使能ALTDATA输入端 为ADC选择16/15位方式 寄存器3:选择FS与FSD之间延迟SCLK的个数 告诉主机有几个从机被联上 寄存器4:为输入和输出放大器选择放大器增益 选择N来设置采样频率,fs=MCLK/(128*N)或MCLK/(512*N) 在MCLK输入端使能外部时钟输入并旁通内部的PLL 寄存器5,6:保留 在CCS 集成开发环境中,与tlc320ad50 CODEC 编译码器相关的头文件是codec.h。它位于C:tic5400dsk5402include 目录下。在这个头文件中,定义了与ad50 CODEC 相关的枚举变量和库函数。除了可以调用codec.h 中提供的库函数之外,我们还可以利用这些枚举变量重新编写自己的codec 函数,使用枚举变量相或产生所需要的ad50 寄存器的初始化值。Codec.h 中的库函数位于函数库dsk5402.lib 和 drv5402.lib 中。函数库dsk5402.lib 和 drv5402.lib 是作为两个单独的文件,连同include 文件和头文件一起提供给用户的,如果你的应用程序中用到了其中的库函数,就需要与这两个函数库进行链接(link)dsk5402.lib 是一个主要的函数库,其内部使用了drv5402.lib 的头文件。AD50与C5402之间的数据传送采用串行方式,包括两种传输模式:16位和15+1位传输模式。15+1位模式时,其中的D0位表示二次通信。它们各自的时序如下:10、程序存储芯片实验中,电路选用的芯片SST39VF400是一个低功耗FLASH。芯片硬件特点:A17至A0为外部地址管脚,D15至D0为1条数据线,CE#为片选控制管脚(低有效),OE#为输出控制管脚(低有效),WE#为写入控制管脚(低有效)。工作在2.7V至3.6V电压下,存储容量位256KW,其中的数据可以保持100年以上,可重复编程次数高达10万次。11、风和耳机接口音频接口使用了2 个工业标准的3.5mm 的连接器:一个连接麦克风的音频输入;一个连接耳机的音频输出。(1)音频输入是交流偶合的并且包括:1 个固定增益为10dB 的放大器;实现单端到差分的转换(在此之前,连接到DSP 的McBSP1 上的TLC320AD50对其进行数字化);电压偏置(支持电池电源和驻极体麦克风);被动滤波(在DSK 的音频插口和CODEC 之间)用来增强性能,为驻极体麦克风设计的麦克风的输入它需要一个电压偏置。如果使用电容来隔离偏置电压,就能够使用动态的麦克风。麦克风的输入信号最大允许标准是500mV(350mVrms)。在DSK上有10dB前置放大器增益。(2)音频输出是可以编程控制的,在软件的控制下,可以在6dB增幅的范围内,增加增益+0+2dB。音频输入可以编程控制的,在6dB增幅范围内,提供+0+12dB的增益。四、程序设计思路DSP程序设计应包括用户程序、存储器配置程序。为了实现语音信号的采集与回放,先将语音信号采集,运用a律压缩算法将信号压缩并存入存贮器中,当放音开始时运用a律解压算法将信号解压并从存储器中释放出来,实现语音的回放。1、软件设计流程开始初始化Board板成功?调用_led_display(2)使灯都闪两次初始化Codec片选FLASH为外部存储器等待接受Instance处的采样LED灯0亮开始录音采样送voice_sample压缩存储voice_sampleLED灯1熄灭放音结束读取,解压缩并送voice_sample1LED灯1亮开始放音LED灯0熄灭录音结束是否2、TMS320VC5402 mcbsp的串口的初始化首先将DSP的串口1复位,再对串口1的16个寄存器进行编程,使串口1工作在以下状态:禁止SPI模式,但数据相,每帧一字,每字16位,帧同步脉冲低电平有效,并且帧同步信号和移位信号有外部时钟产生。hHandset = codec_open(HANDSET_CODEC); 此语句调用了函数codec_open()对串口1进行了初步设置,设置成功返回codec的句柄放在变量 hHandset中,作为调用其他函数的实参。3、AD50的初始化该初始化过程调用了5个函数对AD50的5项参数进行了设置,包括adc和dac的工作模式,模拟输入和输出的增益;以及A/D、D/A的转换速率。codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 6dB gain on analog input to ADC */codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* -6dB gain on analog output from DAC */codec_sample_rate(hHandset,SR_800); /* 8Hz sampling rate */4、FLASH存储器的初始化void flashenable(void)CPLD_CTRL2_REG|=0x0010;CPLD_DMCTRL_REG|=0x0040;5、从McBSP的接收通道读取A/D转换的值,然后经过压缩解压后将其发送到McBSP的发送通道,将解压后的数据将数据写入D/A转换器。程序如下:while (1) /* Wait for sample from handset */ while (!MCBSP_RRDY(HANDSET_CODEC) ;/*获取McBSP是否做好接受的准备信息*/* Read sample from and write back to handset codec */ data=*(volatile int*)DRR1_ADDR(HANDSET_CODEC);/* 定义数据接收寄存器1的地址*/ pre=int2alaw(data); /*or pre=int2ulaw(data);*/ data=alaw2int(pre); /*or data=ulaw2int(pre);*/ *(volatile int*)DXR1_ADDR(HANDSET_CODEC)=data;/* 对输入信号进行语音处理*/6、闪灯程序程序段:/*闪灯*/void led(s16 cnt)while ( cnt- )brd_led_toggle(BRD_LED0);delay(1000);brd_led_toggle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);程序分析:此函数用了一个while循环语句实现cnt次灯闪,通过调用delay子函数控制灯闪灭时间,其中brd_led_toggle()表示切换用户LED,改变用户控制LED02的状态。五、实验程序1、C语言程序/*/* 头文件 */*/#include #include #include #include /*/* 变量宏定义 */*/#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */#define QUANT_MASK (0xf) /* Quantization field mask. */#define NSEGS (8) /* Number of A-law segments. */#define SEG_SHIFT (4) /* Left shift for segment number. */#define SEG_MASK (0x70) /* Segment field mask. */*/* 函数声明 */*/void delay(s16 period);void led(s16 cnt);void initcodec(void);void flashenable(void);unsigned char data2alaw(s16 pcm_val);int alaw2data(unsigned char a_val);static int search(int val,short *table,int size);/*/* 全局变量 */*/HANDLE hHandset;s16 data;s16 data1;u16 i=0;u16 temp1;u16 j=0;u16 k,l=0;u8 temp2;u16 buffer22000;static short seg_end8=0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF;/*/* 主函数 */*/void main() if (brd_init(100) return; led(2); /闪灯两次 initcodec(); /初始化codec flashenable(); /选择片外FLASH为片外存储器 while (1) while (!MCBSP_RRDY(HANDSET_CODEC) ; /等待接收handset处的采样 if (i=0) brd_led_toggle(BRD_LED0); /点亮二极管0,表示录音开始 data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从handset处读取采样 temp1=data2alaw(data); /对采样进行a律压缩/*/* 把低地址数据放在高八位高地址数据放在低八位 */ /*/ i=i+1; if(i%2=1) bufferj=(temp1=44000) i=0;if(j=22000)j=0;brd_led_toggle(BRD_LED0); /熄灭数码管0 表示录音结束brd_led_toggle(BRD_LED1); /点亮二极管1 表示放音开始 /*/* 放音部分 */*/ for(k=0;k8)&0x0ff;elsetemp2=bufferl&0x0ff;l+;if(l=22000)l=0;data1=alaw2data(temp2); while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1; /*/* 放音结束 */*/if(k=44000) brd_led_toggle(BRD_LED1); /熄灭二极管1 表示放音结束 /主程序结束/*/ /* 子函数 */ /*/*延时*/void delay(s16 period) int i, j; for(i=0; iperiod; i+) for(j=0; j1; j+); /*闪灯*/void led(s16 cnt)while ( cnt- )brd_led_toggle(BRD_LED0);delay(1000);brd_led_toggle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);/*初始化codec*/void initcodec(void) /* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); / Acquire handle to codec /* Set codec parameters */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); / DAC in 15-bit mode codec_adc_mode(hHandset, CODEC_ADC_15BIT); / ADC in 15-bit mode codec_ain_gain(hHandset, CODEC_AIN_6dB); / 6dB gain on analog input to ADC codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); / -6dB gain on analog output from DAC codec_sample_rate(hHandset,SR_8000); / 8KHz sampling rate /*设置flash*/void flashenable(void)CPLD_CTRL2_REG|=0x0010;CPLD_DMCTRL_REG|=0x0040;/*a律压缩*/unsigned char data2alaw(s16 pcm_val) Int mask;Int seg;unsigned char aval;if (pcm_val = 0) mask = 0xD5; / 标记 (7th) bit = 1 else mask = 0x55; / 标记 bit = 0 pcm_val = -pcm_val;/ Convert the scaled magnitude to segment number. seg = search(pcm_val, seg_end, 8); / Combine the sign, segment, and quantization bits. if (seg = 8) / out of range, 返回最大数. return (0x7F mask);else aval = seg SEG_SHIFT;if (seg 1) & QUANT_MASK;elseaval |= (pcm_val seg) & QUANT_MASK;return (aval mask);/*alaw的子程序*/static int search(int val,short *table,int size)Int i;for (i = 0; i size; i+) if (val = *table+)return (i);return (size);/*a律解压*/int alaw2data(unsigned char a_val)Int t;Int seg;a_val = 0x55; t = (a_val & QUANT_MASK) SEG_SHIFT;if(seg=0) t += 8;t=(t3);if(seg0) t +=0x108;t=(t(4-seg);if(seg3)t+=0x108;t=(t PRAM PAGE 0 .text PRAM PAGE 0 .vectors VECS PAGE 0 init_var PRAM PAGE 0 detect PRAM PAGE 0 vrcprg PRAM PAGE 0 matprg PRAM PAGE 0 .stack STACK PAGE 1 .trap SCRATCH PAGE 1 .const EXRAM PAGE 1 .data EXRAM PAGE 1 .bss EXRAM PAGE 1 .cio EXRAM PAGE 1 .switch EXRAM PAGE 1 tables EXRAM PAGE 1 var EXRAM PAGE 1 svctab EXRAM PAGE 1 /* SS_V LSP table */ vctab EXRAM PAGE 1 /* V LSP table */ uvctab EXRAM PAGE 1 /* UV LSP table */ cuvtab EXRAM PAGE 1 /* Stochastic codebook */ cdbktab EXRAM PAGE 1 /* various codebook tables*/ logtab EXRAM PAGE 1 /* table for log2 */ powtab EXRAM PAGE 1 /* table for pow2 */ hamtab EXRAM PAGE 1 /* table for hamming */ lgwtab EXRAM PAGE 1 /* table for lag window */ acostab EXRAM PAGE 1 /* table for arccos */ sqrtab EXRAM PAGE 1 /* table for square root */ acbtab EXRAM PAGE 1 /* table for thresholds in acb */ pm03tab EXRAM PAGE 1 /* table for x(-0.3) computation */ costab EXRAM PAGE 1 /* table for cosine */ V23 INRAM PAGE 1 FSK INRAM PAGE 1 hpibuff0 HPRAM0 PAGE 1 hpibuff1 HPRAM1 PAGE 1 hpibuff2 HPRAM2 PAGE 1 dma_buff DMARAM PAGE 1六、CCS程序调试和结果1、将5402 DSK板与计算机相连,连接好耳机,音频线,电源线等。2、连接DSK板的电源,并装载DSK安装程序。3、双击桌面上的CCS 2(C5000) 图标运行CCS程序,选择浮动菜单Import configuration-Available configuration 列表中,然后选中C5402 Device Simulator (没接DSK板时)、C5402 DSK via Parallel Port Emulation (接DSK板时)。选中Import,最后选中save and quit以保存目标DSP的配置。4、运行CCS2,出现CCS界面。新建一个工程,向工程中添加c语言程序文件、CMD程序、头文件和库文件。C程序运行支持库:C:ti c5400cgtools rts.lib相关的头文件:C:ti c5400cgtoolsinclude*.hDSK板库文件: C:ti c5400dsk5402 drv5402.lib,dsk5402.lib相关的头文件:C:ti c5400dsk5402include*.h在程序中还用到其他头文件:#include #include #include #include C语言程序文件、CMD程序和库文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 神经外科低钠血症治疗指南
- 风带来的好处和坏处活动
- 企业班组安全教育
- 第六章 机械能守恒定律-功和功率 2025年高考物理基础专项复习
- 示出塞课件教学课件
- 3.1.1 铁及其化合物 课件 上学期化学人教版(2019)必修第一册
- 慢病专员工作汇报
- 吉林省2024七年级数学上册第2章整式及其加减期末提分课件新版华东师大版
- 常见的安全标志教案及反思大班
- 氧化碳的说课稿
- 2024-2025学年浙教版八年级上册科学期中模拟卷
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 智能制造工程生涯发展报告
- 二级公立医院绩效考核三级手术目录(2020版)
- 品牌授权工厂生产授权书合同
- 6人小品《没有学习的人不伤心》台词完整版
- 销售配合与带动-培训PPT课件
- 导师带徒实施办法6、30
- 《Fishing with Grandpa》RAZ分级阅读绘本pdf资源
- 水稳施工方案(完整版)
- 跨海大桥施工方案
评论
0/150
提交评论