0. 背景介绍

增强管道数据流转(EPDR, Enhanced Pipeine Data Routing)是彩鹰工作室提出的多进程合作架构。此架构通过各个进程的标准输入输出管道(stdio)吞吐数据,平台按照生产消费关系进行流转,联合多个子进程实现数据合作处理。EPDR主要的特点是低耦合性,特别适用于小规模工坊的跨语言、跨编译器合作开发。

taskBus 开源软件无线电平台将此架构运用于SDR领域。非计算机专业的工程师受惠于此平台,可迅速整合每个人最熟悉的开发语言、开发环境,让不同知识背景、教育层次的工程师共同完成实时波形处理软件。

在SDR软件开发中,水位控制是保证硬件及时获取数据,并防止数据堆积的有效手段。本文章基于taskBus平台,演示带水位控制的FM音乐电台的搭建技术,直接播放MP3文件到空中频率,主要流程如下:

#mermaid-svg-cmYnA44uzfZP8Io0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .error-icon{fill:#552222;}#mermaid-svg-cmYnA44uzfZP8Io0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cmYnA44uzfZP8Io0 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-cmYnA44uzfZP8Io0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cmYnA44uzfZP8Io0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cmYnA44uzfZP8Io0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cmYnA44uzfZP8Io0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cmYnA44uzfZP8Io0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cmYnA44uzfZP8Io0 .marker.cross{stroke:#333333;}#mermaid-svg-cmYnA44uzfZP8Io0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cmYnA44uzfZP8Io0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .cluster-label text{fill:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .cluster-label span{color:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .label text,#mermaid-svg-cmYnA44uzfZP8Io0 span{fill:#333;color:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .node rect,#mermaid-svg-cmYnA44uzfZP8Io0 .node circle,#mermaid-svg-cmYnA44uzfZP8Io0 .node ellipse,#mermaid-svg-cmYnA44uzfZP8Io0 .node polygon,#mermaid-svg-cmYnA44uzfZP8Io0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cmYnA44uzfZP8Io0 .node .label{text-align:center;}#mermaid-svg-cmYnA44uzfZP8Io0 .node.clickable{cursor:pointer;}#mermaid-svg-cmYnA44uzfZP8Io0 .arrowheadPath{fill:#333333;}#mermaid-svg-cmYnA44uzfZP8Io0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cmYnA44uzfZP8Io0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cmYnA44uzfZP8Io0 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-cmYnA44uzfZP8Io0 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-cmYnA44uzfZP8Io0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cmYnA44uzfZP8Io0 .cluster text{fill:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 .cluster span{color:#333;}#mermaid-svg-cmYnA44uzfZP8Io0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cmYnA44uzfZP8Io0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

Mp3文件夹
Lame.exe在线解码
FM调制
UHD发射

1. 水位反馈控制

对于含有实时硬件系统的波形生成设备来说,硬件逻辑的优先级总是高于软件逻辑。如一个把MP3音乐变成调频广播的简单播放机,可存在4个模块。

  1. 文件读取模块:负责从音乐文件夹读取MP3数据,是系统里的生产者。
  2. lame解码模块:直接使用开源MP3解码器LAME.exe实现stdio管道解码。
  3. FM调制模块:负责把 lame.exe 音乐的振幅调制为FM的频率变化。
  4. SDR发射机。如USRP B210,负责把基带波形搬移到射频并发射出去,是最终消费者。

此时,为了保持音乐的连续性,需要注意几个问题:

  1. 无法确切控制mp3解码的节奏。Lame.exe解码速度很快,大大超过FM的自然速率。
  2. 如果上位机送入音乐的速度高于SDR发射机消费音乐的速度,则会出现数据堆积。
  3. 如果上位机送入音乐的速度低于SDR发射机消费音乐的速度,则会出现数据中断。

由于生产者和消费者的时钟不统一,而消费者是硬件,不好调整节奏,因此需要引入一种反馈机制,让生产者通过软件适时调整输出的速率,让消费者的缓存处于健康的状态(40-60%充盈率)。

这相当于生产者往一个水箱里注水,消费者在用水。生产者生产速度大于消费速度,但无法精确保持一致。此时,通过反馈水位给注水者,通知其调整进水的速率,使得水箱始终有水,又不至于溢出。


对应到SDR软件中,关键在于负责Tx(发射)的代码要不断地输出当前发射缓存中的水位,如下图所示:

2. taskBus UHD 模块的水位实现

水位就是一个整数,用来指示当前环状缓存器还有多少样点节的数据尚未发射出去。

2.1 消费者水位播报

在 taskBus 的UHD模块里,设置一个 waterMark 专题(topic/Subject),用于汇报水位。其核心逻辑如下:

 //初始化环状缓存器const quint64 sz_buffer_all = 128 * 1024 * 1024;std::vector<SPTYPE> buf_tx_array(sz_buffer_all,0);//In IQ Samples, RF ioquint64 tx_pos = 0, stdin_pos = 0;//...qint64 watM = stdin_pos[0] - tx_pos;                         TASKBUS::push_subject(i_txWaterMark,instance,sizeof(qint64),(unsigned char *) &watM);

通过不断向stdout输出当前的缓存状态,可以让生产者及时知道缓存的盈亏。

2.2 生产者水位控制

在生产者(这里是文件读取器)里,检查当前水位是不是充盈,如果充盈,则降速或者停止生产:

int i_watermark =0;
std::atomic<long long> g_watermark (0);
//刷新水位
while (false==bfinished){subject_package_header header;std::vector<unsigned char> packagedta = pull_subject(&header);if (header.subject_id==i_watermark){            long long * ptr = (long long *)packagedta.data();g_watermark = *ptr;}
}
//......//水位控制if (minmark > 0 && i_watermark > 0){while(g_watermark > minmark){QThread::msleep(20);}}

3. 范例工程搭建

3.1 下载 lame.exe

去网上下载mp3解码器 lame.exe,放在当前文件夹。这个解码器可以直接接受 stdin的输入,并输出到 stdout (这简直就是为了管道应用而设计的!优雅!)。其参数:

C:\> lame.exe --decode   --flush -S --mp3input  - -

解释:

LAME 32bits version 3.98.4 (http://www.mp3dev.org/)usage: f:\lame.exe [options] <infile> [outfile]<infile> and/or <outfile> can be "-", which means stdin/stdout.--flush         flush output stream as soon as possible-S              don't print progress report, VBR histograms--decode        input=mp3 file, output=wav--mp3input      input file is a MPEG Layer III file

该工具通过封装器模块直接引入工程。封装器模块使得所有支持stdio的程序都可以直接放进来用。

注意:如果运行时没有声音,而弹出了配置栏,那很可能是lame.exe路径不对。

3.2 设置文件源,并连接反馈

设置文件源 source_files, 监视音乐文件夹,文件类型mp3,生产速率每秒50次,每次10000字节。这个生产速率高于绝大多数Mp3文件的速率。同时,设置关键水位门限为1MB。当水位小于1MB时,会触发生产。注意,这个1MB是解码后的WAV的大小,并不是mp3的大小。


注意,这种反馈是级联的反馈,源头生产者生产的数据,经过2层处理后,才给消费者。

4. 执行效果

我们把文件夹中放入mp3文件,就可以直接用收音机收听了!整个过程稳定、连续。


相关源码参考代码仓库。

DIY调频(FM) MP3电台-基于增强管道数据流转(EPDR)的taskBus实时水位控制技术相关推荐

  1. 十分钟快速DIY简易FM电台和收音机

    十分钟快速DIY简易FM电台和收音机 FM简介 实现功能 使用前准备 器件连接 频率调节 广播音乐 无线话筒 总结 原文链接:https://www.yourcee.com/newsinfo/2923 ...

  2. matlab调频调幅立体声接收机,基于simulink调幅调频发射接收机的设计.doc

    基于simulink调幅调频发射接收机的设计 基于Simulink的调幅调频发射接收机的设计 1 引言 大家知道,无线电广播是依靠空间的高频电磁波来传播节目的.电磁波的频率(Hz).波长(m)和传播速 ...

  3. 用于半监督语义分割的基于掩码的数据增强

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白导读 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家 ...

  4. 效果好,速度快!大连海事大学提出基于增强多任务学习的单图像去雨算法MENET...

    Multi-Task Learning Enhanced Single Image De-Raining 基于增强的多任务学习的单图像去雨 作者单位:大连海事大学 本文使用多任务学习改进图像去雨,使用 ...

  5. 基于图像的数据增强方法发展现状综述

    基于图像的数据增强方法发展现状综述 人工智能技术与咨询 2022-03-22 20:57 点击蓝字 · 关注我们 来源:< 计算机科学与应用> ,作者冯晓硕等 关键词: 数据增强:图像数据 ...

  6. 【论文速递】ISPRS2018 :基于增强极线几何约束以及自适应窗最小二乘匹配方法的立体SAR山区DSM

    [论文速递]ISPRS2018 :基于增强极线几何约束以及自适应窗最小二乘匹配方法的立体SAR山区DSM [论文原文]:Radargrammetric DSM generation in mounta ...

  7. 【自然语言处理】【数据增强】PromDA:应用于低资源NLU任务的、基于prompt的数据增强方法

    PromDA:应用于低资源NLU任务的.基于Prompt的数据增强方法 原始论文地址:2202.12499] PromDA: Prompt-based Data Augmentation for Lo ...

  8. 【毕业设计/Matlab项目】调幅AM/调频FM/DPSK/FSK的调制解调matlab界面

    Date: 2022.5.22 文章目录 前言 1.仿真效果图 1.1.调幅AM 1.2.调频FM 1.3.2FSK 1.4.DPSK 2.核心matlab代码 前言 在大学毕业设计的时候,课题要求实 ...

  9. 独家 | Michael I.Jordan:大数据时代下的安全实时决策堆栈与增强学习(视频+精华笔记)

    金秋九月,2017国际大数据产业技术创新高峰论坛暨大数据系统软件国家工程实验室第一次会议盛大开幕,大数据系统软件国家工程实验室作为大数据系统软件技术研发与工程化的国家级创新平台,将通过大数据系统软件技 ...

最新文章

  1. 配置Cesium编译环境
  2. 【论文阅读整理】TagFi: Locating Ultra-Low Power WiFi Tags Using Unmodified WiFi Infrastructure
  3. 算法练习day10——190328(根据指定值划分单链表、复制含有rand指针节点的链表、两个单链表相交)
  4. 经典面试题(8):关于逻辑运算符,下面代码运行的结果是什么?
  5. iOS关于通知传值Bool类型的注意点
  6. 5 月数据库排行:PgSQL 慢增长,MySQL冲击第一!
  7. 常见排序算法整理2(C++实现)
  8. ppt设置外观样式_PPT中设置视频外观样式的方法
  9. MATPOWER快速上手及应用实例
  10. Java动态代理(dynamic proxy)
  11. Excel基础(13)日期函数
  12. xshell上传文件到linux很慢,XShell上传文件到Linux服务器上
  13. ADS(Advanced Design system)使用调谐分析(Tuning)进行电路优化
  14. abab的四字成语_abab的四字词语成语
  15. sql server在指定模式下创建表
  16. luogu P5064 [Ynoi2014] 等这场战争结束之后
  17. UDP打洞原理与N2N内网穿透
  18. 一加5android,不输Lineage OS,一加5刷入Paranoid Android体验
  19. 一份完整详细的新媒体营销推广策划方案 (微信微博等)
  20. Docker 配置阿里云加速

热门文章

  1. 自动化软件测试 -- 测试用例
  2. Hexo yilia 主题添加相册功能
  3. PHP ktv点歌管理系统mysql数据库web结构apache计算机软件工程网页wamp
  4. 如何使用diskpart命令工具来对硬盘或者U盘设定写保护
  5. java 闭区间随机数_Java中在特定区间产生随机数
  6. 5.1 Go语言中的指针
  7. python运行时很卡-Python代码运行速度慢?这五种方法很管用
  8. 怎么把动态图从python弄下来_发一只我一直在用的爬虫——爬取“解闷”动态图的爬虫,绅士不妨留步^=^...
  9. 安装数据库显示这个产品的配置数据已经损坏问题解决
  10. 天池工业蒸汽量预测-模型调参