eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 1604|回复: 1
收起左侧

使用英特尔® 工具优化PhonoPaper

[复制链接]

签到天数: 16 天

连续签到: 1 天

[LV.4]偶尔看看III

52

主题

99

帖子

1063

e币
发表于 2016-3-14 14:28:14 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
PhonoPaper 既是一项技术,也是一款应用,可帮助您将音频转换成特殊格式的图片,也就是印在纸张或其他表面上的频谱图。 整个流程大致包含以下步骤: 将时长为 10 秒的音频(语音或歌曲等)转换成特殊格式的图片。 比如,打印出来的图片可以钉在墙上。 路过的人如果看到代码,可以启动手机上的 PhonoPaper 扫描器,将摄像头对准图像,就可即时听到其中的声音。 用户可完全参与到该流程中 — 回放的方向和速度取决于用户的手部动作(尽管也可采用自动模式)。 所有必要信息均保存在图像中,无需连接互联网。
实际应用中的 Phonopaper 示例:
Phonopaper 引起了音乐人、艺术家以及特殊试验爱好者的浓厚兴趣。 2014 年第 3 季度,在 Apps4All.ru 网站开展的英特尔开发人员评级项目中,该应用位居第一。 非常感谢英特尔为我提供基于 x86 的 Android* 平板电脑进行测试,该应用得到了显著的改进和优化。 下面将介绍如何优化 PhonoPaper。
视频捕捉
我首先连接了面向移动资源库集的英特尔® INDE 媒体,具体来说是借助 OpenGL ES* 表面实时(高清音质)捕捉视频的 GLCapture 类。 这一步为何必不可少? 首先,捕捉和运行 PhonoPaper 代码的过程非常精彩有趣,像弹奏一种不大寻常的乐器。 第二,如果声音在没进行区分的情况下转换(比如用地毯和猫),PhonoPaper 能够在自由模式下运行。 两种都可以很好地记录并上传至 YouTube*。
自由模式示例:任何摄像头图像都可视作声音频谱。
手绘的 PhonoPaper 代码

许多文章(12)都已介绍过 GLCapture 连接过程。 因此我只介绍几点开始前要注意的事项。
大家需使用 Android 4.3 或更高版本。 针对老旧的设备,我创建了一款交叉平台 MJPEG 录像机,其速度和画质会比硬件加速的 GLCapture (mp4 格式)差一些。 但它也可以帮助完成任务。
应用必须基于 OpenGL ES 2.0 构建。 我的应用之前使用的是版本 1.1,因此需要重新编写代码。 但迁移至 OpenGL ES 2.0 最终会提高工作效率,因为它支持手动调节着色器。
GLCapture 可以编写通过麦克风传来的声音。 这样有助于在视频中加入注释。 如果需要直接通过应用获取高品质声音,应该通过单独文件录制然后与 mp4 合成。 为此,大家可以使用带有 SubstituteAudioEffect 效果(来自面向移动集的媒体)的 MediaComposer。 另外一种方法是录制成 WAV 格式,将 WAV 格式编码成 AAC,然后使用 mp4parser 资源库将 AAC 追踪添加至 mp4 文件。
由于 PhonoPaper 使用 Pixilang 编程语言编写而成,其视频捕­捉功能未来可用于其他基于 pixilang 的应用(PixiTracker、PixiVisor、Nature - Oscillator、Virtual ANS)。最重要的是,它将供所有使用 Pixilang 的开发人员使用。 同时,使用过程非常简单(只有几个选项:开始捕捉、停止,和保存)。
Pixilang 是一种开放式交叉平台编程语言,经过定制,可用于声音和图形。 语言语法非常简单且融合了 BASIC 和 C,加上其具备的其他特性(能够在没有函数和用于保存数据的通用容器的情况下编写代码),大大降低了进入门槛。
英特尔® C++ 编译器和优化
下一步是使用英特尔® C 编译器汇编 x86 Android 版本的 PhonoPaper,并与 GCC 4.8 进行结果对比。 我当时使用的是老版本 Debian Linux*。 因此,第一个问题是找到合适的英特尔 C++ 编译器版本 幸运的是,我们找到了适合的安装包 — 英特尔® System Studio 2015。 尽管在安装过程中遇到了告警,但一切进展顺利,首次汇编成功完成。

带有以下关键词的编译工作: -xATOM_SSSE3 -ipo -fomit-frame-pointer -fstrict-aliasing -finline-limit=300 -ffunction-sections -restrict. 为了测试 Pixilang 虚拟机(所有应用的基础)的性能,我们编写了小型测试,大家可通过本档案 (zip) 查看资源和测试结果。 结果,在没做任何准备的情况下,部分代码片段的速度提高了 5 倍! 这个结果非常令人激动!

在 PhonoPaper 中,大部分负载都用于频谱合成器函数(table-wave,非 FFT) – wavetable_generator ()。 为此,我们编写了一个通过随机频谱在 4 秒内渲染音频流的测试。 测试结束时出现了最高抽样频率。 遗憾的是,英特尔 C 编译器的表现不尽如人意: 105 kHz(相比于 GCC 的 100 kHz)。 在编译过程中添加 -qopt-report=2 关键词后,报告显示了如下消息:
循环未进行矢量化:矢量相关性阻止了矢量化。
由于输入数据指示器可以指向重叠内存区,因此函数内的主循环无法进行矢量化:
int* amp = (int*)amp_cont->data;int* amp_delta = (int*)amp_delta_cont->data;

查看代码后我发现,此时交叉已消除,我只需将这点告知编译器。 C/C++ 中有一个特殊的关键词:restrict,表示声明的指示器指向了某个内存块,但这一点其他指示器并没有指向。 因此,我将上述代码替换成:
int* restrict amp = (int*)amp_cont->data; int* restrict amp_delta = (int*)amp_delta_cont->data;

然后我对应用进行了汇编,发现循环已成功矢量化。 我还对流程作了其他调整(可以消除部分位操作),现在结果变成了 190 kHz。 算上这些调整,相比于 GCC 的 130 kHz,性能提升了 1.46 倍!
未来计划?
如上所示,我们取得了令人满意的结果。 PhonoPaper 提高了运行速度(主要得益于英特尔 C++ 编译器),并扩展了视频捕捉功能。 此外,下次 Pixilang 3.6 更新后,视频录制可通过几个简单函数呈现。
此次优化还会对录制、打印和语音代码回放等特性提供帮助。
PhonoPaper 拥有无限的探索潜力!
关于作者
Alexander Zolotov 是一名软件开发人员、demoscener、作曲人兼音响与图形设计师。 他创办了 WarmPlace.ru 网站, 并开发了多款试听应用: SunVox(模块化合成器与跟踪器)、Virtual ANS、PhonoPaper、PixiTracker 和 Pixilang 编程语言。

点评

上海***,足不出户就能体验高品味享受,我们全天候准备为您服务!使您全身活力再现,把轻松`舒适`和快乐带给您!官网taosilespa.com电话/微信1:13370271997微信2:shanmo12580,务必同时加,qq:8067468   发表于 2016-8-24 23:34
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2017-9-22 06:56 , Processed in 0.618344 second(s), 39 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信