题目:音乐播放器
院(系):电气工程系
班级:083341
姓名:郭丽
学号:30
指导老师:李晓锋#include #define F_CPU4000000UL #include #define N() //低音1~7 #define FD1(F_CPU/2/N/262-1) #define FDs1(F_CPU/2/N/277-1) #define FD2(F_CPU/2/N/294-1) #define FDs2(F_CPU/2/N/311-1) #define FD3(F_CPU/2/N/330-1) #define FD4(F_CPU/2/N/349-1) #define FDs4(F_CPU/2/N/369-1) #define FD5(F_CPU/2/N/392-1) #define FDs5(F_CPU/2/N/411-1) #define FD6(F_CPU/2/N/440-1) #define FDs6(F_CPU/2/N/466-1) #define FD7(F_CPU/2/N/494-1) //中音1~7 #define FZ1(F_CPU/2/N/523-1) #define FZs1(F_CPU/2/N/554-1) #define FZ2(F_CPU/2/N/578-1) #define FZs2(F_CPU/2/N/622-1)#define FZ3(F_CPU/2/N/659-1) #define FZ4(F_CPU/2/N/698-1) #define FZs4(F_CPU/2/N/740-1) #define FZ5(F_CPU/2/N/784-1) #define FZs5(F_CPU/2/N/831-1) #define FZ6(F_CPU/2/N/880-1) #define FZs6(F_CPU/2/N/932-1) #define FZ7(F_CPU/2/N/988-1) //高音1~7 #define FG1(F_CPU/2/N/1046-1) #define FGs1(F_CPU/2/N/1109-1) #define FG2(F_CPU/2/N/1175-1) #define FGs2(F_CPU/2/N/1245-1) #define FG3(F_CPU/2/N/1318-1) #define FG4(F_CPU/2/N/1397-1) #define FGs4(F_CPU/2/N/1480-1) #define FG5(F_CPU/2/N/1568-1) #define FGs5(F_CPU/2/N/1661-1) #define FG6(F_CPU/2/N/1760-1) #define FGs6(F_CPU/2/N/1865-1) #define FG7(F_CPU/2/N/1976-1)unsignedcharyuepu1[]={FG1,/2,FG1,/2,FZ5,/2,FZ 5,/2,FZ3,/2,FZ6,/2,FZ5,/2,FZ3,/2,FZ2,/2, FZ1,/2,FZ2,/2,FZ3,/2,FZ1,,FZ3,,FZ1,,FZ3, /2,FZ3,/2,FZ1,,FZ3,/2,FZ3,/2,FZ5,/2,FZ6, /2,FZ5,,FZ6,/2,FZ6,/2,FZ5,/2,FZ5,/2,FZ4, /2,FZ4,/2,FZ4,,FZ2,/2,FZ3,/2,FZ2,/2,FZ1, FZ2,,FZ3,,FZ1,/2,FZ3,,FZ1,/2,FZ3,/2,FZ3, /2,FZ5,/2,FZ6,/2,FZ6,,FG1,,FZ5,/2,FZ5,6 4/2,FZ6,,FZ3,,FZ2,/2,FZ1,/2,FZ2,/2,FZ3, /2,FZ5,,FG1,,FZ5,/2,FZ5,/2,FZ6,,FZ3,,FZ 2,/2,FZ1,/2,FZ2,/2,FZ3,/2,FZ1,,0,0}; unsignedcharyuepu2[]={FZ1,,FZ2,,FZ3,,FZ1,,F Z1,,FZ2,,FZ3,,FZ1,,FZ3,,FZ4,,FZ5,,FZ3, ,FZ4,,FZ5,,FZ5,/2,FZ6,/2,FZ5,/2,FZ4,/ 4,FZ3,,FZ1,,FZ5,/2,FZ6,/4,FZ5,/2,FZ4,/4, FZ3,,FZ1,,FZ1,,FZ5,,FZ1,,FZ1,,FZ5,,FZ 1,,255,0,0}; unsigned char yuepu3[]={FZ3,,FZ3,/2,FZ4, /2,FZ5,,FZ1,/2,FZ2,/2,FZ3,/2,FZ3, /2,FZ3,/2,FZ4,/2,FZ5,,FZ2,/ 2,FZ3,/2,FZ4,,FZ4,/2,FZ3,/2,FZ1, ,FZ4,/2,FZ3,/2,FZ4,,FD6,/2,FZ1,/2,FZ2,,FZ1,/2,FZ2,/2,FZ3,,FZ3, /2,FZ4,/2,FZ5,,FZ6,/2,FZ7,/2, FG1,/2,FG1,/2,FZ3,,FZ4,/2,FZ5, ,FZ2,/2,FZ3,/2,FZ4,/2,FZ3,/2, FZ4,/2,FG1,/2,FG1,,FZ2,/2,FZ3, /2,FZ4,/2,FZ3,/2,FZ4,/2,FG2,/ 2,FG2,,FG1,/2,FZ7,/2,FG1,+/2,0,0}; unsignedcharyuepu4[]={FZ6,+/2,FZ5,/2,FZ3,,F Z5,,FG1,,FZ6,/2,FZ5,/2,FZ6,/2,FZ5,/2,FZ 6,/2,FZ5,,FZ3,,FZ1,/2,FZ6,/2,FZ5,/2,FZ3, /2,FZ2,,FZ2,,FZ3,/2,FZ5,,FZ5,/2,FZ6,/ 2,FZ3,/2,FZ2,/2,FZ1,+,0,0}; unsignedcharyuepu5[]={FZ1,/2,FZ1,/2,FZ5,/2,FZ 5,/2,FZ6,/2,FZ6,/2,FZ5,,FZ4,/2,FZ4,/2,F Z3,/2,FZ3,/2,FZ2,/2,FZ2,/2,FZ1,,FZ5,/2, FZ5,/2,FZ4,/2,FZ4,/2,FZ3,/2,FZ3,/2,FZ2,, FZ5,/2,FZ5,/2,FZ4,/2,FZ4,/2,FZ3,/2,FZ3, /2,FZ2,,0,0}; unsignedcharyuepu6[]={FZ5,/2,FZ3,/2,FZ5,/2,FZ 3,/2,FZ1,,FZ2,/2,FZ4,/2,FZ3,/2,FZ2,/2,F Z5,,FZ5,/2,FZ3,/2,FZ5,/2,FZ3,/2,FZ1,,FZ 2,/2,FZ4,/2,FZ3,/2,FZ2,/2,FZ1,,0,0};#define DIGIT_DDR DDRD #define DIGIT_PORT PORTD #define DIGIT_PIN PIND #define KEY_DDR DDRC #define KEY_PORT PORTC #define KEY_PIN PINC #define KEY11 #define KEY22 #define KEY33 #define KEY44 #define KEY55 #define KEY66 #define NOKEY0 #define SET_KEY_COLUMN1_LOW()(PORTC=0b11110111) #define SET_KEY_COLUMN2_LOW()(PORTC=0b11101111) #define KEY_ROW_10b11111110 #define KEY_ROW_20b11111101 #define KEY_ROW_30b11111011 unsigned char CodeTab[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d }; void init(void) { DDRD=0xFF; PORTD=0xFF; DDRB|=(1< DIGIT_PORT=0x3F; KEY_DDR=(1< { SET_KEY_COLUMN1_LOW(); _delay_ms(1); if((KEY_PIN|KEY_ROW_1)==KEY_ROW_1)return KEY1; else if((KEY_PIN|KEY_ROW_2)==KEY_ROW_2) return KEY2; else if((KEY_PIN|KEY_ROW_3)==KEY_ROW_3) return KEY3; SET_KEY_COLUMN2_LOW(); _delay_ms(1); if((KEY_PIN|KEY_ROW_1)==KEY_ROW_1) return KEY4; else if((KEY_PIN|KEY_ROW_2)==KEY_ROW_2) return KEY5; else if((KEY_PIN|KEY_ROW_3)==KEY_ROW_3) return KEY6; return NOKEY; } volatile unsigned char*pyuepu; unsigned char music_index; unsigned yinyue() { unsigned char tong;unsigned char leng; unsigned char chang,ting; music_index=0; do { tong=pyuepu[music_index++]; leng=pyuepu[music_index++]; OCR0A=tong; ting=leng/10; chang=leng-ting; unsigned char i; for(i=0;i OCR0A=0; for(i=0;i } { unsigned char KeyValue; TCNT0=0; TCCR0A=(1< while(1) { KeyValue=KeyScan(); if(KeyValue!=NOKEY) { DIGIT_PORT=CodeTab[KeyValue]; switch(KeyValue) { case1:pyuepu=yuepu1;yinyue();break; case2:pyuepu=yuepu2;yinyue();break; case3:pyuepu=yuepu3;yinyue();break;case4:pyuepu=yuepu4;yinyue();break; case5:pyuepu=yuepu5;yinyue();break; case6:pyuepu=yuepu6;yinyue();break; default:break; } } } } 目录 1、引言 2、系统介绍 (1)、PCM编码中的抽样、量化、编码 (2)、PCM编码器模块 (3)、PCM编码器组件功能的实现 (4)、PCM译码器模块 (5)、PCM译码器组建功能的实现 3、系统仿真模型 4、仿真波形 (1)、信号源波形 (2)、信号源压缩后的波形(3)、PCM编码波形 (4)、PCM解码波形 (5)、PCM译码时经过D/A转化并用A律扩张后的输出波形(6)、译码后恢复源信号的输出波形 5、参考文献 6、设计过程中需解决的问题 7、心得体会 摘要 SystemView仿真软件可以实现多层次的通信系统仿真。脉冲编码调制(PCM)是现代语音通信中数字化的重要编码方式。利用SystemView实现脉冲编码调制(PCM)仿真,可以为硬件电路实现提供理论依据。通过仿真展示了PCM编码实现的设计思路及具体过程,并加以进行分析。 关键词:PCM编译码 1、引言 随着电子技术和计算机技术的发展,仿真技术得到了广泛的应用。基于信号的用于通信系统的动态仿真软件SystemView具有强大的功能,可以满足从底层到高层不同层次的设计、分析使用,并且提供了嵌入式的模块分析方法,形成多层系统,使系统设计更加简洁明 了,便于完成复杂系统的设计。 SystemView具有良好的交互界面,通过分析窗口和示波器模拟等方法,提供了一个可视的仿真过程,不仅在工程上得到应用,在教学领域也得到认可,尤其在信号分析、通信系统等领域。其可以实现复杂的模拟、数字及数模混合电路及各种速率系统,并提供了内容丰富的基本库和专业库。本文主要阐述了如何利用SystemView实现脉冲编码调制(PCM)。系统的实现通过模块分层实现,模块主要由PCM 编码模块、PCM译码模块、及逻辑时钟控制信号构成。通过仿真设计电路,分析电路仿真结果,为最终硬件实现提供理论依据。 2、系统介绍 PCM即脉冲编码调制,在通信系统中完成将语音信号数字化功能。PCM的实现主要包括三个步骤完成:抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据CCITT 的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和μ律方式,我国采用了A律方式,由于A律压缩实现复杂,常使用13折线法编码,采用非均匀量化PCM编码示意图见图1。 低通滤波瞬时压缩抽样量化编码 低通滤波瞬时扩张解调解码 信 道再生 话音输入话音输出 图1PCM 原理框图 下面将介绍PCM 编码中抽样、量化及编码的原理:(a)抽样 所谓抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。 (b)量化 从数学上来看,量化就是把一个连续幅度值的无限数集合映射成一个离散幅度值的有限数集合。如图2所示,量化器Q 输出L 个量化值k y ,k=1,2,3,…,L。k y 常称为重建电平或量化电平。当量化器输入信号幅度x 落在k x 与1+k x 之间时,量化器输出电平为k y 。这个量化过程可以表达为:{}1(),1,2,3,,k k k y Q x Q x x x y k L +==<≤== 这里k x 称为分层电平或判决阈值。通常k k k x x -=∆+1称为量化间隔。图2模拟信号的量化 模拟信号的量化分为均匀量化和非均匀量化。由于均匀量化存在的主要缺点是:无论抽样值大小如何,量化噪声的均方根值都固定不变。因此,当信号()m t 较小时,则信号量化噪声功率比也就很小,这样,对于弱信号时的量化信噪比就难以达到给定的要求。通常,把满 模拟入 y x 量化器 量化值 足信噪比要求的输入信号取值范围定义为动态范围,可见,均匀量化时的信号动态范围将受到较大的。为了克服这个缺点,实际中,往往采用非均匀量化。 非均匀量化是根据信号的不同区间来确定量化间隔的。对于信号取值小的区间,其量化间隔v ∆也小;反之,量化间隔就大。它与均匀量化相比,有两个突出的优点。首先,当输入量化器的信号具有非均匀分布的概率密度(实际中常常是这样)时,非均匀量化器的输出端可以得到较高的平均信号量化噪声功率比;其次,非均匀量化时,量化噪声功率的均方根值基本上与信号抽样值成比例。因此量化噪声对大、小信号的影响大致相同,即改善了小信号时的量化信噪比。 实际中,非均匀量化的实际方法通常是将抽样值通过压缩再进行均匀量化。通常使用的压缩器中,大多采用对数式压缩。广泛采用的两种对数压缩律是μ压缩律和A 压缩律。美国采用μ压缩律,我国和欧洲各国均采用A 压缩律,因此,PCM 编码方式采用的也是A 压缩律。 所谓A 压缩律也就是压缩器具有如下特性的压缩律: A X A Ax y 10,ln 1≤ <+= 1 1 , ln 1ln 1<≤++= X A A Ax y A 律压缩特性是连续曲线,A 值不同压缩特性亦不同,在电路上实现 这样的函数规律是相当复杂的。实际中,往往都采用近似于A 律函数规律的13折线(A=87.6)压缩特性。这样,它基本上保持了连续压 缩特性曲线的优点,有便于数字电路的实现本设计中所用到的PCM 编码正是采用这种压缩特性来进行编码的。图3示出了这种压缩特性。表1列出了13折线时的x 值与计算x 值的比较。 表1 y 081 8283848586871x 12816.6016.3014.15179.7193.3198.111 按折线分段时的 x 0128 1 132 116 18 14 12 11 段落1234567 8 斜率16168421 214 1表1中第二行的x 值是根据6.87=A 时计算得到的,第三行的x 值是13折线分段时的值。可见,13折线各段落的分界点与6.87=A 曲线十分逼近,同时x 按2的幂次分割有利于数字化。 (c)编码 所谓编码就是把量化后的信号变换成代码,其相反的过程称为译码。当然,这里的编码和译码与差错控制编码和译码是完全不同的,前者是属于信源编码的范畴。 在现有的编码方法中,若按编码的速度来分,大致可分为两大类:低速编码和高速编码。通信中一般都采用第二类。编码器的种类大体上可以归结为三类:逐次比较型、折叠级联型、混合型。在逐次比较型编码方式中,无论采用几位码,一般均按极性码、段落码、段内码的顺序排列。下面结合13折线的量化来加以说明。 表2段落码 表3段内码段落序号 段落码量化级段内码8 111 1511111411107110 1311011211006101 11101110 1010 401170111 60110 301050101 40100 200130011 20010 100010001 00000 在13折线法中,无论输入信号是正是负,均按8段折线(8个段落)进行编码。若用8位折叠二进制码来表示输入信号的抽样量化值,其中用第一位表示量化值的极性,其余七位(第二位至第八位)则表示抽样量化值的绝对大小。具体的做法是:用第二至第四位表示段落码,它的8种可能状态来分别代表8个段落的起点电平。其它四位表示段内码,它的16种可能状态来分别代表每一段落的16个均匀划分的量化级。这样处理的结果,8个段落被划分成27=128个量化级。段落码和8个段落之间的关系如表2所示;段内码与16个量化级之间的关系见表3。 2.1、PCM编码器模块 PCM编码器模块主要由信号源(图符0)、低通滤波器(图符1)、瞬时压缩器(图符2)、A/D转换器(图符15)实现模型如下图5所示: 图5 信源信号经过PCM编码器低通滤波器(图符1)完成信号频带过滤,由于PCM量化采用非均匀量化,还要使用瞬时压缩器实现A律压缩后再进行均匀量化,A/D转换器(图符15)完成采样及量化,由于A/D转换器的输出是并行数据,必须通过数据选择器(图符10)完成并/串转换成串行数据,最后通过图符(9)输出PCM编码信号。 2.1.1PCM编码器组件功能实现 (1)低通滤波器:为实现信号的语音频率特性,考虑到滤波器在通带和阻带之间的过渡,采用了低通滤波器,而没有设计带通滤波器。为实现信号在300Hz-3400Hz的语音频带内,在这里采用了一个阶数为3阶的切比雪夫滤波器,其具有在通带内等波纹、阻带内单调的特性。 (2)瞬时压缩器:瞬时压缩器(图符15)使用了我国现采用A律压缩,注意在译码时扩张器也应采用A律解压。对比压缩前后时域信号(见图6,图7),明显看到对数压缩时小信号明显放大,而大信号被压缩,从而提高了小信号的信噪比,这样可以使用较少位数的量化满足语音传输的需要。 图6压缩前 图7压缩后 (3)A/D转换器:完成经过瞬时压缩后信号时间及幅度的离散,通常认为语音的频带在300Hz-3400Hz,根据低通采样定理,采样频率应大于信号最高频率两倍以上,在这里A/D的采样频率为8Hz即可满足,均匀量化电平数为256级量化,编码用8bit表示,其中第一位为极性表示,这样产生了kbit/s的语音压缩编码。 2.2、PCM译码器模块 PCM译码器是实现PCM编码的逆系统。PCM译码器模块主要由ADC出来的PCM数据输出端、D/A转换器、瞬时扩张器、低通滤波器构成。实现模型如下图8所示: 2.2.1PCM译码器组件功能实现 (1)D/A转换器(图符16):用来实现与A/D转换相反的过程,实现数字量转化为模拟量,从而达到译码最基本的要求,也就是最起码要有步骤。 (1)瞬时扩张器(图符3):实现与瞬时压缩器相反的功能,由于采用A律压缩,扩张也必须采用A律瞬时扩张器。 (2)低通滤波器(图符4):由于采样脉冲不可能是理想冲激函数会引入孔径失真,量化时也会带来量化噪声,及信号再生时引入的定时抖动失真,需要对再生信号进行幅度及相位的补偿,同时滤除高频分量,在这里使用与编码模块中相同的低通滤波器。 3、系统仿真模型如下图9: 图9系统模型以上图9各方块的有关参数如表4: 表4 符号名称参数设置 Logic:ADC Gate Delay=0sec Threshold=500e-3v True Output=1v False Output=0v No.Bits=8 Min Input=-1.28v Max Input=1.27v Rise Time=0sec Logic:DAC Gate Delay=0sec Threshold=500e-3v No.Bits=8 Min Output=-1.28v Max Output=1.27v Max Rate=100HZ Operator:Linear Sys Butterworth Lowpass IIR Fc=10HZ Comm:DeCompand Max Input=1 Comm:Compander Max Input=1 Source:Pulse Train Amp=1v Pulsew=5e-3sec Freq=50HZ Phase=0deg Source:Pulse Train Std Dev=30e-3v Mean=0v 4、仿真波形如下: (1)信号源的波形(2)信号源经压缩后的波形 (3)PCM编码的波形 (4)PCM解码的波形 (5)PCM译码时经过D/A转化并用A律扩张后的输出波形 (6)译码后恢复源信号的输出波形 由以上数据波形可以看出在PCM编码的过程中,译码输出的波形具 有一定的延迟现象,其波形基本上不失真的在接收端得到恢复,传输 的过程中实现了数字化的传输过程。 5、参考文献 [1]吴伟陵,续大我,庞沁华.通信原理.北京邮电大学出版社,2005 [2]青松,程岱松,武建华.数字通信系统的SystemView仿真与分析.北京航空航天大学出版社,2001 [3]曹志刚,钱亚生.现代通信原理.清华大学出版社,1992 [4]苗长云等主编.现代通信原理及应用.电子工业出版社,2005 [5]罗卫兵/孙桦/张捷.SystemView动态系统分析及通信系统仿真设计.西安电 子科技大学出版社,20016、设计过程中需解决的问题 (1)首先,必须根据实际情况合理的设计采样频率和抽样脉冲的参数,以防波形的失真,由于在刚开始的时候,没有合理设置采样频率的参数,出现了在译码时恢复波形的失真,最后根据采样频率fs大于等于2fH条件,通过不断调试,最终可以合理地恢复源信号波形。但由于在信道传输过程中由于各种原因而引起译码波形有一定的延时现象。(2)在调试带使能端的8路数据选择器在实现PCM编码输出的并行数据转换为串行数据输出时,起初由于没有合理应用选择控制端,而导致数据输出毫无规律,即八路数据当中随机地从哪一路输出,最后通过设置频率不同的三路脉冲方波作用于选择控制端,去控制每一路的数据输出,然后经过调试完成了PCM编码的正确输出。 (3)在设计滤波器时,首先要看系统信号源输出信号频率到底是处于在哪个频率范围,再根据其他参考参数和系统各项技术要求,决定是要设计哪种类型的滤波器,是低通型还是带通型滤波器。 7、心得体会 本周我们用软件仿真来实现PCM的编码过程。由刚开始的不知道怎样使用仿真软件到后来的学会使用,但是在学会的同时也知道自己在理论知识方面的欠缺和不足,通过这次设计,掌握了PCM编码的工作原理及PCM系统的工作过程,学会了使用仿真软件SystemView (通信系统的动态仿真软件),并学会通过应用软件仿真来实现各种通信系统的设计,对以后的学习和工作都起到了一定的作用,加强了动手能力和学业技能。总体来说,这次实习我受益匪浅。在摸索该如何设计电路使之实现所需功能的过程中,特别有趣,培养了我的设计思维,增加了实际操作能力。在让我体会到了设计电路的艰辛的同时,更加要使我的动手能力和动脑能力有待加强联系。我相信我通过这次的实习使我的各个方面都得到了提高。下载本文