Python拆解深入分析FM广播非实信号(中华VtlSdr)

如果你有一块支持RTLSDR的电视棒,那么你就可以借助pyrtlsdr做很多有趣的事情。基本上每个城市都有大功率的FM电台,而且FM方式调制的信号解码器来也非常容易。简便起见,我们从FM信号开始。

威尼斯官方网站 1

RtlSDR信号读取

安装好了之后,启动python。这里,我用的是python 3.3.5。

from rtlsdr import RtlSdr
sdr = RtlSdr()
# configure device
sdr.sample_rate = 2.048e6  # Hz
sdr.center_freq = 70e6    # Hz
sdr.freq_correction = 60  # PPM
sdr.gain = 'auto'
print(sdr.read_samples(512))

代码中的sample_rate采样频率指的是从USB设备获取采样值的频率,2.048e6即每秒获取2.048M个采样;center_freq中心频率为所采集信号的中心频率。例如,如果当地有一个电台的广播频率是106.8MHz,那么这里的center_freq中心频率即可设置为106.8MHz来获取这个频率的信号;freq_correction频率校正,由于原件的出厂参数不可能完全一致,而且设备的使用环境温度湿度等都有可能对设备器件参数造成影响,所以有时候我们需要在软件层面对设备的参数误差做一些校正。不过如果只是听一下收音机的话,对精度没有那么高的要求,这个参数值可以不考虑;gain增益(单位dB),电视棒设备有可调节的放大器,调节gain增益项可以把增益调节到一个合适的值,没有特别要求的话,可以填写'auto'让设备自行决定。
  如果软硬件都安装正确,控制台下将会打印一个长度为512,由复数构成的列表。为什么用复数来表示,可以看这篇知乎答案:复数的物理意义是什么?简而言之就是,复数表示不仅能表达当前采样点的信号强度,也能表示当前采样点的相位信息。而本文的解析方式,就是使用了采样点的相位信息作计算。

0 引 言
实弹射击训练的报靶方式由人工改为自动方式,自电子技术应用以来,一直都是军警相关部门的研究课题。自动报靶装置的优点和预期效益是不言而喻的。目前的各种自动报靶产品还不能令人满意,如何实时、精准地获得子弹穿过靶面时的位置信息是其关键技术,其中以坐标点位置(X,Y)信息最为理想。现在半导体激光技术做到光束直径3
mm以下的器件已是非常普遍,一对这样的激光收发器十分便宜,用200多对构成50
cm50
cm的激光束矩阵靶面并不昂贵。成熟的集成电路、计算机和通信等技术的应用,更能为各种实弹射击训练模式提供即时快捷、直观以及智能化控制的自动报靶系统。

FM信号的解码

读取到的每个采样点都包含了两个信息,一是采样点的幅值,二是采样点的相位。前者可以对采样值取模计算即可得到,后者可以使用反三角函数计算。
  和AM调制使用了信号的幅值来传递信息不同,FM信号使用信号的相位来传递信息有一个明显的好处就是,只要信号还可以识别,那么不同强度下解析出来的信号是完全一致的。信号强度不同的FM电台不会有音量的差别,而AM电台的收音音量则与原始信号的强度有直接关系。
  调频顾名思义,就是频率随原始信号变化的调制方式,解析出原始信号的途径就是计算出采样点的频率。而相邻两个采样点的相位差既是当时的瞬时频率。这一部分的详细说明可以参考这两篇文章:阅读librtlsdr中的rtl_威尼斯官方网站,fm程序与FM解调方法。
  我们程序中的解析分三步:

  • 求差
  • 求取幅角
  • 下采样
      经过这三个步骤,信号已经转换成了音频信号,只需要再对值域进行一下转换,即可一直送给声卡进行播放。代码如下:

delta = samples[0:-1] * samples[1:].conj()  # 求差
angs = np.angle(delta)    # 求取幅角
nd = signal.decimate(angs, 21, ftype="fir")  # 下采样,fir滤波器
nd *= 10000  # 转换值域
snd_samp = nd.astype(np.dtype('<i2')).tostring()  # 转换为可交给pyaudio的格式

以下为测试时使用的完整程序:

import threading
import queue
import pyaudio
from scipy import signal
from pylab import *
from rtlsdr import *


class th(threading.Thread):
    def __init__(self, func):
        super(th, self).__init__()
        self.func = func

    def run(self):
        self.func()


def cb(samples, rtlobj):
    global q
    q.put(samples)


def sound():
    global qs
    global s
    while True:
        nd = qs.get()
        s.write(nd)


def defm():
    global q
    global s
    while True:
        samples = q.get()
        delta = samples[0:-1] * samples[1:].conj()
        angs = np.angle(delta)
        nd = signal.decimate(angs, 21, ftype="fir")
        #nd = angs[0::21]
        nd *= 10000
        qs.put(nd.astype(np.dtype('<i2')).tostring())

sdr = RtlSdr()

sdr.sample_rate = 1.024e6
sdr.center_freq = 98e6
sdr.gain = 4

p = pyaudio.PyAudio()
s = p.open(format=p.get_format_from_width(2), channels=1, rate=48000, output=True)
q = queue.Queue()
qs = queue.Queue()
t1 = th(defm)
t1.start()
t = th(sound)
t.start()
sdr.read_samples_async(cb, 1024*500)

l 系统工作原理1.1 系统框图
红外线矩阵坐标式自动报靶装置由报靶系统和显示系统组成,系统方框图如图1所示。

在报靶系统中,矩阵式坐标靶实现了弹着点的坐标定位。坐标传感器输出对应于弹着点位置的电压信号,微控制器完成对坐标信号的采样、保持、A/D转换,并计算出实际弹着点的X-Y坐标值,最后由TRF6900芯片无线发射到一定距离以外的接收端。
在显示系统中,对接收到的无线载波信号经过解调处理存储,在微控制器的控制下,在点阵式液晶显示屏呈现胸环靶图案并标出弹着点的位置。显示部分亦可由便携式个人计算机完成,处理功能更多,使系统更加完善。1.2
TRF6900芯片介绍
本装置无线收发采用射频无线,收发芯片TRF6900,该芯片是TI公司最新推出的单片无线收发一体芯片,它在一个器件上包括了高频发射、高频接收、PLL合成、FSK调制解调、FM调制解调、直接数字频率合成(DDS)、接收信号强度指示(RSSI)等多种功能。
TRF6900使用ISM频段,无需申请,而且采用低发射功率和高接收灵敏度,设备之间干扰小,可广泛应用于无线数据采集系统、无线监控系统、智能卡、设备遥控场合,应用前景十分广阔。
TRF6900主要性能如下: (1)工作频率为868~870 MHz(西欧)/902~928
MHz(北美); (2)有效数据传输距离为1 000 m; (3)典型输出功率为4.5 dBm;
(4)典型输出信号频差为230 Hz; (5)工作电压为2.2~3.6 V;
(6)待机电流为5A,工作电流为50 mA; (7)内置2个可编程模式。
TRF6900内部结构如图2所示。

TRF6900内部电路可分为发射模块和接收模块。接收模块包括低噪音放大器、混频器、中放、FM/FSK解调器、接收信号强度指示和低通滤波放大器等几部分。发射模块包括串行控制接口、直接数字频率生成器、压控振荡器、锁相环等几部分。1.3
TRF6900工作原理1.3.1 接收机工作原理 从天线接收到信号由LNA
IN引入TRF6900,首先经过低噪音放大器。低噪音放大器可提供13
dB的增益。低噪音放大器有正常模式和低增益模式两种模式。当TRF6900接收的信号较强时,应该选择低增益模式,这样可以最大程度地减少信号非线性失真。放大后的信号被送入混频器,混频器将信号变频到中频,再通过第一和第二级中频放大。第一级中频放大可获得7
dB的增益,用以补偿滤波器带来的损耗;第二级中频放大包括多个放大器,总共可获得80
dB的增益。经过两级放大后的信号,如果采用的是FM/FSK调制方式就被送入FM/FSK解调器,解调出数据信号从DATA
OUT引出。如果是频移键控(ASK)或开关键控(OOK)则送入接收信号强度指示器(RSSI)解调,解调后的基带数据由RSSIOUT输出。1.3.2
发射机工作原理 数字基带信号从TX
DATA引入TRF6900片内,经过直接数字频率合成器(DDS)调制到中频,再通过锁相环(PLL)倍频到射频,最后通过功率放大器放大信号后,由PA
OUT导出射频信号,通过天线发射出去。1.3.3 串行控制接口工作原理
串行控制接口包括CLOCK,DATA,STOBE三部分,控制着TRF6900内部所有的寄存器,包括DDS参数设定寄存器和其他的控制寄存器。在CLOCK的每一个上升沿,DATA管脚的逻辑值送入24-bit的移位寄存器,当STOBE电平被抬高时,设定的参数被送入选定的锁存器。
TRF6900有4个可编程的24 b控制字(A,B,C,D);
控制字A和B分别控制DDS模式0和模式1状态下输出信号频率。
控制字C负责锁相环和DDS模式O的设定。
空制数据控制字D负责调制和DDS模式1的设定。1.3.4
直接数字频率合成器(DDS)的工作原理
直接数字频率合成器是基于数字域,直接产生相应频率的正弦波。它具有频率范围宽,频率分辨率高,可用软件方便地控制输出频率、频率切换速度快且切换频率时相位保持连续等优点,从而在线性调频、扩频和跳频系统、多普勒响应模拟等领域得到了广泛应用。但DDS由于受参考频率的限制,输出频率通常较低,一般为100~400
MHz,而这一频段的频率资源相当紧张。如果直接采用DDS产生射频信号,将会对DDS的实际应用造成很大限制。所以在实际应用中往往是采用DDS/PLL混合方式,该方法将DDS输出的中频信号作为PLL倍频器的参考频率,利用PLL将信号变换到所需的频率。这种方式既保留了DDS的频率分辨率高和频率切换速度快的特性,又弥补了DDS输出频率较低的不足,从而得到广泛的应用。TRF6900也是采用DDS/PLL这种方式。
TRF6900的直接数字频率合成器包括一个24
b的相位累加器.相位码一幅度码转换表,ll
b的数字一模拟转换(DAc)和低通滤波器(LPF)。相位累加器在时钟的触发下,对频率控制字进行累加,相位累加器输出的相位序列作为地址来寻址正弦检索表,得到正弦波的离散幅度数字即抽样数字信号。DAC再将抽样的数字信号恢复为模拟信号,最后通过一个低通滤波滤得到基波分量。
24 b的累加器可通过TRF6900内部的两个22
b的控制寄存器控制。DDS结构如图3所示。

如图4所示,控制字A和控制字B的高两位为0,因此最大的比特权重为1/8。

式中:DDS_x为控制字A或B的值。参考频率fref就是DDS的取样频率,它从根本上决定着DDS的输出频率和频偏。TRF6900采用的参考频率为15~26
MHz。由上式可得,DDs的最大输出频率为90~156 MHz,最小频偏为21~37 Hz。
TRF6900的控制字A确定模式0对应的频率,控制字B确定模式1所对应的频率,DDS可以在模式0和模式1之间快速切换,从而可以实现输出频率由一个频率跳变到另一个频率,而这一切都由软件实现。所以只需给控制字A和控制字B赋相应的值,并在两个模式之间进行切换就可以实现跳频。TRF6900最高可达1
360跳/s,每一跳最多可携带22 b数据,因此,TRF6900的最大数据传输速率为30
Kb/s。TRF6900采用跳频的调制方式,极大地增加了通信的抗干扰能力。这一特点为在恶劣环境下进行数据传输,保证传输质量提供了很大的保障。
TRF6900可以选择传统的FSK调制,方便了与现有设备进行通信。TRF6900由控制字C在DDS和FSK之间选择。当TRF6900选择FSK调制时,空号与传号的输出频率完全由控制字D确定,可以用软件方便地进行设置。如图5所示。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章