实验三 连续可变斜率增量调制的实现
一、 实验目的
1、 熟悉Ubuntu操作系统的使用。 2、 熟悉gnuradio_companion的使用。 3、 熟悉CVSD数字调制的基本原理,并通过gnuradio实验平台实现CVSD数字调制及解调。
二、 实验原理
本例是一个GNU Radio的关于三角波信源的连续可变斜率增量调制的例子。它由一个Triangle 波形源,经过采样流控制得到稳定的采样速率,然后由VCO(压控振荡器) 控制产生一个周期性的频谱并显示频谱和波形。以此频谱用CVSD 的调制方式显示其频谱和波形,最后CVSD 解调后还原其频谱显示出来波形,并向 PC输出声音信号,(此信号由频谱控制,当然也可以说是由三角波信源的采样率控制) 。
CVSD在数字语音通信领域是一种降低带宽的声音编码方法。它充分利用数字语音相邻采样的相关性,只对连续采样的幅度差进行量化。由于幅度差的量化电平相较于其它量化方法小得多,从而减少了信号带宽。CVSD采用二进制量化和自适应算法实现连续步长调整,且其编码器能够在大幅度信号里精确地表示小幅度信号并且不影响其性能,这在一些无自适应功能的编码器里是不能实现的。
CVSD编码器可以有效地实现8/1的压缩率,每一个输入的语音采样和内部的参考值比较,如果大于参考值,则编码器输出1,否则输出0,参考值随着输出比特流的频率实时改变,所以每8个采样值将会产生一个字节的输出。
本例中需调用20个模块,新出现的有:VCO压控振荡器,通过输入的信号的幅度控制输出信号的频率,产生振荡输出。CVSD Encoder语音数字编码,对输入的信号进行编码后产生short类型比特流的输出。CVSD Decoder语音数字解码,编码的反过程。Packed to Unpacked 将比特流转换为short型数据,Char to Float数据类型转换, char型转换成float型。WX GUI FFT Sink可是查看信号的频谱。
三、 实验设备
需要安装过Ubuntu 系统和GNU Radio的PC机
四、 实验步骤
1、 开启一个终端输入命令
sudognuradio-companion
2、 从开启界面右边的库中添加并连接必要的block 如图cvsd_Figure1 所示。
3、 匹配每个 block 的数据类型,参考图 1 。(注意所有的模块需要根据图cvsd_Figure1所
示按颜色指示修改其数据类型。int为浅绿色,short为黄色,complex为蓝色,float 为橙色,紫红色为调制后数据char型)
4、 单击标签上的\在合适的模块间进行连线。
5、 如图 cvsd_Figure1 设置每个模块属性(注意属性value 值设置为带有m
的,为小数,比如5m 就是0.005,200m 就是0.2) 。 其中不能直接设置的属性如下列出:
a) 在两个 Signal Source 模块中的Sample Rate 属性设置为audio_rate
b) 在Audio Sink模块中的Sample Rate属性设置为audio_rate, Device Name属性设
置为plughw:0,0
c) 在Throttle 模块中的 Sample Rate 属性设置为audio_rate
d) 在CVSD Encoder ,CVSD Decoder 模块中的 Resample 属性设置为
resample,Frac.Bandwidth属性设置为bw。
e) 在VCO模块中的Sample Rate属性设置为audio_rat,Sensitivity属性设置为
audio_rate*2*math.pi。
f) 在两个Import 模块中的Import 属性设置为 import math。
g) 在 VCO、CVSD Decoder 之后引出来的四个 Sink模块中的Sample Rate属性设
置为audio_rate
h) 在Char To Float 之后引出来的两个Sink模块中的Sample Rate属性设置为
audio_rate*resample,其中WX GUI Scope Sink 模块的 T Scale属性设置为20.0/(audio_rate*resample)。
i) 在WX GUI Notebook 模块的 Labels 属性设置为
['Original','Encoded','Decoded'] 。
6、 按键F5 来编译程序,或者单击图标。如果有错误双击检查所有连接模块的属性、数据
类型。
7、 按键 F6 来执行程序,或者单击图标。记录执行结果界面。
图 1 最终框图
注:可能出现的错误:找不到cvsd_encode包
解决办法:到源文件的目录下,找到cvsd_block.py文件打开,在import后面加上一个vocoder,找到blks2_cvsd_encode_0与blks2_cvsd_decode_0的定义,把后面的blks2该成vocoder,再开启一个终端,进入该目录下,运行python cvsd_block.py即可