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. html5子页面无法弹出,弹出子页面,兼容ie
  2. Win Api 有名管道通信--扫雷辅助(四)
  3. Nginx-Lua重定向系列
  4. 使用validate.js实现表单数据验证
  5. C++ 学习之旅(4)——调试Debug
  6. Qt工作笔记-pro文件中QMAKE_POST_LINK的使用
  7. Docker常见问题总结(持续更新)
  8. 【Pytorch】谈谈我在PyTorch踩过的12坑
  9. 如何快速取消大量的合并单元格并向下填充数据
  10. 安卓Tasker自动转发短信到邮箱
  11. 摩根大通的企业级区块链解决方案—Quorum
  12. 谈谈c语言中delay的用法
  13. 如何使用select()函数
  14. 2019前端开发面试问题及答案整理
  15. 为什么是老虎呢?--《自由的老虎》
  16. MIT发布2018年10大突破性技术,3项与嵌入式工程师相关!
  17. 【Markdown笔记】设置字体颜色
  18. chromedriver下载与安装方法
  19. mysql:SQL语言包含4个部分
  20. CQJTU web学习之HTMLCSS学习总结

热门文章

  1. vue3项目实例 --- 个人博客demo
  2. LINUX驱动开发学习笔记--DDR3内存
  3. ELP界的苹果:太奇pad开创教育电子产品新时代
  4. 果然,B站也开始油腻了!
  5. app图标角标产品设计_新手如何设计App的图标Logo?
  6. linux vim命令编辑文件
  7. 【JS】时间与时间字符串之间转换
  8. vue中post请求
  9. 2016中国大数据大会成功举办 重磅发布年度大数据十大热词
  10. 仿nuxt.js,自动构建路由,释放你的双手?!