无线电基础一
目标:来创建一个软件无线电 用来接收FM电台的信号
硬件:HackRF One
GUN radio是一个软件框架 我们用它来创建C++和Python程序
使用GUN radio 他可以自动生成Python代码,这些代码就是SDR的代码
(在后续的学习中你可以完成一些不需要硬件的学习,但是有不少的学习还是需要用到SDR设备,所以还是推荐你购买HackRF 或者其他设备 每个设备功能不同 有些只能完成部分练习 但是hackrf 可以完成所有练习)
首先 创建Osmocom Source
Osmocom Source 是一个抽象的模块 让我们能够与各种无线电设备通信
而且作为一个来源Source说吗它生成的数据将会被后面的模块进行处理
这个模块实际的工作方式是同志hackrf工作 与接收模式
采样获得的数据流从hackrf中流出通过USB接口流入后面的模块
Variable-Value e6就是百万 e3就是千 等等
Osmocom Source 100e6也就是100MHz 在FM频率范围中 但我要改为正中间 也就是97.9e6
我们这里要把RF Gain改为0 意思就是把天线旁边的前端放大器关闭 我们一般不需要它 除非需要接受微小信号 (FM广播一般信号比较强 除非你在远地区)
这两个Gain的值我们可以用默认的 将来可能会改
FFT Sink里也有需要改的 打开属性后开启Averaging(平均化)
这样就能在FFT图中简单地观察到每一个FM广播台了
这样我们就拥有了完整的流图 它不会直接播放声音 但是它可以让我们可以运行流图 观看信号 了解大概 并且校验我们迄今为止做的对不对
保持lesson1 你可以看到有grc 说明他是gunradio文件
这是gunradio创建的一种文件 这个文件描述了流图 它列举了不同的模块 它们的设置和连接 这是gunradio创建的文件 一旦点击保存还会在生成一个python文件,真正运行的是这个Python文件
您暂时可以把0MHz理解为中心频率即97.9MHz
使用gunradio的 kill the flow graph 关闭这样能让他回归初始
我要在FFT Sink里调节基带信号 把它从0改为97.9MHz
我们可以在这里(Baseband Freq)改为97.9M 但是我认为用一个变量表示会更加好
填上center_freq
可以看到变红了,因为在外面没有这个变量,所以我们要创建一个命名为center_freq
在模块中找到Variables-Variable设置,(并且将另一个Ch0:frequency(hz)也修改为下图一样的)
现在我们要让它播放声音 我将用Math Operator 然后找到Multiply 它的作用是点对点乘法
它把一个数字信号*另一个信号
每条线都从另一个模块出来进入下一个 这就是数字信号
数字信号其实就是一串数字 从一个模块流入另一个
现在我们要产生一个信号
在waveform Generator 找到Signal Source
这是一个CPU生成的信号 与hackrf生成的信号相乘
复制出了一个Varlable ID改为channel_freq ,Value 为96.5e6
你可以发现我这里用了多变量表达式,任何Python表达式都支持
GRC在帮我们生成Python代码 所以只要Python语法支持 我们都可以写在参数里
现在我们要将信号转为音频了
找到Filters-low pass filter 因为我要的是0Hz附近的信号
我在把Multiply模块的输出连接到Low pass Filter的输入
进入设置这两个
我还要做Decimation(降低采样率)
降低多少配属取决于我的信号的带宽
显然我们现在的带宽太大了 同时采样了多个广播
同样复制出一个Variable
Decimation用来减少采样率 所以我们这里填入原来高的采样率和目标低采样率的比值
这个比值刚好是Decimation
所以这里就是samp_rate/channel_width(10M/200K)
如果此时你点击OK 就会出现错误 这个错误原因不明显
因为这个模块只能对整数就行Decimation
我目前给出的浮点数 但是我加上int()可转换为整数
具体发生的事情是
我们会把10M每秒的采样率放入LP filter
它会把采样率降低50陪 输出200K每秒的采样点
filter以后我要用一个Rational Resampler 【CTRL+F 自己搜下】LOw pass Filter连接Rational resampler
我这样做原因是12/5不是整数,而LPfilter里只能是整数 但是我现在必须要用非整数来更改采样率
现在我们要用到的是流图核心模块 FM解调器(WBFM Receive)
它把FM无线电信号(复数基带信号)转为实数音频信号
Rational Resampler连接WBFM Receive
接下来我要做一点设置 WBFM代表宽带调配 这是FM广播的调制方式
可以看到它只需要两个参数
其中一个是Quadrature Rate: 需要填入的采样率 应该是480K
Audio Decimation是这个模块要进一步降低采样率的陪数
如果你算一下会发现大多数模块采样率是10M每秒
进入LP Filter以后采样率变成10M/50=200K
然后200k * 12/5 = 480k
480k/10=48k
我们最终要输出48k每秒的数据给声卡 对于声卡来说很常见
在Audio里找到Audio_Sink 并且连接起来
弄到这里大多数地方都是正常的 只有sampl_rate 要改成48k
某种程度上来说 这个流图很复杂 因为有各种采样率
在一个流图里一共有四种采样率
现在我们只需要禁用掉一个FFT Sigk 因为我只需要一个模块来查看信号
如果你听不到 我们可以调整音量 我们只需要对Audio Sink入口的信号乘一个量来实现
这次不是乘另一个信号 我要使用Multiply Const 直接拖出来用
我们调整一下位置
你会发现有个错误 蓝色和橘色对不上 我们可以到属性里把类型改为float
如果你还想做到 实时更改音量这还不够 还需要Gui Widgets-WX-Gui Slider
重命名为audio_gain
我们把默认值设为1 意味着没有变化
最大最小值是0和10
然后点击 Multiply Const 进入设置吧Constant= 0 改为audio_gain
现在就能边听音乐边调音量了
如下完整流图