多任务音频播放与实时频谱变换的实现
2017-09-25张亚平
杨 博, 张亚平, 丁 瑞
(首都师范大学 信息工程学院, 北京 100048)
通信作者:张亚平(1968—),女,湖南湘潭,硕士,工程师,主要研究方向为计算机应用、嵌入式系统开发.
多任务音频播放与实时频谱变换的实现
杨 博, 张亚平, 丁 瑞
(首都师范大学 信息工程学院, 北京 100048)
使用ARM嵌入式开发实验箱UPTECH2410、μC/OS-II多任务调度操作系统和图象显示库系统,设计了一款能在彩色LCD屏上同步显示歌词、音频频谱信息、歌曲点播选单和对应曲目主题画面的可视化MP3播放器。给出了系统工作流程,讨论了该系统是如何使用双缓冲机制播放和处理音频以保证音频播放的实时性和无缝性,提出一种针对歌曲音频的高效频谱变换方法,并对常见的WAV音乐格式进行了分析。
多任务音乐播放; 频谱变换; μC/OS-II
MP3播放器种类繁多,按照操作系统属性可以分为:
(1) 基于通用操作系统,如Window、Linux、安卓等;
(2) 基于嵌入式实时操作系统,如μC/OS、TinyOS、RTOS、剪裁修改的Linux等,很多高档专用MP3播放器使用嵌入式实时操作系统;
(3) 无操作系统,使用简单的前后台或者轮询程序控制,属于廉价低端MP3设备[1-3]。
为满足教学、科研的需要,笔者设计了基于μC/OS-II操作系统的可视化MP3播放器。该播放器能够完成歌曲播放、歌曲频谱信息显示、歌词同步显示和歌曲配图显示,不仅挖掘和扩展了实验箱的功能,而且也丰富了μCOS-II实验教学实例,可供开发探究性实验和综合创新性实验项目参考。
1 项目环境和设计目标
1.1 硬件环境
设计多任务音频播放与实时频谱变换MP3播放器使用的是北京博创公司ARM嵌入式开发实验箱UPTECH2410,其核心微处理器为ARM920T,板载UDA1341TS音频解码芯片、Flash存储器、SRAM、LCD液晶屏、数字键盘、耳机接口等其他外设。
微处理器内集成DMA、标准音频通信IIS接口,可以在非CPU干预的情况下独立定时地向音频芯片传输数据,其优点是提高CPU工作效率,使数据传送周期恒定。音频播放相关硬件关系如图1所示。
图1 实验箱音频播放相关硬件关系图
1.2 软件环境
基于ARM ADS1.2软件集成开发环境,使用C语言作为开发语言,使用开源操作系统μC/OS-II构建MP3播放器。μC/OS-II有如下特点[4-6]:
(1) 源代码公开,可移植;
(2) 可裁剪,易于实现代码最小化;
(3) 多任务,可管理多达64个任务,但不支持时间片轮转调度;
(4) 抢占式的实时内核;
(5) 精确延时。
此外,μC/OS-II可以提供多种系统服务,具有中断管理和可靠性、稳定性高等特点。该实验箱为μC/OS-II配备了图象显示库,可以直接调用这些函数在LCD上完成所需控件的显示。
1.3 项目设计目标
基于UPTECH2410实验平台上的已有硬件设备,该项目能够实现如下功能:
(1) 支持Windows的标准WAV格式文件播放;
(2) 列表显示Flash存储器上所有WAV曲目;
(3) 随歌曲播放同步显示歌词;
(4) 随歌曲播放同步显示声调频谱信息;
(5) 可为每首歌曲显示设定的背景图片;
(6) 可在任意时间播放、暂停或切换歌曲。
2 原理和方法
2.1 音频重建和播放
数字音频文件是由麦克风采集的模拟信号经防混叠低通滤波器后采样、量化得到的离散数字信号组成的。采样时要满足采样定理,以高于原信号最高频率2倍以上的速率进行采样(采样频率常用22.05 kHz、44.1 kHz或更高)。量化等级水平称为量化深度或采样深度,一般以bit为单位表示(常用16 bit)。
为了无失真或最小失真地将声音信号还原,需要将离散数字信号按照不低于采样深度的转换水平,并且按照与采样频率相同的转换速率经DA转换器输出。输出信号再经低通滤波、放大后方可得到重建信号。
音频文件播放必须满足:
(1) 播放频率(重建频率)与采样频率一致,否则会发生频率畸变;
(2) 播放转换等级(DA的转换精度水平)大于等于量化深度,否则会发生声音失真、使音乐质量降低。
本实验平台上的UDA1341TS音频播放芯片内置有16位深度的双声道DA转换器以及滤波器、放大器等相关电路[7],保证了一般应用情况下所需的量化等级。该器件有独立的时钟和定时器,能够支持包含经典的44.1 kHz、22.05 kHz在内的多种采样频率计数,让转换器可以按照采样频率进行转换播放。通过分析可知,UDA1341TS满足音频文件不失真播放的要求。
UDA1341TS含有实用标准音频播放IIS接口,方便与其他设备相连;也可以在定时器超时的时候产生中断,自动向DMA申请数据,极大地减轻了CPU的负担,也保证音频播放的频率准确性和实时性。
2.2 WAV音频文件
WAV是微软公司开发的一种无损声音文件格式,它符合RIFF(resource interchange file format)文件规范,用于保存Windows平台的音频信息资源,支持多种音频数字、采样频率和声道数量[8]。标准格式化的WAV文件和CD格式一样,也是44.1 kHz的采样频率,16位量化数字。
量化位数分为8位、16位、24位3种,声道有单声道和双声道(立体声),采样速率有11.025 kHz、22.05 kHz和44.1 kHz。本项目采用的是16 bit量化深度、22.05 kHz采样频率、双声道的WAV格式。
WAV文件由文件头和数据块组成,其中文件头记录WAV文件的属性和控制等相关信息,数据块顺序记录音频的离散数字信号。整个文件采用小端模式(little-endian)字节顺序,标志符不是字符串而是单独的符号。WAV头文件格式如表1所示。
表1(续)
数据块结构如表2所示。
表2 WAV文件数据块结构
在音频数据中,每个采样数据按照时间顺序依次排列。每个采样(4字节)包含左声道(低2字节)和右声道(高2字节)数据。每个声道数据由16 bit双字节构成,低8 bit在低字节,高8 bit在高字节。
本项目会读取头文件信息并判断该文件是否为符合要求的音频文件,如果符合要求则按照数据格式提取数据并播放。
2.3 基于双缓冲的音频无缝分段播放
2.3.1 系统瓶颈导致的问题
待播放的音频文件数据存储在Flash中,播放时需要先将文件从Flash写入内存,再由DMA单元从内存中读取数据并通过IIS接口送入UDA1341芯片。
对硬件平台多次测试后得知:将时长10 s的音频数据(约861 KB)从Flash读入内存大概需要2 s;为保证播放速率,DMA将数据从内存传到UDA1341芯片需10 s。
可见,DMA的传送速度慢于Flash的读入速度,而Flash的读入延迟也是相当多的。若Flash读入和DMA传送都使用同一内存,会导致Flash覆盖DMA还没有传输完的数据,这样音乐听起来就完全不对了。所以将Flash读出的数据写入该内存块和DMA读取同一内存块不能同时进行,即避免访写冲突。若DMA读取和Flash写入交替进行,那么音乐每播放10 s中间会产生2 s的停顿。不管如何缩短缓冲区的长度以至于人耳无法察觉到停顿的存在,停顿引起的20%的延迟都是不可忽略的。延迟会引起播放时间的拉长,歌曲内容与歌词失去同步,这些是不容许的。
2.3.2 双缓冲解决方案
本文提出采用双缓冲区以避免Flash和DMA的访写冲突问题。其优点有:
(1) 无访写冲突,保证了数据的安全性;
(2) 无缝播放,DMA可连续读取各区的数据;
(3) 降低IO优先级,以缩短其他Flash任务的响应时间。
双缓冲机制的实现需要两个内存区域——缓冲区1与缓冲区2,每个区域均可存放10 s的音频数据。首先,CPU读取10 s的音频数据放入缓冲区1,然后启动DMA将缓存区1数据送到音频设备播放(此过程DMA以22.05 kHz的频率传输数据,且无需CPU干预),同时CPU将Flash上第二个10 s的音频数据读入缓存区2。当DMA传输完毕后,DMA播放缓冲区2的数据,CPU将Flash上第三个10 s的数据读入到缓冲区1中。如此交替循环,可提高系统的并行能力,实现音频的流畅无缝播放。
2.4 针对特定音调的DTFT频谱特征变换
常用的频谱变换方法是基于FFT的快速傅里叶变换[9],这种算法占用嵌入式设备大量的内存空间和大量的浮点运算,而且也增加了编程的复杂度;而用专用硬件进行频谱变换则会增加成本和设计的复杂度。
经过对要处理的MP3文件的分析,发现大部分音频会在某些特定频率点上重复出现,即所谓在音调上[10]。据此提出针对特定音调的DTFT(discrete-time Fourier transform)频谱变换方法,其优点是计算量更小、速度更快、计算空间需求小、编程简单,若技巧得当,可在无浮点运算下完成。
DTFT频谱变换的原理如下。
由采样序列f(nT)的DTFT公式:
(1)
ejθ=cosθ+jsinθ
(2)
得:
推出:
(3)
因此,可将音频序列x[k]与两个正交的余弦序列{cos(kωT),k=1,2,3…}与{sin(kωT),k=1,2,3…}相乘求和,再平方得到其在频率ω上的频谱强度。其中ω=2πf,f为特定音调对应的频率。本文选取了如表3所示的10个在音乐中普遍出现的音调,并给出了对应的频率。其中c1为中央C。
表3 常用的10个音调及其对应频率
将表3中的各音调频率代入余弦序列{cos(kωT),k=1,2,3…}与{sin(kωT),k=1,2,3…}中,可得10对周期性的序列。将这10对序列按照常数存放和使用,可极大提高运算速度。
将声音信号以0.5 s为一段不断地提取出来,并按照公式3与上述10对代表不同音调频率特性的余弦序列相乘求和,得到了10个音调对应的频谱强度X(1),X(2),…,X(10)。
由于有时某一点的强度会极大地超过其他点,并超过屏幕能够显示的强度上限,所以需要依照式(4)按其强度比进行均衡化。
(4)
将均衡化后的结果显示在屏幕上(见图2)。整个算法的流程如图3所示。
图2 显示在LCD屏幕上的频谱图
图3 基于特定音调的频谱提取流程
图4是为验证算法的有效性和可行性而在Matlab上做的仿真。横轴上1—10表示10个音调频率,纵轴从0到300表示音乐的时间,高度表示频谱强度。
图4 音调特征提取的Matlab仿真结果
3 项目的实现
(1) 总流程。系统启动后,首先初始化各类参数以及图形库、IIS、DMA、UDA1341TS等模块,随后创建频谱提取显示、歌词显示、音乐播放控制、主任务等4个任务,最后调用OS_Start启动各个任务的调度。
(2) 主任务。主任务是响应键盘的输入、处理外部事件、负责与上位机通信,负责其他各任务的相互协调。
(3) 频谱提取显示。任务是每隔0.5 s将下一段(长度也为0.5 s)的音频数据按照2.4节提到的DTFT频谱特征变换方法进行处理,并显示在屏幕上。
(4) 歌词显示任务。该任务是对LRC歌词文件的读取和处理(见表4),一个 LRC 文件包含2部分:歌词和时间标签。该标签指示出每一句歌词所出现的时间点。在任务中不断调用sscanf(( const char *) File_Read_Buffer , “[%d:%d.%d]”, &SubTitle_Info.NextMinute, &SubTitle_Info.NextSecond, &SubTitle_Info.Next10Ms),读取相邻两行歌词的时间,得出两句歌词之间的时间差。当第一句歌词显示后,调用延时函数OSTimeDly()进行等待对应的时间差,然后显示第二句歌词,如此往复实现了歌词的同步。
表4 LRC文件格式实例
(5) 音乐播放。上文2.3节中说明了本文采用双缓冲方式,并结合DMA、IIS、UDA1341等硬件模块完成音乐的流畅无缝分块播放。因此,音乐播放的程序主要包括两部分,即底层硬件相关程序和上层播放控制程序。
4 播放控制程序
4.1 与硬件相关的主要函数
(1) Audio_Init():用于初始化所需的IIS、DMA、UDA1341,设定播放速率和双声道传输模式;
(2) Audio_Stop():停止DMA传输和UDA1341的播放功能;
(3) Audio_Play():启动DMA传输与UDA1341的播放功能;
(4) Audio_SetBuffer(char* SoundBuffer,U32 DataCount):设定DMA将要传输数据缓冲区的起始地址及长度。传输的方式采用原地址递增,而目的地址固定0X55000010 (目的地址为IIS外设接口地址)。
4.2 上层播放控制程序
图5示意了本播放器的工作流程和双缓冲工作机制(不含频谱计算和字幕显示)。频谱计算在读取完音频数据后就开始了,每隔0.5 s为一个时间点进行计算,并在正确的时间将频谱信息、字幕信息显示在屏幕上。播放暂停和停止操作也没有绘入流程图,暂停、停止操作会中断播放任务线程,并记录当前的播放状态,以便恢复播放操作使用。
图5 播放控制流程
基于μC/OS-II操作系统的可视化MP3播放器最终能流畅播放出MP3歌曲并同步显示歌词、频谱信息,同时能够自由暂停、继续、开始、停止、切换歌曲,并
显示所有符合WAV格式的歌曲列表,运行结果如图6所示。
图6 MP3播放器运行界面
5 结语
通过音频频谱的提取和显示,声音文件流畅播出,可以充分了解嵌入式系统环境下软硬件是如何协同工作的,有利于提高对系统的分析能力和综合运用所学知识解决问题的能力。目前该MP3播放器只能播放合法的WAV文件,且必须满足22.05 kHz的采样频率、16 bit的采样深度和双声道这3个条件。为此,需要进一步研究,使该音乐播放器能够支持更多的音频格式和属性。
References)
[1] 宋志章,马丽,刘晓华.基于ARM的数字音频解码系统的设计与实现[J].科技通报,2012,28(6):161-162,165.
[2] 何敬银,王为.基于S3C2440的数字音频播放器设计[J].科技通报,2012,28(12):36-38,41.
[3] 蒋尚婷,金毅仁.数字音频压缩编码及音频播放器制作[J].电脑编程技巧与维护,2011(6):82-85,92.
[4] Labrosse J J.嵌入式实时操作系统uC/OS-III[M].宫辉,曾鸣,译.北京:北京航空航天大学出版社,2012.
[5] 杨铸,唐攀.深入浅出嵌入式底层软件开发[M].北京:北京航空航天大学出版社,2011.
[6] 王田苗.嵌入式系统设计与实例开发:基于ARM微处理器与uC/OS-II实时操作[M].北京:北京航空航天大学出版社,2007.
[7] 胡力刚,许伟明,焦阳.基于S3C2410A和UDA1341TS的嵌入式音频系统设计[J].计算机测量与控制,2009,17(2):2510-2512,2515.
[8] 王若钧,何杉.WAV文件格式分析与详解[J].数字技术与应用,2004(3):93-94.
[9] 陈后金,薛健,胡健.数字信号处理[M].北京:高等教育出版社,2004.
[10] 曹西征,刘春红,孙林.基于WAV文件的独奏乐曲信号中的乐谱识别[J].计算机应用,2009,29(3):768-770,788.
Realization of multi-task audio playback and real-time frequency spectrum conversion
Yang Bo, Zhang Yaping, Ding Rui
(College of Information Engineering, Capital Normal University, Beijing 100048, China)
By using the ARM embedded development box UPTECH2410 and the μC/OS-II multi-task scheduling and operating system, and the image display library system, a visual MP3 player is designed, which can synchronously display the lyrics, the audio frequency spectral information, the song request menu and the corresponding song theme pictures on the color LCD screen. The workflow of the whole system is presented, and how to use the double buffering mechanism to play and process the audio to ensure the real-time and seamless audio playback is discussed. A high efficient frequency spectral transform method for the song audio is proposed, and the common WAV musical formats are analyzed.
multi-task music playback; frequency spectral transform; μC/OS-II
TN912.3
: A
: 1002-4956(2017)09-0137-05
04—07H4long从下个地址开始到文件尾的总字节数08—0BH4char“WAVE”,WAV文件标志0C—0FH4char“fmt”,波形格式标志,最后一位空格10—13H4longfmt格式段长度,一般为10H14—15H2short格式种类(1表示数据为线性PCM编码)16—17H2short通道数,单声道为1,双声道为218—1BH4long采样频率(22050、44100等)
2017-04-26
杨博(1992—),男,北京,硕士研究生,主要研究方向为嵌入式和电子信息工程
E-mail:yangkkb@aliyun.com
E-mail:997715213@qq.com
10.16791/j.cnki.sjg.2017.09.034