Funpack第五期-使用ADI PLUTO实现FM播放器
funpack第五期活动, 使用plutosdr实现fm收音机功能, 学习无线电信号处理流程
标签
Funpack第五期
ADI PLUTO
fm收音机
plutosdr收音机
james
更新2021-04-01
1297

1 实现功能介绍

这回根据硬禾的要求, 实现了FM收音机的功能. 使用soapysdr驱动 plutosdr, 使用radio-core进行解调, 使用pyqt5实现界面. 同时学 习了gnuradio的使用, 利用gnuradio companion根据设计的 flowchart生成了python控制代码. 收音机能够收听fm广播, 能够调 节音量, 能够切换调频电台.

主要代码片段:

1. 从sdr设备获取频率信号滤波后解调.
def run(self):
    print("[DEMOD] Starting.")

    self.running = True
    self.safed = False

    buff = np.zeros([self.dsp_buff], dtype=np.complex64)
    self.soapy.start()

    with self.sd.OutputStream(blocksize=self.dsp_out - 1, callback=self.router,
                              samplerate=self.afs, channels=2):
        while self.running:
            count = 0
            while count < self.dsp_buff:
                count += self.soapy.read([buff[count:]], self.sdr_buff)
            self.que.put(buff.astype(np.complex64))

    with self.que.mutex:
        self.que.queue.clear()

    self.soapy.stop()
    self.safed = True

def router(self, outdata, f, t, s):
    if self.que.qsize() < 1:
        time.sleep(0.1)

    try:
        inp = self.que.get(timeout=0.5)
    except queue.Empty:
        raise self.sd.CallbackAbort
    finally:
        if not self.running:
            raise self.sd.CallbackAbort

    if self.mode == 0:
        L, R = self.wbfm.run(self.dec.run(inp))

        if self.wbfm.freq >= 19010 and self.wbfm.freq <= 18990:
            R = L

        mydstack = np.dstack((R, L))
        outdata[:] = ( mydstack * self.vol)

   if self.mode == 1:
        LR = np.zeros((self.dsp_out*2), dtype=np.float32)
        outdata[:] = LR.reshape(self.dsp_out, 2)
2. 实现界面
class MainWindow(QMainWindow):

    def __init__(self, appctxt):
        super(MainWindow, self).__init__()
        ...
        uic.loadUi(self.appctxt.get_resource('mainwindow.ui'), self)
        ...

    def handlePower(self):
        if not self.handleDevice():
            return
        if self.running:
            ...
            self.demod.stop()
        else:
            ...
            self.demod.start(QThread.TimeCriticalPriority)
            ...

        self.running = not self.running

2 心得体会和建议
  1. plutosdr文档完善, 开发友好, 代码齐全, 技术开放是入门sdr之 好物.
  2. gnuradio安装方便, 使用简单, 开源免费, 支持广泛是入门sdr之 佳品
  3. 本人发现funpack活动中善用python和github两大利器, 总能够开 阔视野, 化繁为简.
  4. sdr算是刚刚入门, 后面会继续充分利用plutosdr进一步学习.
3 Code

https://github.com/picospuch/eetree-funpack-workshop/tree/phase-five

新年快乐, 祝funpack活动越办越好.

团队介绍
james
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号