SpringShoots开源音频处理框架养成记第一个进程和测试代码运行时间

Posted NiceBT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringShoots开源音频处理框架养成记第一个进程和测试代码运行时间相关的知识,希望对你有一定的参考价值。

1. 引言

公司项目需要将音频算法移植到Linux嵌入式平台,可愁坏了我这个Linux菜鸟。亏得这个Linux嵌入式平台有一套成熟的音频处理框架(MTK的PowerAQ),我们才能在三个月内搞定算法移植并成功产品化。

虽说PowerAQ框架能够帮助开发人员快速移植算法,但其本身不开源的特性导致算法移植工作的成果难以迁移到别的平台(如高通、cypress或RK等众),不利于技术成果的模块化和通用性。因此,我萌生了一个念头,即开发一个基于嵌入式Linux平台的开源音频处理框架。后续项目评估和预研新平台时,可以将搭载着算法的音频处理框架整体迁移到芯片平台上,既可以积累和复用算法移植的成果,又能够让框架的可适用性不断提升,达到一箭双雕的效果。

古人云不积跬步无以至千里,在蓦然回首前,必有一段衣带渐宽的路要走。让我们今天跨出这简单的第一步,即如何创建第一个进程以运行简单的算法,然后获取一些算法运行过程中产生的信息。

2. 获取项目源码

SpringShoots开源项目的git仓库路径如下:
https://gitee.com/ryoma_csr867x/SpringShoots.git

代码克隆到本地:

ryoma2@ubuntu:/code/_SpringShoots$ git init
Initialized empty Git repository in /code/_SpringShoots/.git/
ryoma2@ubuntu:/code/_SpringShoots$ git clone https://gitee.com/ryoma_csr867x/SpringShoots.git
Cloning into 'SpringShoots'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 13 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (13/13), done.
Checking connectivity... done.

3. 编译源码

首先编译源码生成可执行文件main。

ryoma2@ubuntu:/code/_SpringShoots/SpringShoots$ make
gcc -o main.o -c main.c
gcc -o main main.o -lm

make命令会自动搜索当前文件夹下的makefile文件。

all: 
	gcc -o main.o -c main.c
	gcc -o main main.o -lm

上述第一步是通过.c文件预编译生成.o文件,上述第二步通过.o文件链接linux的math库生成可执行文件,这里要注意-lm需要写在.o文件的后面。
gcc -lm的含义可参考如下引用:

引用自:https://blog.csdn.net/u013176681/article/details/18272879

使用math.h中声明的库函数还有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。本书用到的大部分库函数(例如printf)位于libc.so库文件中,使用libc.so中的库函数在编译时不需要加-lc选项,当然加了也不算错,因为这个选项是gcc的默认选项。

C标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型 声明和宏定义。要在一个平台上支持C语言,不仅要实现C编译器,还要实现C标准库,这样的实现才算符合C标准。不符合C标准的实现也是存在的,例如很多单 片机的C语言开发工具中只有C编译器而没有完整的C标准库。

在Linux平台上最广泛使用的C函数库是glibc,其中包括C标准库的实现。几乎所有C程序都要调用glibc的库函数,所以glibc是Linux平台C程序运行的基础。glibc提供一组头文件和一组库文件,最基本、最常用的C标准库函数和系统函数在libc.so库文件中,几乎所有C程序的运行都依赖于libc.so有些做数学计算的C程序依赖于libm.so以后我们还会看到多线程的C程序依赖于libpthread.so。以后我说libc时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件。

glibc并不是Linux平台唯一的基础C函数库,也有人在开发别的C函数库,比如适用于嵌入式系统的uClibc。

4. 运行可执行文件

输入./main运行可执行文件:

ryoma2@ubuntu:/code/_SpringShoots/SpringShoots$ ./main
algorithm execution result:
> count             1000
> total(us)         28835
> average(us)       28.00
> max(us)           266
> min(us)           26

上述结果显示算法执行了1000次,总共花费了28835us,平均每次算法执行消耗28us,最长的一次运算消耗266us,最短消耗26us。

如何得到算法的计算时间呢?方法很简单,只需在算法执行前后调用gettimeofday()得到系统时间,再将2个时间相减,得到的差值就是算法运行消耗的时间。

void test(int *result, int cnt)

	int i;
	struct timeval tv_begin, tv_end;

	for (i=0; i<cnt; i++)
	
		gettimeofday(&tv_begin, NULL);
		algorithm();
		gettimeofday(&tv_end, NULL);
		result[i]=tv_end.tv_usec-tv_begin.tv_usec;
	

5. 总结

再回顾一下run脚本运行的log:

algorithm execution result:
> count             1000
> total(us)         28835
> average(us)       28.00
> max(us)           266
> min(us)           26

可见每次algorithm运算的平均计算时间是28us,但最长一次的执行时间有266us。按常理说每次运算的时间应该是相同的,为何会出现耗时偏长的情况呢?

各位有兴趣参与讨论的朋友可以用如下方式找到我:
微信:15715161220
邮箱:705829339@qq.com

问题的答案将在第二篇揭晓,敬请期待。

以上是关于SpringShoots开源音频处理框架养成记第一个进程和测试代码运行时间的主要内容,如果未能解决你的问题,请参考以下文章

Python | 边学边敲边记第四次:初识爬虫框架Scrapy

是否有开源音频流客户端或框架?

记第十七次CCF CSP认证

架构师养成记--15.Disruptor并发框架

音频信号处理的最佳开源项目? [关闭]

06. 音频