1、课程设计报告课程名称: 信号分析与处理 设计题目:基于 MATLAB 的音频信号处理 指导教师: 王 靖 系 别: 信息科学系专 业: 电子信息工程技术姓 名: 吴凯学 号: 11632135时 间: 2012 2013 学年第 二 学期南京人口学院信息科学系课程设计目的和要求:目的:1、数字信号处理是从 20 世纪 60 年代以来,随着信息科学和计算机学科的高速发展而迅速发展起来德尔一门新兴学科。数字信号处理是利用计算机成专用处理设备,以数值计算的方法对信号进行采集、变换、滤波、压缩、传输、识别等加工处理,借以达到提取信息和便于应用的目的。2、通过本次课程设计,能够增强我们对数字滤波的理解,
2、之前都是老师在课堂讲授理论知识,不能真正了解其原理,而现在能够将理论知识与实际相结合起来,让我们参与整个音频信号的处理,能够很好地让我们利用 MATLAB 强大的运算能力来提高实际问题的处理能力,这也为我们提升自己的专业能力打下基础。要求:1、进一步巩固和加深所学的理论知识,提高综合运用所学知识,独立设计程序的能力。2、熟悉应用 MATLAB 软件的数字信号处理领域的计算机辅助分析与设计的基本方法。3、掌握数字滤波的特点和原理。4、能独立撰写设计报告,准确分析实验结果。课程设计正文:一、引言本次课程设计利用 MATLAB 工具对采集的声音信息进行数字滤波处理,MATLAB 是Math Work
3、s 公司推出的一种面向工程和科学计算的交互式计算软件。它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程实用软件。本文介绍了用 MATLAB 处理音频信号的基本流程,并以实例形式列出了常用音频处理技术实现程序。二、MATLAB 处理音频信号的流程分析和处理音频信号,首先要对声音信号进行采集,MATLAB 数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集1。Windows 自带的录音机程序也可驱动声卡来采集语音信号,并能保存为 WAV 格式文件,供MATLAB 相关函数直接读取、写入或
4、播放。本文以 WAV 格式音频信号作为分析处理的输入数据,用 MATLAB 处理音频信号的基本流程是:先将 WAV 格式音频信号经 wavread 函数转换成 MATLAB 列数组变量;再用 MATLAB 强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤波、信号合成、信号变换、识别和增强等等;处理后的数据如是音频数据,则可用 wavwrite 转换成 WAV 格式文件或用 sound、wavplay 等函数直接回放。下面分别介绍 MATLAB 在音量标准化、声道分离合并与组合、数字滤波、数据转换等音频信号处理方面的技术实现具体数字滤波设计流程图如下图所示:信号处理语音采集 量化
5、声道处理 滤波器设计 数据转换 效果显示1、音频标准化利用 Win7 本身自带的录音软件对歌曲 Every moment of my life 进行一段音频的采集,获得的 wma 格式的音频进行格式转换为 wav 格式,并保存到当前 MATLAB 指定的目录下,录制声音过程中需对声音电平进行量化处理,最理想的量化是最大电平对应最高量化比特,但实际却很难做到,常有音轻问题。利用 MATLAB 很容易实现音量标准化,即最大电平对应最高量化比特。基本步骤是:先用 wavread 函数将 WAV 文件转换成列数组变量;再求出数组变量的极值并对所有元素作归一化处理;最后用 wavwrite 函数还原成音
6、量标准化的 WAV 文件。具体程序实现如下clear; close all; clc; Y,FS,NBITS=wavread(XPexit.WAV); % 将 WAV 文件转换成变量FS, NBITS % 显示采样频率和量化比特 Ym=max(max(max(Y),max(abs(min(Y); % 找出双声道极值 X=Y/Ym; % 归一化处理 wavwrite(X,FS,NBITS,XPquit.wav); % 将变量转换成 WAV 文件通过上面程序的实现,将音频标准化并保存为 Every moment.wav,试听生成的音频与原始文件进行一个对比,很明显的生成的文件音量高于原始文件。2、
7、声道分离合并和组合在经过标准化过后生成的 Every moment.wav 基础之上再对音频进行声道分离合并和组合,具体的程序如下所示;clear; close all; clc; x,FS,NBITS=wavread(XPquit.WAV); % 将 WAV 文件转换成变量 x1=x(:,1); % 抽取第 1 声道 x2=x(:,2); % 抽取第 2 声道 wavwrite(x1,FS,NBITS,XPquit1.WAV); % 实现 1 声道分离 wavwrite(x2,FS,NBITS,XPquit2.WAV); % 实现 2 声道分离 %如果合并位置不对前面补 0 -声道长度不对后
8、面补 0 x12=x1+x2; % 两路单声道列向量矩阵变量合并 x12m=max(max(x12),abs(min(x12), % 找出极值 y12=x12./x12m; % 归一化处理 wavwrite(y12,FS,NBITS,XPquit12.WAV); % 实现两路声道合并 %如果组合位置不对前面补 0 -声道长度不对后面补 0 x3=x1,x2; % 两路单声道变量组合 wavwrite(x3,FS,NBITS,XPquit3.WAV); % 实现两路声道组合这时你可看到文件夹下又多生成了三个文件,我们分别进行试听比较第一声道,第二声道和两路声道组合。3、数字滤波数字滤波是常用的音
9、频处理技术。可根据技术指标,设计一个数字滤波器2,再用Filter 或 Filter2 函数即可实现滤波处理。调用的 Filter 函数格式是:Y = filte (B,A,X) 。其中,B 和 A 是滤波器传输函数的分子和分母系数,X 是输入变量,Y 是实现滤波后的输出变量。如果处理立体声音频信号,可分开处理,但用 FIR 滤波器时调用 Filter2 函数更方便。对 Every moment12.wav 进行信号分析,具体实现程序如下所示:clear; close all; clc; X,FS,NBITS=wavread(XPquit12.WAV); % 将 WAV 文件转换成变量 %利用
10、 FDATool 设计一个 LowpassButterworth 滤波器 %指标 FS=22050Hz, Fp=1000Hz, Ap=1dB, Fs=3000Hz, As=20dB B =0.0062,0.0187,0.0187,0.0062; % 分子系数 A =1,-2.1706,1.6517,-0.4312; % 分母系数 Y=filter(B,A,X); % 实现数字滤波 t=(0:length(X)-1)/FS; % 计算数据时刻 subplot(2,2,1);plot(t,X); % 绘制原波形图 title( 原信号波形图); % 加标题 subplot(2,2,3);plot(
11、t,Y); % 绘制滤波波形图 title( 滤波后波形图); % 加标题 xf=fft(X); % 作傅里叶变换求原频谱 yf=fft(Y); % 作傅里叶变换求滤波后频谱 fm=3000*length(xf)/FS; % 确定绘频谱图的上限频率 f=(0:fm)*FS/length(xf); % 确定绘频谱图的频率刻度 subplot(2,2,2);plot(f,abs(xf(1:length(f); % 绘制原波形频谱图 title(原信号频谱图); % 加标题 subplot(2,2,4);plot(f,abs(yf(1:length(f); % 绘制滤波后频谱图 title( 滤波后
12、信号频谱图); % 加标题 wavwrite(Y,FS,NBITS,XPquitFilter.WAV); % 写成 WAV 文件 对原始、滤波后的波形图和频谱图进行比较,生成的部分图形如下图 1 所示:原信号波形图和频谱图图 1 :图 1滤波后波形图和频谱图图 2:图 2 通过图形的展示,可以很明显的看出滤波后的波形图比原信号幅度有所减小,频谱图也显示的是同样的结果。4、数据交换数据转换是指改变音频格式中的采样频率或量化位数。转换原理是:先用矩阵插值或抽取技术实现变量变换,如果是抽取数据还需在变换前作滤波处理使之满足采样定理;变量变换完成后再用Wavwrite 函数重新定义量化位数和采样频率即
13、可实现数据转换。数据转换过程中,要注意采样频率与原始采样频率及插值或抽取系数的关系。MATLAB 实现插值或抽取的函数有 decimate、interp 和resample,具体应用可参考有关文献3 。具体实现程序如下所示:clear; close all; clc; x,FS,NBITS=wavread(XPquitFilter.WAV); % 将 WAV 文件转换成变量 N=length(x); % 计算数据点数 % 不是偶数点化成偶数点 if mod(N,2)=0; N=N; else x(N)=; N=N-1; end; % 原信号波形频谱分析 tx=(0:N-1)/FS; % 计算原
14、信号数据点时刻 subplot(3,2,1);plot(tx,x); % 绘制原信号波形 title( 原信号波形图); % 加标题 xf=fft(x); % 求原信号频谱 fx=(0:N/2)*FS/N; % 确定频谱图频率刻度 subplot(3,2,2);plot(fx,abs(xf(1:N/2+1); % 绘制原信号频谱 title( 原信号频谱图); % 加标题 % 实现数据抽取 k=1:N/2; % 确定抽取位置 y=x(2*k); % 实现抽取后的数据 M=length(y); % 计算抽取后数据点数 % 抽取数据在原采样频率 FS 下的波形频谱分析 ty=(0:M-1)/FS;
15、 % 计算数据点时刻 subplot(3,2,3);plot(ty,y); % 绘制信号波形图 title( 原采样率下新波形图); % 加标题 yf=fft(y); % 求频谱 fy=(0:M/2)*FS/M; % 确定频谱图频率刻度 subplot(3,2,4);plot(fy,abs(yf(1:M/2+1); % 绘制频谱图 title( 原采样率下新频谱图); % 加标题 % 抽取数据在 FS/2 采样频率下的波形频谱分析 tz=(0:M-1)/(FS/2); % 计算数据点时刻 subplot(3,2,5);plot(tz,y); % 绘制信号波形图 title( 新采样率下新波形图
16、); % 加标题 fz=(0:M/2)*(FS/2)/M; % 确定频谱图频率刻度 subplot(3,2,6);plot(fz,abs(yf(1:M/2+1); % 绘制频谱图 title( 新采样率下新频谱图); % 加标题 % 实现数据转换 wavwrite(y,FS/2,NBITS,XPquit16B.WAV); % 音频格式 PCM 11025Hz 16 位 wavwrite(y,FS/2,NBITS/2,XPquit8B.WAV); % 音频格式 PCM 11025Hz 8 位运行程序,在得到的图形窗口中,执行 Edit/Axes Properties命令,再把各分图下 X 标签中的Limits 设为 0、0.01 和 0、1000 ,得到 00.01 秒的波形和 01000Hz 的频谱如图 2 所示。由图可知,在满足采样定律条件下,实现数据抽取,在原采样率下波形变密、频谱变宽且幅度减半,但在新采样率下波形和频谱都很好。通过试听输出文件还可感受处理效果。实现的完整图 3课程设计总结及体会:在做的开始显得有些手足无措,因为平时学的不扎实,所以做得时候经常会和别人讨论, 跌跌撞撞得总算做出来了.觉得还是很自豪的. 以后再做类似的设计的时候这次的经验会给我很大的帮助.指导教师评语:课程设计成绩: 指导教师(签字)_年_月_日教研室意见:教研室主任(签字) _年_月_日