matlab 音乐信号处理,MATLAB 的音频信号处理技术 | 学步园

声音数据输入输出函数:
可以方便地读写au和way文件,并可控制其中的位及频率。
wavread()和wavwriteO。
声音播放:
wavplay():播放wav声音文件。当然,也可以把处理后的
wav文件保存后再用其它工具播放。
wavrecordO:可以对处理后的wav文件进行录音。
PS:在日常生活中,我们通常听到的声音信号都属于复音类声带,其声音信号被不同的振幅与频率的波所组成。
在分析与处理音频信号的过程中,首先要获取声音信号。 MATLAB提供的数据采集工具箱包含了一系列的命令与函数;通过调用这些预定义的指令与功能模块,在实际应用中可以直接控制声卡完成数据采集。
不仅能够通过内置的录音机程序驱动声卡进行语音采集,并且能够将捕获到的音频信息以WAV格式存储,并被MATLAB相关的函数直接读取
本文采用WAV格式音频信号作为分析处理的对象 通过MATLAB对音频信号进行基本处理的主要步骤包括 在MATLAB环境中 首先利用 wavread 函数将WAV音频文件解析为 MATLAB 中的列向量变量
借助MATLAB的强大运算能力对数据进行分析与处理,在时域与频域上分别进行了时域分析、频域分析以及相关的数字滤波等技术;通过这些方法还可实现信号合成与变换,并通过识别与增强来优化结果;若处理后的数据为音频类型,则可通过 wavwrite 函数将其转换为 WAV 格式的文件文件或使用 sound 命令播放
Waveplay及其相关函数直接进行音频信号的播放。下面将分别介绍MATLAB在音量标准化、声道分离合并与组合、数字滤波以及相关方面的应用。
据转换等音频信号处理方面的技术实现
在录音过程中需要对声音的电平进行量化处理,在最佳情况下最大的电平应对应于最高的量化位数然而,在实际操作中很难完全实现这一点常会遇到声音过弱的问题使用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文件
试听可知标准化处理后音量稍大
立体声音频信号或双通道音频信号通常包含左、右两个独立的声波通道。采用 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'); % 实现两路声道组合
可以试听声道分离 合并与组合的效果 也可对各文件大小进行比较
数字滤波主要用于广泛应用于音频领域的信号处理。具体而言,通常先利用FDATool工具根据技术指标设计一个数字滤波器[2],接着使用Filter或Filter2函数完成滤波处理。
调用Filter函数时的形式为Y = filter(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]; % 分子系数
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所示 由图可知 滤波对波形影响不大
但对高频有较大衰减 试听会感觉到处理后的声音比较沉闷

数据转换主要涉及调整音频文件中的采样频率和量化精度;其基本原理在于通过矩阵插值或抽取技术来进行变量转换;当进行数据抽取时,在变量转换之前需施加滤波处理以确保符合采样定理;一旦完成变量变换,则可调用Wavwrite函数来重新设定量化位数和采样频率从而完成数据转换;在执行数据转换的过程中需特别关注目标采样率与原始信号之间的关系以及插值或抽取系数的影响;此外MATLAB提供了decimate函数用于实现这些插值或抽取操作
,interp和resample
这里采用 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(' 原信号频谱图'); %加标题
