鼻塞上颚疼怎么回事:MATLAB的音频信号处理

来源:百度文库 编辑:中财网 时间:2024/04/19 15:15:58

摘要:MATLAB是一款数据分析和处理功能都非常强大的科技应用软件,利用它可以灵活方便地分析处理音频信号。文章介绍了用MATLAB软件处理音频信号的基本流程,并以实例形式列出了几款技术实现程序。
  关键词:MATLAB;数字信号处理;音频信号;脉冲编码调制;数字滤波

1 引言
  
  MATLAB是美国Math Works公司推出的一种面向工程和科学计算的交互式计算软件。它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程实用软件。本文介绍了用MATLAB处理音频信号的基本流程,并以实例形式列出了常用音频处理技术实现程序。
  
  2 MATLAB处理音频信号的流程
  
  分析和处理音频信号,首先要对声音信号进行采集,MATLAB 的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集[1]。Windows自带的录音机程序也可驱动声卡来采集语音信号,并能保存为WAV格式文件,供MATLAB相关函数直接读取、写入或播放。本文以WAV格式音频信号作为分析处理的输入数据,用MATLAB处理音频信号的基本流程是:先将WAV格式音频信号经wavread 函数转换成MATLAB列数组变量;再用MATLAB强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤波、信号合成、信号变换、识别和增强等等;处理后的数据如是音频数据,则可用wavwrite转换成WAV格式文件或用sound、wavplay等函数直接回放。下面分别介绍MATLAB在音量标准化、声道分离合并与组合、数字滤波、数据转换等音频信号处理方面的技术实现。
  
  3 音量标准化
  
  录制声音过程中需对声音电平进行量化处理,最理想的量化是最大电平对应最高量化比特,但实际却很难做到,常有音轻问题。利用MATLAB很容易实现音量标准化,即最大电平对应最高量化比特。基本步骤是:先用wavread函数将WAV文件转换成列数组变量;再求出数组变量的极值并对所有元素作归一化处理;最后用wavwrite函数还原成音量标准化的WAV文件。
  例1:现以微软自带的“Windows XP 关机.wav”音频信号为例,先将其复制另存到文件名为XPexit.wav的MATLAB当前目录中,再通过音量标准化处理后保存为XPquit.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文件
  试听可知标准化处理后音量稍大。
  
  4 声道分离合并与组合
  
  立体声或双声道音频信号有左右两个声道,利用MATLAB实现双声道分离、两路声道合并和两个单声道组合成一个双声道等效果,实际上是利用了MATLAB的矩阵抽取、矩阵相加和矩阵重组运算。
  例2:现以例1生成的XPquit.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 %声道长度不对后面补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');% 实现两路声道组合
  可以试听声道分离、合并与组合的效果,也可对各文件大小进行比较。
  
  5 数字滤波
  
  数字滤波是常用的音频处理技术。可根据技术指标,先利用FDATool工具,设计一个数字滤波器[2],再用Filter或Filter2函数即可实现滤波处理。调用的Filter函数格式是:Y = filte (B,A,X) 。其中,B和A是滤波器传输函数的分子和分母系数,X是输入变量,Y是实现滤波后的输出变量。如果处理立体声音频信号,可分开处理,但用FIR滤波器时调用Filter2函数更方便。
  例3:现以例2生成的XPquit12.wav为例,实现数字滤波的程序如下:
  clear; close all; clc;
  [X,FS,NBITS]=wavread('XPquit12.WAV');% 将WAV文件转换成变量
  %利用FDATool设计一个LowpassButterworth滤波器
  %指标FS=22050Hz Fp=1000Hz Ap=1dB Fs=3000Hz As=20dB
  B =[0.0062,0.0187,0.0187,0.0062];% 分子系数
  

 未安装
PDF浏览器用户请先下载安装
原版页码:1211,1212,1213
原版全文
  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(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('滤波后信号频谱图');% 加标题
  wavwrite(Y,FS,NBITS,'XPquitFilter.WAV');% 写成WAV文件
  程序运行结果如图1所示。由图可知,滤波对波形影响不大,但对高频有较大衰减。试听会感觉到处理后的声音比较沉闷。
  
  6 数据转换
  
  数据转换是指改变音频格式中的采样频率或量化位数。转换原理是:先用矩阵插值或抽取技术实现变量变换,如果是抽取数据还需在变换前作滤波处理使之满足采样定理;变量变换完成后再用Wavwrite函数重新定义量化位数和采样频率即可实现数据转换。数据转换过程中,要注意采样频率与原始采样频率及插值或抽取系数的关系。MATLAB实现插值或抽取的函数有decimate、interp和resample,具体应用可参考有关文献[3]。这果以2倍抽取为例,将例3中经过滤波后产生的XPquitFilter.WAV文件进行数据转换处理。具体程序如下:
  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;% 计算原信号数据点时刻
  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;% 计算数据点时刻
  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('新采样率下新波形图');% 加标题
  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,得到0—0.01秒的波形和0—1000Hz的频谱如图2所示。由图可知,在满足采样定律条件下,实现数据抽取,在原采样率下波形变密、频谱变宽且幅度减半,但在新采样率下波形和频谱都很好。通过试听输出文件还可感受处理效果。

7 结束语
  
  MATLAB提供了许多专用工具箱,灵活利用这些工具箱和函数,可以实现很多信号处理任务。同时,MATLAB还支持用户对其函数进行二次开发,以满足不同要求。在信号处理过程中,MATLAB兼顾了专用工具软件的简单性和计算机程序语言的灵活性,特别是处理效果的可视性和可感知,有利于理解信号处理的本质,有利于激发学习和研究兴趣,也有利于培养MATLAB软件的操作技能。
  
  参考文献:
  [1] 陈宇锋.基于声卡和MATLAB的语音信号采集和处理[J].中国现代教育装备,2006(5):49-51.
  [2] 张登奇.基于MATLAB的IIR数字滤波器设计[J].湖南理工学院学报,2007(3):26-29.
  [3] Sanjit K.Mitra.数字信号处理[M].孙洪等译.北京:电子工业出版社,2005.
  [4] 张志涌等.精通MATLAB6.5版[M].北京:北京航空航天
大学出版社,2003.